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

Statsmodels时序分解返回全NaN数组,Matplotlib仍可绘图的问题排查

问题:statsmodels seasonal_decompose分解结果全为NaN但Matplotlib可绘制

在Google Colab中使用statsmodels的seasonal_decompose处理大型时间序列时,分解得到的trend、seasonal、residual数组均显示为全NaN值,打印或操作这些数组无法获取有效数据,但Matplotlib却能正常绘制这些看似不存在的数据。重启Colab后问题依旧,相关代码如下:

csvfile=('/content/gdrive/MyDrive/NWI_project/Savitzky-Golay_filter.csv')
smoothed_values = np.loadtxt(csvfile, delimiter=',')

decomp = seasonal_decompose(smoothed_values, period=168, model='additive')
trend = decomp.trend
seasonal = decomp.seasonal
residual = decomp.resid
observed = decomp.observed

print("trend is", trend)
print("seasonal is",seasonal)
print("residual is",residual)
print("observed",observed)

plt.plot(smoothed_values, label='Original Data', color='blue')
plt.plot(trend, label='trend', color='red')
plt.plot(seasonal, label='seasonal', color='green')
plt.plot(residual, label='residual', color='orange')
#plt.plot(observed, label='observed', color='yellow')

plt.figure(figsize=(25, 5))

#plt.grid(True)
plt.show()
原因及解决办法
  • 数据维度不匹配:seasonal_decompose要求输入是一维时间序列数组,如果你的smoothed_values是二维格式(比如每行单个值的列向量),分解后会直接输出全NaN。先检查数据形状:

    print(smoothed_values.shape)
    

    若为二维,将其转为一维:

    smoothed_values = smoothed_values.flatten()
    
  • 输入数据有效性问题:如果输入数据包含非数值(如inf、字符串),或者数据长度小于period*2(移动平均计算趋势的最小要求),也会导致全NaN结果。执行以下代码排查:

    print("数据中是否存在NaN:", np.isnan(smoothed_values).any())
    print("数据中是否存在无穷值:", not np.isfinite(smoothed_values).all())
    print("数据长度是否满足要求:", len(smoothed_values) >= 168*2)
    
  • Matplotlib的NaN处理特性:Matplotlib绘制时会自动跳过NaN值,可能你的分解结果并非全NaN,只是打印时显示范围有限导致看起来全是NaN。可以统计有效数据量:

    print("trend有效数据量:", np.count_nonzero(~np.isnan(trend)))
    
  • 环境版本兼容问题:尝试升级statsmodels确保版本适配:

    !pip install --upgrade statsmodels
    

内容的提问来源于stack exchange,提问作者Dan S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:34:52