Python Pandas 数据框,值的操作

0 投票
1 回答
976 浏览
提问于 2025-04-29 03:59

我正在尝试理解Pandas的DataFrame是如何向下复制信息的,并在变量变化时重置...具体来说,我想知道如何让Share_Amt_To_Buy在我的Signal或Signal_Diff从1变为0时重置为0。

使用.cumsum()对Share_Amt_To_Buy进行操作会导致值不断累加,这并不是我想要的效果。

我的目标是,当Signal从0变为1时,计算Share_Amt_To_Buy并一直复制这个值,直到Signal再变回0。如果Signal再次变为1,我希望Share_Amt_To_Buy能根据那个时刻重新计算。

希望这样说能让你明白 - 请告诉我你的想法。

Signal  Signal_Diff  Share_Amt_To_Buy (Correctly)  Share_Amt_To_Buy (Currently)
0       0            0                             0
0       0            0                             0
0       0            0                             0
1       1            100                           100
1       0            100                           100
1       0            100                           100
0       -1           0                             100
0       0            0                             100
1       1            180                           280
1       0            180                           280

正如你所看到的,我的信号在0和1之间交替,这意味着以下内容: 0 = 不交易(或没有持仓) 1 = 交易(有持仓)

Signal_Diff的计算方式如下:

portfolio['Signal_Diff'] = portfolio['Signal'].diff().fillna(0.0)

当信号从0变为1时,'Share_Amt_To_Buy'这一列会被计算出来。我用以下示例来计算这个值:

initial_cap = 100000.0
portfolio['close'] = my stock's closing prices as a float
portfolio['Share_Amt'] = np.where(variables['Signal']== 1.0, np.round(initial_cap / portfolio['close'] *     0.25 * portfolio['Signal']), 0.0).cumsum()

portfolio['Share_Amt_To_Buy'] = (portfolio['Share_Amt']*portfolio['Signal'])
暂无标签

1 个回答

0

根据我的理解,pandas并没有内置的公式模块。你可以对列、单元格、数组进行计算,并从中生成不同的数组或数值(比如df[column].count()就是一个例子),可以做很多这样的工作,但没有办法根据数组中的另一个值动态更新数组本身(就像Excel中的公式那样)。

你可以选择逐步执行这个过程,比如说:

>>> for index in df.index:
>>>     if df['Signal_Diff'] == 0:
>>>         df.loc[index, 'Signal_Diff'] = some_value
>>>     elif df['Signal_Diff'] == 1:
>>>         df.loc[index, 'Signal_Diff'] = some_other_value

或者你可以通过map工具创建一个自定义函数:https://stackoverflow.com/a/19226745/4131059

编辑:

另一种解决方案是,在数组发生某些变化时,查询旧数组和新数组中值为1的所有索引:

>>> df_old_list = df[df.Signal_Diff == 1].index.tolist()
>>> ...
>>> df_new_list = df[df.Signal_Diff == 1].index.tolist()
>>>
>>> for x in df_old_list:
>>>     if x in df_new_list:
>>>         df_new_list.remove(x)

然后只对df_new_list中的索引进行重新计算。

撰写回答