我创建了一个分类模型,用于预测资产在接下来的 N 天可能会产生正回报还是负回报。模型的值是 +1 表示正转向,-1 表示负回报。这是一个示例输出,
df=pd.DataFrame([[1,0.6],[1,0.7],[1,0.8],[-1,0.3],[-1,0.4],[-1,0.9]],columns=['prediction','confidence'])
df['date']= pd.date_range('2000-1-1', periods=6, freq='D')
df = df.set_index(['date'])
prediction confidence
date
2000-01-01 1 0.6
2000-01-02 1 0.7
2000-01-03 1 0.8
2000-01-04 -1 0.3
2000-01-05 -1 0.4
2000-01-06 -1 0.9
该模型还指定了 0 到 1 之间的置信度。我想做一个测试,如果模型的置信度 <0.5,我可以忽略预测,而是将预测设置为与前一天相同。更改应该会对数据框的其余部分产生后续影响,而不仅仅是 1 天。
我所困扰的是如何修改我的数据框(或创建一个新的),以便获得所需的数据。输出。使用上面的例子,期望的输出是
prediction confidence
date
2000-01-01 1 0.6
2000-01-02 1 0.7
2000-01-03 1 0.8
2000-01-04 1 0.3
2000-01-05 1 0.4
2000-01-06 -1 0.9
谢谢
编辑:
作为进一步说明,当“2000-01-04”上的“desired_df”中的预测发生变化时,“2000-01-05”上的值也会受到影响,因为现在“上一行”值现在是 +1,而不是 -1。这种模式一直持续到模型产生一个具有符号 -1 且置信水平 > 0.5 的预测。
编辑#2:
我认为这个要求在交易/投资中很常见,您希望保持现有头寸(+1 或 -1),直到您可以确定某些事情发生了变化(在我的情况下,置信度 > 0.5),以避免过度由于模型中的噪声进行买卖。
答案 0 :(得分:1)
让我们尝试用 Series.mask
用 NaN
代替低置信度值,然后用 Series.ffill
来提高值:
df['prediction'] = (
df['prediction'].mask(df['confidence'].lt(0.5)).ffill(downcast='infer')
)
df
:
prediction confidence
date
2000-01-01 1 0.6
2000-01-02 1 0.7
2000-01-03 1 0.8
2000-01-04 1 0.3
2000-01-05 1 0.4
2000-01-06 -1 0.9
掩盖低置信度值:
df['prediction'].mask(df['confidence'].lt(0.5))
date
2000-01-01 1.0
2000-01-02 1.0
2000-01-03 1.0
2000-01-04 NaN
2000-01-05 NaN
2000-01-06 -1.0
Name: prediction, dtype: float64
向前填充值以填充 NaN
值。 downcast
返回 int 类型(如有必要)
df['prediction'].mask(df['confidence'].lt(0.5)).ffill(downcast='infer')
date
2000-01-01 1
2000-01-02 1
2000-01-03 1
2000-01-04 1
2000-01-05 1
2000-01-06 -1
Name: prediction, dtype: int64
答案 1 :(得分:0)
尝试添加这行代码:
df['prediction'] = [x if y >= 0.5 else 1 for x, y in zip(df['prediction'], df['confidence'])]