Вычисление выборочной статистики с использованием функций NumPy с помощью Pandas DataFrame - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь создать функцию, которая возвращает среднее, срединное или стандартное отклонение всех столбцов в Pandas DataFrame, используя функции NumPy.

Это для школьного задания, поэтому нет никаких оснований для использования NumPy, кроме того, о чем меня просят.Я пытаюсь выяснить, как использовать функцию NumPy с Pandas DataFrame для этой проблемы.

Вот текст проблемы.

Кодовая ячейка нижесодержит функцию comp_sample_stat, которая принимает 2 параметра «df», которые содержат данные от dow jones для конкретной компании, и stat, который будет содержать 1 из 3 строк: «mean», «std» или «median».

Для этой задачи:

  • , если stat равен «mean», вернуть среднее значение столбцов данных, используя функцию среднего значения numpy
  • , если stat равно «median "вернуть медиану столбцов данных, используя медианную функцию numpy
  • , если stat равен" std ", вернуть стандартное значение столбцов данных, используя функцию std numpy

Вот функция, которую я написал.

def comp_sample_stat(df, stat='mean'):
'''
Computes a sample statistic for any dataframe passed in

Parameters
----------
df: Pandas dataframe 

Returns
-------
a pandas dataframe
'''
    df_mean = df.apply(np.mean(df))
    df_median = df.apply(np.median(df))
    df_std = df.apply(np.std(df))

    if stat is str('std'):
        return df_std
    elif stat is str('median'):
        return df_median
    else:
        return df_mean

df - это DataFrame, который был определен ранее в моем назначении следующим образом:

def read_data(file_path):
'''
Reads in a dataset using pandas.

Parameters
----------
file_path : string containing path to a file

Returns
-------
pandas dataframe with data read in from the file path
'''
    read_file = pd.read_csv(file_path)
    new_df = pd.DataFrame(read_file)
    return new_df    

df = read_data('data/dow_jones_index.data')

переменная df_AA также ранее было определено следующим образом:

def select_stock(df, symbol):
'''
Selects data only containing a particular stock symbol.

Parameters
----------
df: dataframe containing data from the dow jones index
stock: string containing the stock symbol to select

Returns
-------
dataframe containing a particular stock
'''
    stock = df[df.stock == symbol]
    return stock
df_AA = select_stock(df.copy(), 'AA')

Когда я вызываю функцию в блокноте Jupyter следующим образом:

comp_sample_stat(df_AA)

Я получаю следующую ошибку:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call 
last)
<ipython-input-17-a2bcbeedcc56> in <module>()
 22         return df_mean
 23 
---> 24 comp_sample_stat(df_AA)

<ipython-input-17-a2bcbeedcc56> in comp_sample_stat(df, stat)
 11     a pandas dataframe
 12     '''
---> 13     df_mean = df.apply(np.mean(df))
 14     df_median = df.apply(np.median(df))
 15     df_std = df.apply(np.std(df))

/opt/conda/lib/python3.6/site-packages/pandas/core/frame.py in 
apply(self, func, axis, broadcast, raw, reduce, result_type, args, 
**kwds)
6012                          args=args,
6013                          kwds=kwds)
-> 6014         return op.get_result()
6015 
6016     def applymap(self, func):

/opt/conda/lib/python3.6/site-packages/pandas/core/apply.py in 
get_result(self)
316                                       *self.args, **self.kwds)
317 
--> 318         return super(FrameRowApply, self).get_result()
319 
320     def apply_broadcast(self):

/opt/conda/lib/python3.6/site-packages/pandas/core/apply.py in 
get_result(self)
140             return self.apply_raw()
141 
--> 142         return self.apply_standard()
143 
144     def apply_empty_result(self):

/opt/conda/lib/python3.6/site-packages/pandas/core/apply.py in 
apply_standard(self)
246 
247         # compute the result using the series generator
--> 248         self.apply_series_generator()
249 
250         # wrap results

/opt/conda/lib/python3.6/site-packages/pandas/core/apply.py in 
apply_series_generator(self)
275             try:
276                 for i, v in enumerate(series_gen):
--> 277                     results[i] = self.f(v)
278                     keys.append(v.name)
279             except Exception as e:

TypeError: ("'Series' object is not callable", 'occurred at index 
quarter')

1 Ответ

0 голосов
/ 08 октября 2018

DataFrame.apply ожидает, что вы передадите ей функцию, а не фрейм данных.Так что вы должны передавать np.mean без аргументов.

То есть вы должны делать что-то вроде этого:

df_mean = df.apply(np.mean)

документы .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...