我有一个如下所示的 DataFrame:
ds y
0 2017-02-07 0.154941
1 2017-02-08 0.110595
2 2017-02-09 0.044022
3 2017-02-10 0.283902
4 2017-02-11 0.121570
5 2017-02-12 0.000000
6 2017-02-13 0.020265
7 2017-02-14 0.053577
8 2017-02-15 0.080842
9 2017-02-16 0.022043
Run Code Online (Sandbox Code Playgroud)
我现在正在尝试创建一个新列“next_3”,它是y当天之后接下来 3 天的值的总和。
我正在使用以下方法实现这一目标:
df['next_3'] = df['y'].shift(-3).rolling(3).sum()
Run Code Online (Sandbox Code Playgroud)
产生这个:
ds y label
0 2017-02-07 0.154941 NaN
1 2017-02-08 0.110595 NaN
2 2017-02-09 0.044022 0.405472
3 2017-02-10 0.283902 0.141836
4 2017-02-11 0.121570 0.073842
5 2017-02-12 0.000000 0.154685
6 2017-02-13 0.020265 0.156462
7 2017-02-14 0.053577 NaN
8 2017-02-15 0.080842 NaN
9 2017-02-16 0.022043 NaN
Run Code Online (Sandbox Code Playgroud)
我理解为什么最后 3 行有NaN值,因为接下来的 3 行不可用,但是为什么前 2 行在NaN可以计算这些值时有值?
如何更正我的shift().rolling().sum()呼叫以便也计算前两行?
使用参数min_periods=1:
df['next_3'] = df['y'].shift(-3).rolling(3, min_periods=1).sum()
print (df)
ds y next_3
0 2017-02-07 0.154941 0.283902
1 2017-02-08 0.110595 0.405472
2 2017-02-09 0.044022 0.405472
3 2017-02-10 0.283902 0.141835
4 2017-02-11 0.121570 0.073842
5 2017-02-12 0.000000 0.154684
6 2017-02-13 0.020265 0.156462
7 2017-02-14 0.053577 0.102885
8 2017-02-15 0.080842 0.022043
9 2017-02-16 0.022043 NaN
Run Code Online (Sandbox Code Playgroud)
或者先使用滚动然后移动:
df['next_3'] = df['y'].rolling(3).sum().shift(-3)
print (df)
ds y next_3
0 2017-02-07 0.154941 0.438519
1 2017-02-08 0.110595 0.449494
2 2017-02-09 0.044022 0.405472
3 2017-02-10 0.283902 0.141835
4 2017-02-11 0.121570 0.073842
5 2017-02-12 0.000000 0.154684
6 2017-02-13 0.020265 0.156462
7 2017-02-14 0.053577 NaN
8 2017-02-15 0.080842 NaN
9 2017-02-16 0.022043 NaN
Run Code Online (Sandbox Code Playgroud)