计算股票日收益率并新增列失败问题求助
问题分析与解决方法
核心问题
你的代码存在两个关键问题:
- 代码末尾的多余星号(
*100***)属于语法冗余,虽未触发报错,但影响代码规范性; - 链式索引导致赋值失效:使用
stk_prc.amer_air['Daily Returns']这种链式访问方式时,pandas可能返回原数据的副本而非视图,赋值操作仅修改临时副本,不会同步到原数据对象,因此新列无法生成。
解决步骤
1. 修正语法冗余
先去除计算式末尾的多余星号,保留正确的计算逻辑:
# 封装日收益率计算逻辑,避免重复代码 daily_return_calc = lambda df: ((df['Close'] - df['Open']) / df['Open']) * 100
2. 避免链式索引,改用安全赋值方式
根据你的数据结构选择对应方案:
方案A:若stk_prc是多层列索引的DataFrame(每只股票对应一列组)
使用.loc精准定位层级列,确保赋值直接修改原数据:
# 为amer_air添加日收益率列 stk_prc.loc[:, ('amer_air', 'Daily Returns')] = daily_return_calc(stk_prc['amer_air']) # 为alsk_air添加日收益率列 stk_prc.loc[:, ('alsk_air', 'Daily Returns')] = daily_return_calc(stk_prc['alsk_air'])
方案B:若stk_prc的每个属性(如amer_air)是独立DataFrame
使用assign()方法生成包含新列的DataFrame,并重新赋值给原属性:
# 更新amer_air数据,添加新列 stk_prc.amer_air = stk_prc.amer_air.assign(**{'Daily Returns': daily_return_calc(stk_prc.amer_air)}) # 更新alsk_air数据,添加新列 stk_prc.alsk_air = stk_prc.alsk_air.assign(**{'Daily Returns': daily_return_calc(stk_prc.alsk_air)})
3. 批量处理优化(可选)
针对12只股票的场景,可通过遍历批量生成新列,减少重复代码:
# 定义所有股票名称列表 stock_names = ['amer_air', 'alsk_air', ...] # 补充其余10只股票名称 # 多层列索引场景批量处理 for stock in stock_names: stk_prc.loc[:, (stock, 'Daily Returns')] = daily_return_calc(stk_prc[stock]) # 独立DataFrame属性场景批量处理 for stock in stock_names: df = getattr(stk_prc, stock) setattr(stk_prc, stock, df.assign(**{'Daily Returns': daily_return_calc(df)}))
内容的提问来源于stack exchange,提问作者Sriram K
相关产品推荐
相关产品推荐

