我正在尝试对 groupby 的结果使用 pct_change,以便计算许多不同项目的值(value)周期变化。
我的数据结构如下:
import numpy as np
arrays = [np.array([1,2,3,4,1,2,3,4]),np.array(['bar', 'bar', 'bar', 'bar', 'foo', 'foo', 'foo', 'foo'])]
s = pd.Series(np.array([100,101,102,103,200,201,202,203]), index=arrays)
s.name='values'
df = pd.DataFrame(s, index=arrays).sort_index()
df.index.names =['day','symbol']
我需要计算每天每个交易品种的百分比变化。当我运行这样的东西时:
df.groupby(level='symbol').values.diff()
我得到了正确的输出。但是当我运行这个时:
df.groupby(level='symbol').values.pct_change()
它返回错误的结果(将 bar 与 foo 进行比较)
我可以通过像这样包装在 lambda 中来获得我正在寻找的东西:
my_func = lambda x: x.pct_change()
df.groupby(level='symbol').values.apply(my_func)
或者这样做:
df.groupby(level='symbol').values.diff() / df.groupby(level='symbol').values.shift(1)
所以我真的只是想了解 pct_change 与其他 pandas 方法的行为差异的原因。
最佳答案
对于 pandas 0.24.2 上的多索引数据帧,此解决方案对我有用:
pd.__version__
'0.24.2'
df.groupby(level='symbol')['values'].pct_change()
day symbol
1 bar NaN
foo NaN
2 bar 0.010000
foo 0.005000
3 bar 0.009901
foo 0.004975
4 bar 0.009804
foo 0.004950
Name: values, dtype: float64
关于pandas - 将 pct_change 与多索引 groupby 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50915213/