TypeError:pandas DataFrame中的'type'对象没有'__getitem__'属性

1 投票
1 回答
8701 浏览
提问于 2025-04-18 10:28

我在分析一支篮球队的逐场数据时,首先把一个csv文件读入了一个叫做DataFrame的对象里。

我想在保持DataFrame对象功能的同时,给这个对象添加一些新的属性。所以我写了一个叫做Basketball的类:

from data_math import *
import pandas as pd
class Basketball(pd.DataFrame):
    def __init__(self,*args,**kargs):
        pd.DataFrame.__init__(self,*args,**kargs)
        self.FGM = calculate_FGM(pd.DataFrame)
        self.FGA = calculate_FGA(pd.DateFrame)
        self.FGP = self.FGM / self.FGA
        self.M3  = calculate_3M(pd.DataFrame)
        self.A3  = calcualte_3A(pd.DataFrame)
        self.P3  = self.M3 / self.A3
        self.FTM = calcualte_FTM(pd.DataFrame)
        self.FTA = calculate_FTA(pd.DataFrame)
        self.FTP = self.FTM / self.FTA
    # self.P = score_calculate(pd.DataFrame)

我还写了另一个文件data_math.py,用来帮助计算我想要加入Basketball类的不同属性。

from pandas import DataFrame

def score_calculate(df):
    df_pt_scored = df[((df['etype']=='shot') & (df['result']=='made'))]
    df_ft_scored = df[((df['etype']=='free throw') & (df['result']=='made'))]
    return df_pt_scored['points'].sum()+len(df_ft_scored.index)

def calculate_FGM(df):
    cond_pt = (df['etype']=='shots') & (df['results']=='made')
    cond_ft = (df['etype']=='freethrow') & (df['results']=='made')
    return len(df[cond_pt].index)+len(df[cond_ft].index)

def calculate_FGA(df):
    shot_cond= df['etype']=='shot'
    free_throw_cond = df['etype']=='free throw'
    return len(df[shot_cond].index)+len(df[free_throw_cond].index)

def calculate_3M(df):
    cond_3M= (df['etype']=='shot')&(df['type']=='3pt')&(df['result']=='made')
    return len(df[cond_3M].index)

def calcualte_3A(df):
    cond_3A = (df['etype']=='shot')&(df['type']=='3pt')
    return len(df[cond_3A].index)

def calculate_FTM(df):
    cond_FTM =(df['etype']=='free throw') & (df['result']=='made')
    return len(df[cond_FTM].index)

def calcualte_FTA(df):
    cond_FTA =(df['etype']=='free throw')
    return len(df[cond_FTA].index)

最后,我从main.py启动我的程序,希望能得到正确的输出。然而在执行到这一行时:

team1= Basketball(tm1)

我收到了以下的错误信息:

 Traceback (most recent call last):
  File "/Users/luoyicheng/Developer/STAR-Research/data_analysis/source code/main.py", line 20, in <module>
    team1= Basketball(tm1)
  File "/Users/luoyicheng/Developer/STAR-Research/data_analysis/source code/Basketball.py", line 6, in __init__
    self.FGM = calculate_FGM(pd.DataFrame)
  File "/Users/luoyicheng/Developer/STAR-Research/data_analysis/source code/data_math.py", line 9, in calculate_FGM
    cond_pt = (df['etype']=='shots') & (df['results']=='made')
TypeError: 'type' object has no attribute '__getitem__'

我刚开始学Python编程,不太明白为什么会出现这个错误。根据我的理解,这个错误意味着我无法使用DataFrame的索引功能。不过,如果我在主函数中写类似的代码,就能得到我想要的输出。我也不太清楚怎么扩展现有的DataFrame类,以便在扩展team1对象时,仍然能访问DataFrame类中的方法,比如FGM、FGA等属性。

扩展这个类的想法是让我可以把任何DataFrame对象传入Basketball(),这样我就能得到一个带有扩展属性和方法的对象。我觉得我也不太理解init和self的用法。

请不要责怪我没有清楚地描述问题,因为我对面向对象编程的术语还不太熟悉。

非常感谢!

1 个回答

1

你正在传递每个函数 pd.DataFrame,它的类型是 type:

In [11]: type(pd.DataFrame)
Out[11]: type

所以才会出现这个异常信息。

你应该传递的是 self(它的类型是 DataFrame):

self.FGM = calculate_FGM(pd.DataFrame)
...

应该改成:

self.FGM = calculate_FGM(self)
...

撰写回答