我有一个数据集:
Open High Low Close
0 132.960 133.340 132.940 133.105
1 133.110 133.255 132.710 132.755
2 132.755 132.985 132.640 132.735
3 132.730 132.790 132.575 132.685
4 132.685 132.785 132.625 132.755
Run Code Online (Sandbox Code Playgroud)
我尝试对所有行使用rolling.apply函数,如下所示:
df['new_col']= df[['Open']].rolling(2).apply(AccumulativeSwingIndex(df['High'],df['Low'],df['Close']))
Run Code Online (Sandbox Code Playgroud)
要么
df['new_col']= df[['Open', 'High', 'Low', 'Close']].rolling(2).apply(AccumulativeSwingIndex)
Run Code Online (Sandbox Code Playgroud)
有谁能够帮我?
piR*_*red 12
定义我们自己的 roll
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
Run Code Online (Sandbox Code Playgroud)
你应该能够:
df.pipe(roll, w=2).mean()
Run Code Online (Sandbox Code Playgroud)
运用 w
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)
Run Code Online (Sandbox Code Playgroud)
roll(df, 2).apply(your_function)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11809 次 |
| 最近记录: |