数据框中的动态行更新

时间:2021-07-15 04:44:43

标签: python pandas dataframe

我创建了一个分类模型,用于预测资产在接下来的 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),以避免过度由于模型中的噪声进行买卖。

2 个答案:

答案 0 :(得分:1)

让我们尝试用 Series.maskNaN 代替低置信度值,然后用 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'])]