我目前有一个如下数据框,显示位置变化,加1个单位,减去1个单位或什么也不做(0)。
我希望创建第二个具有净位置的数据帧,该位置为长(1)或平(0) - 假设无法实现净短(-1)位置。
所以逻辑是从0开始,当第一个+1'位置改变时切换到1。发生(忽略任何后续+1),然后只有在看到-1时才切换回0。
有关如何做到这一点的任何想法?我们的想法是按照以下
创建df2 如果每个+1'位置发生变化,df.cumsum()都会有效。我只想数数,但我只希望捕获“长或平”的信息。不是任何累积多头头寸的大小。
输入数据框:
输出数据框:
答案 0 :(得分:1)
这是一个矢量化解决方案:
df['CiP'].where(df['CiP'].replace(to_replace=0, method='ffill').diff(), 0).cumsum()
说明:
replace
的调用会将0
值替换为前一个非零值。diff
的调用会指向实际的位置变化。where
的调用可确保真正更改的值被0
替换。cumsum
才有效。修改:如果您有多列,请按上述定义一项功能并应用它。
def position(series):
return series.where(series.replace(to_replace=0, method='ffill').diff(), 0).cumsum()
df[list_of_columns].apply(position)
这可能比显式循环列更快。