数组与DataFrame遍历:行间对应元素除法计算代码报错排查
问题排查与解决方案
你的代码出错的核心原因是循环遍历的对象不对:当你写for i in sp时,i拿到的是数组里的每一行数据(比如一个一维数组),而不是行的索引数字。这时候你用sp[i,:]就会因为i不是整数索引而报错,完全不符合你想要的“按索引取上一行”的逻辑。
修正后的循环实现
如果一定要用循环来做,你需要遍历行的索引(从1开始,因为要和上一行对比),而不是直接遍历行数据:
import numpy as np import pandas as pd # 假设stock_prices是你的DataFrame stock_returns = [] sp = np.array(stock_prices) # 遍历从第1行到最后一行的索引(索引从0开始) for i in range(1, sp.shape[0]): # 当前行除以上一行 sr = sp[i, :] / sp[i-1, :] stock_returns.append(sr) # 最后可以把结果转回DataFrame(如果需要) stock_returns_df = pd.DataFrame(stock_returns, columns=stock_prices.columns)
更高效的矢量化实现(推荐)
其实用numpy或者pandas的内置方法可以不用写循环,效率更高,代码也更简洁:
方法1:用Pandas直接计算
Pandas的DataFrame有非常方便的移位方法shift(),直接用当前行除以上一行(移位后的行)就行:
# 直接计算,得到的结果和你要的一致(会自动生成第一行NaN,因为没有上一行) stock_returns_df = stock_prices / stock_prices.shift(1) # 如果只想要9行有效数据,可以去掉第一行的NaN stock_returns_df = stock_returns_df.dropna()
方法2:用Numpy的切片操作
如果习惯用numpy,也可以用切片来实现矢量化运算,不用循环:
sp = np.array(stock_prices) # 从第1行到最后一行,除以上面从第0行到倒数第二行的所有行 stock_returns = sp[1:] / sp[:-1] # 转回DataFrame stock_returns_df = pd.DataFrame(stock_returns, columns=stock_prices.columns)
这两种矢量化方法比循环快得多,尤其是当你的数据行数很多的时候,强烈推荐使用。
内容的提问来源于stack exchange,提问作者user16440950
相关产品推荐
相关产品推荐

