Pandas 基于相互依赖的滞后值计算列
Posted
技术标签:
【中文标题】Pandas 基于相互依赖的滞后值计算列【英文标题】:Pandas calculating column based on inter-dependent lagged values 【发布时间】:2018-12-26 17:56:23 【问题描述】:我有一个如下所示的数据框。最右边的两列是我想要的列:
Open Close open_to_close close_to_next_open open_desired close_desired
0 0 0 3 0 0
0 0 4 8 3 7
0 0 1 1 15 16
计算如下:
open_desired = close_desired(prior row) + close_to_next_open(prior row)
close_desired = open_desired + open_to_close
如何以循环方式实现以下内容?我正在尝试这样做直到最后一行。
df = pd.DataFrame('open': [0,0,0], 'close': [0,0,0], 'open_to_close': [0,4,1], 'close_to_next_open': [3,8,1])
df['close_desired'] = 0
df['open_desired'] = 0
##First step is to create open_desired in current row which is dependent on close_desired in previous row
df['open_desired'] = df['close_desired'].shift() + df['close_to_next_open'].shift()
##second step is to create close_desired in current row which is dependent on open_desired in current row
df['close_desired'] = df['open_desired'] + df['open_to_close']
df.fillna(0,inplace=True)
【问题讨论】:
有什么问题? 我发现了两个问题。您需要初始化列“close_desired”,并且在第二行代码中您有一个错字(“close”应该是“close”)。最后做一个df.fillna(0,inplace=True)
。
@xyzjayne 谢谢,做了第二行编辑。我是 python 新手。如何初始化“close_desired”?
df['close_desired'] = 0
没有该行,df 在第一行有两个 NaN 条目,因为 shift() 为第一行生成 NaN 值。 fillna 用零替换 NaN。
【参考方案1】:
我能想到的唯一方法是使用iterrows()
for row, v in df.iterrows():
if row>0:
df.loc[row,'open_desired'] = df.shift(1).loc[row, 'close_desired'] + df.shift(1).loc[row, 'close_to_next_open']
df.loc[row,'close_desired'] = df.loc[row, 'open_desired'] + df.loc[row, 'open_to_close']
【讨论】:
感谢您的解决方案!if row>0
在循环中做什么?
它避免了第一行,因为它会写一个 NaN,它会被结转并将所有值呈现为 NaN
它对我有用。在接受此答案之前稍等片刻,以免阻止其他用户回答。以上是关于Pandas 基于相互依赖的滞后值计算列的主要内容,如果未能解决你的问题,请参考以下文章
pandas基于shift偏移dataframe中时间列计算相邻两列的时间差如果shift参数为1则指定列向下移动1个位置,使用后向填充进行缺失值填充
pandas计算滑动窗口中的最小值实战(Rolling Minimum in a Pandas Column):计算单数据列滑动窗口中的最小值计算多数据列滑动窗口中的最小值