定义自己的卷
我们可以创建一个带有窗口大小参数w和任何其他关键字参数的函数.我们使用它来构建一个新的DataFrame,我们将在其中调用groupby,同时通过kwargs传递关键字参数.
注意:我没有必要使用stride_tricks.as_strided,但它很简洁,在我看来是合适的.
from numpy.lib.stride_tricks import as_strided as stride
import pandas as pd
def roll(df, w, **kwargs):
v = df.values
d0, d1 = v.shape
s0, s1 = v.strides
a = stride(v, (d0 – (w – 1), w, d1), (s0, s0, s1))
rolled_df = pd.concat({
row: pd.DataFrame(values, columns=df.columns)
for row, values in zip(df.index, a)
return rolled_df.groupby(level=0, **kwargs)
roll(df, 2).mean()
Open High Low Close
0 133.0350 133.2975 132.8250 132.930
1 132.9325 133.1200 132.6750 132.745
2 132.7425 132.8875 132.6075 132.710
3 132.7075 132.7875 132.6000 132.720
我们也可以使用pandas.DataFrame.pipe方法来达到同样的效果:
df.pipe(roll, w=2).mean()
老答复
Panel已被弃用.请参阅上面的更新答案.
定义我们自己的卷
def roll(df, w, **kwargs):
roll_array = np.dstack([df.values[i:i+w, :] for i in range(len(df.index) – w + 1)]).T
panel = pd.Panel(roll_array,
items=df.index[w-1:],
major_axis=df.columns,
minor_axis=pd.Index(range(w), name=’roll’))
return panel.to_frame().unstack().T.groupby(level=0, **kwargs)
你应该能够:
roll(df, 2).apply(your_function)
使用均值
roll(df, 2).mean()
major Open High Low Close
1 133.0350 133.2975 132.8250 132.930
2 132.9325 133.1200 132.6750 132.745
3 132.7425 132.8875 132.6075 132.710
4 132.7075 132.7875 132.6000 132.720
f = lambda df: df.sum(1)
roll(df, 2, group_keys=False).apply(f)
roll
1 0 532.345
1 531.830
2 0 531.830
1 531.115
3 0 531.115
1 530.780
4 0 530.780
1 530.850
dtype: float64
Original: https://blog.csdn.net/weixin_33478314/article/details/113030717
Author: 眉浅穹跪
Title: pandas rolling方法_如何使用多列参数调用pandas.rolling.apply?
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/678197/
转载文章受原作者版权保护。转载请注明原作者出处!