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

2024-09-29 01:21:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我试过这个代码,但没有达到我想要的效果。我正在尝试让事件在数据帧上工作。如果过期日期等于索引日期,那么我希望值为0。如果预测列显示1,那么我想得到1的值。我希望它检查前一行是否已经触发了1,并在过期日期触发0之前保持为1。你知道吗

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

我试过换班,但似乎不正常,因为它只做了一次。你知道吗

                 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。当到期时,Forecast将返回0。你知道吗


Tags: 数据代码dfdateindexshiftnp事件
2条回答

我们也可以使用^{}+^{}

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

相关问题 更多 >