如何创建像触发器事件一样使用前几行的 Pandas 数据帧?



我尝试了这段代码,但没有做我想让它做的事情。 我正在尝试让事件在熊猫数据帧上工作。 如果到期日期等于索引日期,那么我想要一个值 0。 如果预测列显示 1,那么我想得到一个 1 值。 我希望它检查上一行是否已经触发了 1,它保持 1,直到到期日期触发 0。

df['Forecast'] = np.select([df.ExpirationDate == df.index,
df.Predictions == 1,
df.Forecast.shift(1).eq(1)], [0, 1, 1])

我尝试了 shift,但它似乎无法正常工作,因为它只做了一次。

Open        High  ...  ExpirationDate  Predictions
Date                                ...                             
2017-09-18  249.610001  250.119995  ...      2017-10-20            0
2017-09-19  250.000000  250.070007  ...      2017-10-20            0
2017-09-20  250.070007  250.190002  ...      2017-10-20            0
2017-09-21  249.880005  249.979996  ...      2017-10-20            0
2017-09-22  249.050003  249.630005  ...      2017-10-20            0

预期产出

Predictions  Forecast  
Date                               
2017-09-18            0         0  
2017-09-19            0         0  
2017-09-20            0         0  
2017-09-21            0         0  
2017-09-22            0         0  
2017-09-25            0         0  
2017-09-26            0         0  
2017-09-27            0         0  
2017-09-28            0         0  
2017-09-29            0         0  
2017-10-02            0         0  
2017-10-03            0         0  
2017-10-04            0         0  
2017-10-05            1         1  
2017-10-06            0         1  
2017-10-09            0         1  
2017-10-10            0         1  
2017-10-11            0         1  
2017-10-12            0         1  
2017-10-13            0         1  
2017-10-16            0         1  
2017-10-17            0         1  
2017-10-18            0         1  
2017-10-19            0         1  
2017-10-20            0         0

因此,在预测中存在 1 后,预测保持 1。 当存在过期时,预测将转回 0。

我们也可以使用Series.cumsum+Series.clip

df['Forecast']=(
df['Predictions'].cumsum()
.clip(0,1)
.where(df.index < df.ExpirationDate)
.fillna(0, downcast='infer')
)
print(df)

输出

Predictions ExpirationDate  Forecast
Date                                            
2017-09-18            0     2017-10-20         0
2017-09-19            0     2017-10-20         0
2017-09-20            0     2017-10-20         0
2017-09-21            0     2017-10-20         0
2017-09-22            0     2017-10-20         0
2017-09-25            0     2017-10-20         0
2017-09-26            0     2017-10-20         0
2017-09-27            0     2017-10-20         0
2017-09-28            0     2017-10-20         0
2017-09-29            0     2017-10-20         0
2017-10-02            0     2017-10-20         0
2017-10-03            0     2017-10-20         0
2017-10-04            0     2017-10-20         0
2017-10-05            1     2017-10-20         1
2017-10-06            0     2017-10-20         1
2017-10-09            0     2017-10-20         1
2017-10-10            0     2017-10-20         1
2017-10-11            0     2017-10-20         1
2017-10-12            0     2017-10-20         1
2017-10-13            0     2017-10-20         1
2017-10-16            0     2017-10-20         1
2017-10-17            0     2017-10-20         1
2017-10-18            0     2017-10-20         1
2017-10-19            0     2017-10-20         1
2017-10-20            0     2017-10-20         0

我们可以使用Series.where来屏蔽,允许用fillna进行前向填充。另一个where仅在每行的到期日期之前设置值,我们将剩余值设置回 0。

df['Forecast'] = (df['Predictions'].where(df.Predictions.eq(1))
.ffill()
.where(df.index < df.ExpirationDate)
.fillna(0, downcast='infer'))

Predictions ExpirationDate  Forecast
Date                                            
2017-09-18            0     2017-10-20         0
2017-09-19            0     2017-10-20         0
2017-09-20            0     2017-10-20         0
2017-09-21            0     2017-10-20         0
2017-09-22            0     2017-10-20         0
2017-09-25            0     2017-10-20         0
2017-09-26            0     2017-10-20         0
2017-09-27            0     2017-10-20         0
2017-09-28            0     2017-10-20         0
2017-09-29            0     2017-10-20         0
2017-10-02            0     2017-10-20         0
2017-10-03            0     2017-10-20         0
2017-10-04            0     2017-10-20         0
2017-10-05            1     2017-10-20         1
2017-10-06            0     2017-10-20         1
2017-10-09            0     2017-10-20         1
2017-10-10            0     2017-10-20         1
2017-10-11            0     2017-10-20         1
2017-10-12            0     2017-10-20         1
2017-10-13            0     2017-10-20         1
2017-10-16            0     2017-10-20         1
2017-10-17            0     2017-10-20         1
2017-10-18            0     2017-10-20         1
2017-10-19            0     2017-10-20         1
2017-10-20            0     2017-10-20         0

最新更新