我有一个大数据帧price_d
,如下所示:
+---------------------------------------------------+
| date monthEndDate stock volume logRet |
+---------------------------------------------------+
| 1990-01-01 1990-01-31 A 1 NA |
| 1990-01-02 1990-01-31 A 2 0.2 |
| 1990-02-01 1990-02-28 A 3 0.3 |
| 1990-02-02 1990-02-28 A 4 0.4 |
| ... ... |
| 1990-01-01 1990-01-31 B 1 NA |
| 1990-01-02 1990-01-31 B 2 0.08 |
| ... ... |
| 1990-02-01 1990-02-28 B 0 0.3 |
| 1990-02-02 1990-02-28 B 3 0.4 |
| ... ... |
+---------------------------------------------------+
这个数据帧的长度将以百万为单位,在monthEndDate
中有数百个不同的值,在stock
中有数千个不同的值
我使用三个自定义函数对volume和logRet进行了groupby聚合:
def varLogRet(_s):
return pd.Series({'varLogRet': np.var(_s.iloc[_s.to_numpy().nonzero()])})
def TotRet1M(_s):
return pd.Series({'TotRet1M': np.exp(np.sum(_s))-1})
def avgVolume(_s):
return pd.Series({'avgVolume': np.mean(_s.iloc[_s.to_numpy().nonzero()])})
return_m = price_d.groupby(['monthEndDate', 'tradingItemId']).agg({'logRet': [varLogRet, TotRet1M],
'volume': avgVolume})
groupby聚合需要几分钟的时间。在我的例子中,什么是加速这个过程的最佳方式,多处理可以工作吗
当有直接可用的内置和可能优化的函数时,您真的不需要}被忽略。只需单独计算所需的列,并在以后使用它们
.agg
^默认情况下,{基准测试:在我运行64位debian 10的普通Core i5-8250U(4C8T)笔记本电脑上完成800万行不到3秒。数据是您提供的简单重复
然后,您可以根据需要使用这些数据集。e、 g.使用
pd.concat([tot, var, vol], axis=1)
将它们组合在一起注意
tot
部分的溢出仅仅是因为重复增量。这不会发生在真实数据中相关问题 更多 >
编程相关推荐