Pandas создать новый столбец, который является средним значением из предыдущих строк - PullRequest
0 голосов
/ 16 января 2020

У меня есть рабочая версия того, что мне нужно сделать, используя groupby и apply, однако это действительно медленно, и поэтому я надеюсь, что новый подход даст более быстрые результаты.

Вот подмножество код, который я использовал до сих пор:

url = 'https://horse-data-abcd.s3.amazonaws.com/horse_track_code.csv'
temp_df = pd.read_csv(url)

def run_aggs(row):
    return row.shift().expanding() \
    .agg({'win': 'mean' })

df_feature = temp_df.groupby(['horse_aap_id', 'track_code_3']).apply(run_aggs)

columns = {
    'win': f'track_win_sr'
}
df_feature.rename(columns=columns, inplace=True)
temp_df = temp_df.join(df_feature)

Я хочу создать новый столбец track_win_sr, который является pd.mean (win) всех предыдущих строк индекса.

track_win_sr - среднее значение выигрышей всех предыдущих запусков лошадью на трассе, предшествующей ряду. sr средняя скорость удара.

Выходные данные выглядят следующим образом.

enter image description here

Проблема в том, что когда он применяется к большому набору данных, он очень медленный, я ищу оптимизацию (возможно, матричный подход), чтобы действительно ускорить процесс.

Вот ссылка на полный файл , чтобы используйте в приведенном выше коде для проверки скорости.

Любой совет помощи очень признателен.

С уважением,

Люк

1 Ответ

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

Вот что я придумаю:

Давайте загрузим его в DataFrame:

df = pd.read_csv('./horse_track_code_full.csv', parse_dates=[2])
df['track_code_3'] = df['track_code_3'].astype('category')

С DataFrame.expanding() вы сможете достичь того, что вы нужно.

grouped_expaning_mean = df.groupby(['horse_aap_id', 'track_code_3']).win.expanding().mean()

Теперь нам нужно «разгруппировать» вычисленные данные с помощью reset_index:

ungrouped_expanding_mean = grouped_expanding_mean.reset_index().

groupby(), сохраняя порядок из оригинала фрейм данных, поэтому нам нужно только установить соответствующий индекс и отсортировать его:

reindexed_win_means = ungrouped_expanding_mean.set_index('level_2').sort_index()

Все, что нужно сделать, это добавить его в столбец исходного фрейма данных

df['track_win_sr'] = reindexed_win_means.win
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...