You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

数组与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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 21:23:11