Функция aggregations_proc
в вопросе не агрегирует по столбцу B
. Одним из способов агрегирования может быть:
aggregations_proc = ('mean', 'median', lambda x: x.mode().iloc[0])
groupy_proc = df.groupby('A', as_index=False)['B'].agg(aggregations_proc)
Несмотря на это, apply()
может использоваться в сочетании с df
и groupy_proc
. Функция для вычисления средней относительной ошибки может быть:
def mean_rel_error(x): # x is a row of df
avg = groupy_proc.loc[x['A'], 'mean'] # to find avg, locate 'mean' col in the row corresponding to the value of col A
return (avg - x['B']) / avg
Вызов функции будет выглядеть следующим образом:
df['mre'] = df.apply(mean_rel_error, axis=1)
Надеюсь, это поможет. Для большей эффективности вы могли бы рассмотреть возможность создания словаря только средних и изменить mean_rel_error()
функцию
ОБНОВЛЕНИЕ:
Вот код для вычисления средней абсолютной ошибки, которая работала для я:
l = [["g",1,5], ["h",2,2], ["j",3,9], ["g",3,5], ["j",4,3], ["h",5,1], ["g",11,1]]
df = pd.DataFrame(l, columns=["A", "B", "C"])
aggregations_proc = ('mean', 'median', lambda x: x.mode().iloc[0])
groupy_proc = df.groupby('A', as_index=False)['B'].agg(aggregations_proc)
groupy_proc.columns = ['mean', 'median', 'mode']
def mean_rel_error(x):
stats = ['mean', 'median', 'mode']
avg = groupy_proc.loc[x['A'], stats]
return (avg - x['B'])
columns_names_diag = ['ae_diag_mean','ae_diag_median','ae_diag_mode']
df[columns_names_diag] = df.apply(mean_rel_error, axis=1)
[MAE_diag_mean, MAE_diag_median, MAE_diag_mode] = df[columns_names_diag].sum()/len(df['ae_diag_mean'])
print(MAE_diag_mode)
-> -2.2857142857142856