python pandas dataframe,对值的操作

时间:2014-10-23 00:32:59

标签: python pandas dataframe finance stock

我试图理解Pandas DataFrames如何工作以向下复制信息,然后重置直到下一个变量发生变化...具体来说,一旦我的Signal或Signal_Diff从1切换到0,我如何使Share_Amt_To_Buy重置为0?

在Share_Amt_To_Buy上使用.cumsum()最终会降低值并累积,这不是我想要做的。

我的目标是当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)

列&Share; Amt_To_Buy'当信号从0变为1时计算。我使用以下作为例子来计算

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 :(得分: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

或者您可以通过地图工具创建自定义功能: 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中的索引。