Python Pandas - groupby() with apply() & rolling() 非常慢
Python Pandas - groupby() with apply() & rolling() very slow
首先,我对 Python & Pandas 还很陌生,所以请耐心等待,并尽可能简单地回复。此外,如果您能详细说明任何与我的示例中的代码不同的代码,或者为我提供可靠的参考资料,使其易于理解,我将不胜感激。
我有一个每月数据的数据框 (df1),包含 60 多个位置的 60 多列和 80 万行(并且还在不断增加)。我正在尝试根据位置许可证号 ('lic_num', int), 月 计算滚动平均值(3 个月、12 个月、年初至今等) ]('mo_yr', 日期)。我使用 apply() 成功地做到了这一点。问题是 apply() 感觉很慢,需要 10 分钟。这不是这个项目的主要问题,因为这不需要 运行 按需,但我想在我需要一个项目的情况下更有效地编写与此类似的代码执行得更快。这是数据框示例 (df1) 和我用来实现结果的代码
lic_num mo_yr ap aw fi
120700142 2013-03-01 228214.3 206273.53 61393.0
120700142 2013-04-01 256239.4 235296.96 64228.0
120700142 2013-05-01 247725.3 227165.09 74978.0
120700142 2013-06-01 229776.8 211765.55 64559.0
120700142 2013-07-01 229036.2 210963.06 58132.0
df1_col_list = df1.columns.tolist()
for col in df1_col_list[2:5]:
df1[col+'_3mo'] = df1.groupby('lic_num', as_index=False).apply(
lambda x: x.rolling(3, on='mo_yr', min_periods=1)[col].mean()).reset_index(level=0, drop=True)
lic_num mo_yr ap aw fi ap_3mo aw_3mo fi_3mo
120700142 2013-03-01 228214.3 206273.53 61393.0 228214.300000 206273.530000 61393.000000
120700142 2013-04-01 256239.4 235296.96 64228.0 242226.850000 220785.245000 62810.500000
120700142 2013-05-01 247725.3 227165.09 74978.0 244059.666667 222911.860000 66866.333333
120700142 2013-06-01 229776.8 211765.55 64559.0 244580.500000 224742.533333 67921.666667
120700142 2013-07-01 229036.2 210963.06 58132.0 235512.766667 216631.233333 65889.666667
如果apply
速度慢,我们尽量不用。以下是有关 apply
缓慢
原因的更多信息
s=df.groupby('lic_num', as_index=False).\
rolling(3, on='mo_yr', min_periods=1).\
mean().iloc[:,2:5].\
add_suffix('_3mo').reset_index(drop=True,level=0)
df=pd.concat([df,s],axis=1)
首先,我对 Python & Pandas 还很陌生,所以请耐心等待,并尽可能简单地回复。此外,如果您能详细说明任何与我的示例中的代码不同的代码,或者为我提供可靠的参考资料,使其易于理解,我将不胜感激。
我有一个每月数据的数据框 (df1),包含 60 多个位置的 60 多列和 80 万行(并且还在不断增加)。我正在尝试根据位置许可证号 ('lic_num', int), 月 计算滚动平均值(3 个月、12 个月、年初至今等) ]('mo_yr', 日期)。我使用 apply() 成功地做到了这一点。问题是 apply() 感觉很慢,需要 10 分钟。这不是这个项目的主要问题,因为这不需要 运行 按需,但我想在我需要一个项目的情况下更有效地编写与此类似的代码执行得更快。这是数据框示例 (df1) 和我用来实现结果的代码
lic_num mo_yr ap aw fi
120700142 2013-03-01 228214.3 206273.53 61393.0
120700142 2013-04-01 256239.4 235296.96 64228.0
120700142 2013-05-01 247725.3 227165.09 74978.0
120700142 2013-06-01 229776.8 211765.55 64559.0
120700142 2013-07-01 229036.2 210963.06 58132.0
df1_col_list = df1.columns.tolist()
for col in df1_col_list[2:5]:
df1[col+'_3mo'] = df1.groupby('lic_num', as_index=False).apply(
lambda x: x.rolling(3, on='mo_yr', min_periods=1)[col].mean()).reset_index(level=0, drop=True)
lic_num mo_yr ap aw fi ap_3mo aw_3mo fi_3mo
120700142 2013-03-01 228214.3 206273.53 61393.0 228214.300000 206273.530000 61393.000000
120700142 2013-04-01 256239.4 235296.96 64228.0 242226.850000 220785.245000 62810.500000
120700142 2013-05-01 247725.3 227165.09 74978.0 244059.666667 222911.860000 66866.333333
120700142 2013-06-01 229776.8 211765.55 64559.0 244580.500000 224742.533333 67921.666667
120700142 2013-07-01 229036.2 210963.06 58132.0 235512.766667 216631.233333 65889.666667
如果apply
速度慢,我们尽量不用。以下是有关 apply
缓慢
s=df.groupby('lic_num', as_index=False).\
rolling(3, on='mo_yr', min_periods=1).\
mean().iloc[:,2:5].\
add_suffix('_3mo').reset_index(drop=True,level=0)
df=pd.concat([df,s],axis=1)