DataFrame大回溯单位下dropna报错:无法将非有限值转为整数
分析你的回溯百分比计算问题
我来帮你拆解下这个问题,你遇到的情况大概率是数据量不足或者浮点精度溢出导致的,咱们一步步来排查:
可能的原因
1. DataFrame总行数不够支撑1500的回溯跨度
当你设置lookback=1500时,shift(periods=1500)会把当前行的数值和1500行之前的数值做计算。如果你的DataFrame总行数小于等于1500,那所有行的_relhist_1500列都会是NaN——这时候dropna()会把所有行都删掉,空DataFrame后续操作就会抛出错误。而lookback=1000时,你的数据行数刚好够,所以能正常保留部分行。
2. float32精度不足导致隐性NaN/inf
np.float32的有效精度只有6-7位,当计算大跨度的百分比变化时(比如1500个单位的历史数据和当前数据差异极大),很容易出现精度溢出,生成inf或者隐性的NaN。这些异常值会被dropna()识别,最终可能导致所有行被过滤,触发错误。
解决方案
先排查数据量问题
在dropna()前加几行代码,确认数据情况:
# 查看每列的非缺失值数量 print("各列非缺失值统计:") print(df.count()) # 提前查看dropna后的结果 temp_df = df.dropna() print(f"dropna后剩余行数:{temp_df.shape[0]}")
如果输出显示剩余行数为0,那就是数据量不够,需要确认你的原始数据总行数是否≥lookback + 1(比如1500的话至少要有1501行)。
替换为float64提升精度
把value列的类型换成np.float64,它的精度足够支撑大跨度的数值计算:
df['value'] = df['value'].astype(np.float64)
然后重新运行你的循环代码,看是否还会触发错误。
排查异常值(inf/NaN)
如果数据量足够,那可能是计算中产生了inf,可以先检测一下:
# 统计每列的inf数量 print("各列inf值统计:") print(df.isin([np.inf, -np.inf]).sum()) # 把inf替换成NaN或者合适的值 df.replace([np.inf, -np.inf], np.nan, inplace=True)
之后再执行dropna(),就能避免因inf导致的问题。
优化循环逻辑(可选)
如果不需要生成1到lookback的所有列,只需要最终的1500跨度列,可以简化代码,减少内存占用:
# 只生成lookback对应的列,不用循环 df['_relhist_1500'] = df['value'].shift(periods=1500, fill_value=np.nan) / df['value'] - 1 df.dropna(inplace=True)
内容的提问来源于stack exchange,提问作者Alana O'Neill
相关产品推荐
相关产品推荐

