使用Pandas计算阿迪达斯等股票月收益率遇两类TypeError报错求助
解决Pandas计算月收益率的TypeError问题
错误原因分析
- 第一个错误:
set_value在新版Pandas中已被弃用,若代码中误将mr.set_value赋值为列表,会触发'list' object is not callable错误。 - 第二个错误:
at是Pandas的索引访问器,不是可调用方法,不能用括号()调用,正确操作是用方括号[]赋值。
修复方案
方案1:修复原有循环代码
将mr.set_value(date,s,ret)替换为mr.at[date, s] = ret,同时提前初始化mr的索引和列,避免动态扩容的性能损耗:
import pandas as pd mp = pd.read_csv("Stock price over the last 24 months of Adidas, Nike, and Puma.csv", index_col=0) # 提前指定索引和列,提升代码效率 mr = pd.DataFrame(index=mp.index, columns=mp.columns) # 计算月收益率 for s in mp.columns: pr0 = mp[s].iloc[0] mr.at[mp.index[0], s] = 0 # 第一个月无收益率,设为0 for t in range(1, len(mp.index)): pr1 = mp[s].iloc[t] ret = (pr1 - pr0) / pr0 mr.at[mp.index[t], s] = ret pr0 = pr1
方案2:用Pandas内置方法(推荐,简洁高效)
Pandas自带pct_change()方法,可直接计算相邻元素的百分比变化,完全替代嵌套循环:
import pandas as pd mp = pd.read_csv("Stock price over the last 24 months of Adidas, Nike, and Puma.csv", index_col=0) # pct_change()自动计算月收益率,第一行NaN用fillna(0)填充 mr = mp.pct_change().fillna(0)
该方法代码更简洁,性能远优于手动循环,尤其适合数据量较大的场景。
内容的提问来源于stack exchange,提问作者Arkromikz
相关产品推荐
相关产品推荐

