如何在保留cumprod逻辑的同时实现DataFrame的Add列数值追加?
解决方案
问题背景
现有如下DataFrame:
data = {'Change': [.9, .8, .96, 1.5], 'Add': [0, 0, 660, 0], 'Open_Value':[1000, 900, 720, 691.2], 'Close_Value':[900, 720, 691.2, 1036.8]}
对应的表格:
Change Add Open_Value Close_Value 0 0.90 0 1000.0 900.0 1 0.80 0 900.0 720.0 2 0.96 660 720.0 691.2 3 1.50 0 691.2 1036.8
需要实现逻辑:将Add列数值追加到当前行的Close_Value,同时该值作为下一行的Open_Value,最终期望得到(注:若按描述逻辑计算与示例数值有出入,以下方案按需求描述实现):
Change Add Open_Value Close_Value 0 0.90 0 1000 900 1 0.80 0 900 720 2 0.96 660 720 1080 3 1.50 0 1080 1620
实现思路
由于每一行的Open_Value依赖上一行的Close_Value(含追加的Add值),属于带状态依赖的迭代计算,无法直接用cumprod实现(cumprod仅支持纯累积乘积操作),需用循环或itertools.accumulate逐行计算。
方法1:循环迭代计算
直接逐行推导,清晰直观:
import pandas as pd data = {'Change': [.9, .8, .96, 1.5], 'Add': [0, 0, 660, 0]} df = pd.DataFrame(data) # 初始化第一行的Open_Value df.loc[0, 'Open_Value'] = 1000 for i in range(len(df)): # 计算当前行Close_Value:Open * Change + Add(追加Add到计算后的Close) df.loc[i, 'Close_Value'] = df.loc[i, 'Open_Value'] * df.loc[i, 'Change'] + df.loc[i, 'Add'] # 非最后一行时,下一行的Open_Value等于当前行的Close_Value if i < len(df) - 1: df.loc[i+1, 'Open_Value'] = df.loc[i, 'Close_Value'] # 调整列顺序并格式化数值 df = df[['Change', 'Add', 'Open_Value', 'Close_Value']].astype(int) print(df)
方法2:使用itertools.accumulate(更高效)
利用accumulate处理累积计算,适合大数据量场景:
import pandas as pd from itertools import accumulate data = {'Change': [.9, .8, .96, 1.5], 'Add': [0, 0, 660, 0]} df = pd.DataFrame(data) # 定义累积计算逻辑:输入上一行的Close值,输出当前行的Close值 def calc_next_close(prev_close, row): current_open = prev_close return current_open * row['Change'] + row['Add'] # 生成Close_Value序列,初始值为第一行的Close计算结果 close_values = list(accumulate(df.itertuples(index=False), calc_next_close, initial=1000*df.iloc[0]['Change']+df.iloc[0]['Add'])) # Open_Value序列:第一个值为初始值1000,后续为前一行的Close值 open_values = [1000] + close_values[:-1] # 赋值到DataFrame df['Open_Value'] = open_values df['Close_Value'] = close_values df = df[['Change', 'Add', 'Open_Value', 'Close_Value']].astype(int) print(df)
说明
若期望得到示例中的数值,需调整逻辑为Add追加到Open_Value后再计算Change,只需修改计算式为:
# 当前行Close_Value = (Open_Value + Add) * Change df.loc[i, 'Close_Value'] = (df.loc[i, 'Open_Value'] + df.loc[i, 'Add']) * df.loc[i, 'Change'] # 下一行Open_Value = 当前行Close_Value
可根据实际业务需求调整计算逻辑。
内容的提问来源于stack exchange,提问作者Zachary Marx
相关产品推荐
相关产品推荐

