我有一个需要使用groupby并应用的功能的工作版本,但是它确实很慢,因此我希望一种新方法可以产生更快的结果。
这是到目前为止我一直在使用的代码的子集:
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
平均罢工率。
输出结果如下图所示。
我遇到的问题是,当将它应用于大型数据集时,它确实很慢,我正在寻找一种优化(也许是矩阵方法)来真正加快速度。
这里是link to the full file,可在上面的代码中用于测试速度。
任何有关帮助的建议都非常感谢。
亲切的问候,
卢克
答案 0 :(得分:0)
这就是我想出的:
让它加载到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