我尝试了这段代码,但没有做我想让它做的事情。 我正在尝试让事件在熊猫数据帧上工作。 如果到期日期等于索引日期,那么我想要一个值 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