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

ARIMA时间序列分析绘图报错:TypeError: no numeric data to plot

问题排查:ARIMA差分数据绘图报错TypeError: no numeric data to plot

问题背景

在基于差分数据的ARIMA时间序列分析过程中,执行绘图代码时触发以下错误:

TypeError: no numeric data to plot

追踪发现生成的stationary序列保存为CSV后,每行数据格式为数组形式:

[11.]
[0.]
[16.]
[45.]
[27.]
[-141.]
[46.]

使用的数据集片段:

Year,Obs
1994,21
1995,62
1996,56
1997,29
1998,38
1999,201

错误原因

核心问题出在数据维度处理不当:

  1. series = pd.read_csv('dataset.csv')读取的是DataFrame,调用series.values返回的是二维数组(即使只有Obs一列,结构仍为[[21], [62], ...])
  2. 在difference函数中,dataset[i] - dataset[i-1]实际是两个一维数组相减,结果还是一维数组,最终diff列表中存储的是数组对象而非单个数值
  3. 转换为Series后,每个元素是数组类型,而非pandas可识别的数值类型,因此绘图时触发"无数值数据"的错误

修复方案

有两种简洁的修复方式,推荐优先使用pandas原生方法:

方式1:直接使用pandas的diff()方法(更高效简洁)

替换自定义的difference函数,利用pandas内置的差分功能:

import pandas as pd
import matplotlib.pyplot as plt

series = pd.read_csv('dataset.csv')
# 直接对Obs列做差分,自动生成一维数值序列
stationary = series['Obs'].diff().dropna()
# 对齐索引
stationary.index = series.index[1:]

stationary.plot()
plt.show()

方式2:修正自定义函数与数据提取逻辑

如果要保留自定义差分函数,需确保传入一维数组:

from pandas import Series
import pandas as pd
import matplotlib.pyplot as plt

def difference(dataset):
    diff = list()
    for i in range(1, len(dataset)):
        # 直接操作一维数组的元素
        value = dataset[i] - dataset[i - 1]
        diff.append(value)
    return Series(diff)

series = pd.read_csv('dataset.csv')
# 提取Obs列的一维数值数组,而非整个DataFrame的二维数组
X = series['Obs'].values.astype('float32')
stationary = difference(X)
stationary.index = series.index[1:]

stationary.plot()
plt.show()

验证结果

修复后,stationary序列的每个元素为单个数值,保存为CSV后内容会变为:

11.0
0.0
16.0
45.0
27.0
-141.0
46.0

此时调用plot()方法可正常生成差分数据的趋势图。

内容的提问来源于stack exchange,提问作者Stop War

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 07:40:26