如何遍历Pandas DataFrame根据拆股列值计算调整后持股数量
问题原因分析
- 初始赋值写法逻辑错误:你的
ownership列是固定值1000,每次计算ownerAdj时都取前一行的固定1000计算,没有保留上一次拆股调整后的持股量,因此拆股日之后数值会直接变回1000。 - 循环写法报错原因:
iterrows()返回的row是对应单行的Series,row["ownership"]是单个浮点数值,只有DataFrame/Series类才有shift()方法,单个数值调用该方法自然会抛出属性错误。
正确实现方案
最优方案:向量化累计乘积(效率最高)
拆股调整是累计效应,我们只需要将无拆股时的比例替换为1,计算累计拆股倍数后乘以初始持股量即可,不需要遍历:
import yfinance as yf aapl = yf.Ticker("AAPL") hist = aapl.history(start="2014-06-01") init_shares = 1000 # 替换无拆股时的0为1,计算到当前日期为止的累计拆股倍数 hist['split_cum'] = hist['Stock Splits'].replace(0, 1).cumprod() # 调整后持股量 = 初始持股量 * 累计拆股倍数 hist['ownerAdj'] = init_shares * hist['split_cum']
运行后2014-06-09拆股后ownerAdj会稳定为7000,2020-08-31 4:1拆股后会变为28000并保持,完全符合需求。
遍历实现方案(逻辑直观)
如果需要用遍历逻辑实现,维护一个变量记录当前持股量即可:
init_shares = 1000 current_shares = init_shares adj_list = [] for split_ratio in hist['Stock Splits']: if split_ratio != 0: current_shares *= split_ratio adj_list.append(current_shares) hist['ownerAdj'] = adj_list
内容的提问来源于stack exchange,提问作者Sam.H
相关产品推荐
相关产品推荐

