Python 使用熊猫数据帧中的部分数据滚动标准偏差
我希望能够根据数据框中的部分数据计算滚动标准偏差。一个例子将解释我想要实现的目标Python 使用熊猫数据帧中的部分数据滚动标准偏差,python,pandas,dataframe,Python,Pandas,Dataframe,我希望能够根据数据框中的部分数据计算滚动标准偏差。一个例子将解释我想要实现的目标 A B C 2000-01-01 0.425615 1.679789 -1.903056 2000-01-02 0.791313 0.562471 0.098124 2000-01-03 1.223165 -0.548387 -1.558204 2000-01-04 0.354931 -0.685773 0.647817 2000
A B C
2000-01-01 0.425615 1.679789 -1.903056
2000-01-02 0.791313 0.562471 0.098124
2000-01-03 1.223165 -0.548387 -1.558204
2000-01-04 0.354931 -0.685773 0.647817
2000-01-05 1.137434 1.000594 0.428180
2000-01-06 -0.265311 -1.807045 0.533477
2000-01-07 0.717505 1.647540 -0.141123
2000-01-08 -2.405664 1.278410 1.043872
2000-01-09 0.463943 0.982042 -0.382241
2000-01-10 -0.403267 -0.615421 0.583384
2000-01-11 -0.714163 0.470505 -0.291396
2000-01-12 0.209979 -0.118331 -0.369776
2000-01-13 -0.779638 0.924612 -0.477497
2000-01-14 0.149868 -0.376292 0.747637
2000-01-15 -0.464360 0.821400 1.412874
这就是我希望能够做到的:
df.index[:-1]
反转索引中的日期,以便最新的日期是第一个df.ix[df.index[:-1][::window\u step\u size]
然后从该索引中每隔n次
取一个值(例如每三个日期)。最后,df.index[:-1][::window\u step\u size][:-1]首先使用最早日期的索引
>>> df.index[::-1][::window_step_size][::-1]
Index([u'2000-01-03', u'2000-01-06', u'2000-01-09', u'2000-01-12', u'2000-01-15'], dtype='object')
基于此新索引,从数据库中选择值:
>>> df.ix[df.index[::-1][::window_step_size][::-1]]
A B C
2000-01-03 1.223165 -0.548387 -1.558204
2000-01-06 -0.265311 -1.807045 0.533477
2000-01-09 0.463943 0.982042 -0.382241
2000-01-12 0.209979 -0.118331 -0.369776
2000-01-15 -0.464360 0.821400 1.412874
现在,您可以对所选滚动窗口使用常规的pd.rolling\u std
功能
pd.rolling_std(df.ix[df.index[::-1][::window_step_size][::-1]], window=rolling_window)
编辑要获取每日值,可以连接
def roll_sd(df, rolling_window, window_step_size):
return pd.rolling_std(df.ix[df.index[::-1][::window_step_size][::-1]],
window=rolling_window)
df_sd = pd.concat([roll_sd(df.iloc[0:len(df)-n], rolling_window, window_step_size)
for n in range(window_step_size)])
df_sd.sort_index()
A B C
2000-01-01 NaN NaN NaN
2000-01-02 NaN NaN NaN
2000-01-03 NaN NaN NaN
2000-01-04 NaN NaN NaN
2000-01-05 NaN NaN NaN
2000-01-06 NaN NaN NaN
2000-01-07 0.192205 1.356544 1.305998
2000-01-08 1.953373 0.360948 0.480009
2000-01-09 0.744288 1.396749 1.048535
2000-01-10 0.571905 1.327296 0.438081
2000-01-11 1.772152 0.410464 0.668307
2000-01-12 0.370182 1.404848 0.525129
2000-01-13 0.778805 1.155806 0.542145
2000-01-14 1.299902 0.827427 0.701223
2000-01-15 0.479753 0.594379 1.032831
谢谢,但是我需要一个滚动值来表示每个日期,而不是每第三个日期。太棒了!我需要一些时间来尝试理解代码中发生了什么,但它看起来非常有希望。谢谢!我不能说我完全理解这一点,但我也希望有一个2000-01-15的值。它应该基于2000-01-1的标准开发5,2000-01-12,2000-01-09,2000-01-06,2000-01-03。它可以工作,但我在理解范围(4)中的n在这种情况下意味着什么方面有问题。为什么是4?我对熊猫来说是新手,它很强大,但并不总是容易理解。应该是窗口步长。我已经修改了。
>>[n代表范围(3)]
结果是[0,1,2]
def roll_sd(df, rolling_window, window_step_size):
return pd.rolling_std(df.ix[df.index[::-1][::window_step_size][::-1]],
window=rolling_window)
df_sd = pd.concat([roll_sd(df.iloc[0:len(df)-n], rolling_window, window_step_size)
for n in range(window_step_size)])
df_sd.sort_index()
A B C
2000-01-01 NaN NaN NaN
2000-01-02 NaN NaN NaN
2000-01-03 NaN NaN NaN
2000-01-04 NaN NaN NaN
2000-01-05 NaN NaN NaN
2000-01-06 NaN NaN NaN
2000-01-07 0.192205 1.356544 1.305998
2000-01-08 1.953373 0.360948 0.480009
2000-01-09 0.744288 1.396749 1.048535
2000-01-10 0.571905 1.327296 0.438081
2000-01-11 1.772152 0.410464 0.668307
2000-01-12 0.370182 1.404848 0.525129
2000-01-13 0.778805 1.155806 0.542145
2000-01-14 1.299902 0.827427 0.701223
2000-01-15 0.479753 0.594379 1.032831