Как сделать среднюю относительную ошибку для разных групп после группового? - PullRequest
0 голосов
/ 15 января 2020

Я делаю проект, который имеет дело с большим набором данных. Однако теперь я хотел сделать простое сравнение, и я не могу найти, как я могу это сделать. Проще говоря, моя проблема заключается в следующем. У меня есть 3 разных столбца и 6 строк:

A   B   C
g   1   2 
h   2   1
j   3   3
h   3   3
g   4   3
j   5   4

Первое, что я хотел сделать, это вычислить среднее значение B, медиану и режим с учетом группы A. Итак, я поступил так, и пока все хорошо:

aggregations_proc = {'C': { 'Mean_proc': 'mean', 'Median_proc': 'median',
                                  'Mode_proc': lambda x: x.mode()}}
groupy_proc = df.groupby('A', as_index=False).agg(aggregations_proc)

Однако теперь моей целью было просто создать новый столбец, представляющий вычисление средней относительной ошибки для каждой из строк между B и среднее значение C, учитывая, что среднее значение варьируется для каждой группы. Например, для первой строки относительная ошибка будет: (Среднее по группе g - значение 1-й строки B) / Среднее по группе g Однако для второй строки оно уже будет (Среднее по h группы - значение 2-й строки) / Среднее по группе h и по 3-й строке (среднее по группе j - значение B по третьему ряду) / среднее по группе j Но это относится к значительно большему набору данных.

Любая помощь будет очень кстати!

[ОБНОВЛЕНИЕ]

Вот мой новый код. Я думаю, что все работает, но я думаю, что есть некоторые ошибки в режиме. Ошибка: «Столбцы должны быть такой же длины, как ключ». Код следующий:

aggregations_diag = ('mean', 'median', lambda x: x.mode().iloc[0])
groupy_diag = df.groupby('A', as_index=False) 
['B'].agg(aggregations_diag) 

def absolute_error_diag(x): 
stats = ['mean', 'median', lambda x: x.mode().iloc[0]]
avg = groupy_diag.loc[x['A'], stats] 
return (avg - x['B'])

# Columns for the absolute error of each row
columns_names_diag = ['ae_diag_mean','ae_diag_median','ae_diag_mode']

df[columns_names_diag] = df.apply(absolute_error_diag, axis=1)

[MAE_diag_mean, MAE_diag_median, MAE_diag_mode] = 
df[columns_names_diag].sum()/len(df['ae_diag_mean'])

1 Ответ

0 голосов
/ 15 января 2020

Функция 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
...