我试图理解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'])
答案 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中的索引。