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
错误原因
核心问题出在数据维度处理不当:
series = pd.read_csv('dataset.csv')读取的是DataFrame,调用series.values返回的是二维数组(即使只有Obs一列,结构仍为[[21], [62], ...])- 在
difference函数中,dataset[i] - dataset[i-1]实际是两个一维数组相减,结果还是一维数组,最终diff列表中存储的是数组对象而非单个数值 - 转换为
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
相关产品推荐
相关产品推荐

