如何将给定数据转换为适用于ARIMA模型预测的时间序列?
将年度月度数据转换为ARIMA可用的时间序列
ARIMA模型要求输入是按时间顺序连续排列的单变量时间序列,当前数据为宽格式(每年一行、每月一列),需按以下步骤转换:
1. 宽格式转长格式
把年份、月份拆分为独立的时间标识列,将月度数值合并为单一数值列,让每一行对应一个时间点的观测值。
R语言实现示例
# 加载工具包 library(tidyr) library(dplyr) # 构造原始数据框 df <- data.frame( X = 2012:2021, Jan = c(24.78,24.82,24.01,24.60,25.20,25.28,24.84,23.73,25.41,24.70), Feb = c(26.82,26.04,25.75,26.11,27.62,26.88,26.47,26.75,26.75,25.90), Mar = c(29.75,28.83,29.08,29.19,29.51,29.55,29.40,29.57,29.30,29.62), Apr = c(31.19,30.85,31.83,30.71,31.86,31.88,31.20,31.59,31.37,31.42), May = c(31.87,32.44,31.23,32.69,32.34,32.74,31.10,32.53,32.98,31.68), Jun = c(31.00,29.70,33.08,28.90,28.64,29.89,30.28,31.30,30.05,30.17), Jul = c(28.48,27.86,29.88,29.21,27.98,28.41,28.30,29.48,28.23,28.13), Aug = c(27.39,27.66,28.14,28.24,28.36,27.60,27.33,27.78,27.53,28.08), Sep = c(27.08,27.73,27.40,27.58,27.12,27.72,27.55,27.54,27.68,27.68), Oct = c(26.55,27.00,27.11,27.82,26.51,27.23,27.40,27.05,27.01,27.29), Nov = c(24.36,24.87,25.38,25.37,25.69,25.43,26.98,25.44,25.57,25.59), Dec = c(23.62,22.94,24.37,24.71,25.12,24.08,24.77,24.46,22.86,23.16) ) # 转换为长格式 long_df <- df %>% gather(key = "Month", value = "Value", -X) %>% rename(Year = X) # 查看转换结果 head(long_df)
Python语言实现示例
import pandas as pd # 构造原始数据 data = { 'X': [2012,2013,2014,2015,2016,2017,2018,2019,2020,2021], 'Jan': [24.78,24.82,24.01,24.60,25.20,25.28,24.84,23.73,25.41,24.70], 'Feb': [26.82,26.04,25.75,26.11,27.62,26.88,26.47,26.75,26.75,25.90], 'Mar': [29.75,28.83,29.08,29.19,29.51,29.55,29.40,29.57,29.30,29.62], 'Apr': [31.19,30.85,31.83,30.71,31.86,31.88,31.20,31.59,31.37,31.42], 'May': [31.87,32.44,31.23,32.69,32.34,32.74,31.10,32.53,32.98,31.68], 'Jun': [31.00,29.70,33.08,28.90,28.64,29.89,30.28,31.30,30.05,30.17], 'Jul': [28.48,27.86,29.88,29.21,27.98,28.41,28.30,29.48,28.23,28.13], 'Aug': [27.39,27.66,28.14,28.24,28.36,27.60,27.33,27.78,27.53,28.08], 'Sep': [27.08,27.73,27.40,27.58,27.12,27.72,27.55,27.54,27.68,27.68], 'Oct': [26.55,27.00,27.11,27.82,26.51,27.23,27.40,27.05,27.01,27.29], 'Nov': [24.36,24.87,25.38,25.37,25.69,25.43,26.98,25.44,25.57,25.59], 'Dec': [23.62,22.94,24.37,24.71,25.12,24.08,24.77,24.46,22.86,23.16] } df = pd.DataFrame(data) # 转换为长格式 long_df = df.melt(id_vars=['X'], var_name='Month', value_name='Value').rename(columns={'X':'Year'}) # 查看转换结果 print(long_df.head())
2. 创建连续时间索引
将年份和月份合并为标准日期格式,生成按时间顺序排列的索引,确保序列连续性。
R语言实现示例
# 生成日期列 long_df$Date <- as.Date(paste(long_df$Year, long_df$Month, "01", sep = "-"), format = "%Y-%b-%d") # 按日期排序 long_df <- long_df %>% arrange(Date) # 转换为月度时间序列对象 ts_data <- ts(long_df$Value, start = c(2012, 1), frequency = 12) # 查看时间序列 head(ts_data)
Python语言实现示例
# 合并年份与月份为日期列 long_df['Date'] = pd.to_datetime(long_df['Year'].astype(str) + '-' + long_df['Month']) # 按日期排序 long_df = long_df.sort_values('Date').reset_index(drop=True) # 转换为带Datetime索引的时间序列 ts_series = long_df.set_index('Date')['Value'] # 强制设置月度频率(每月第一天) ts_series = ts_series.asfreq('MS') # 查看时间序列 print(ts_series.head())
3. 验证数据完整性
检查序列是否存在缺失值、重复时间点或时间断点,ARIMA要求数据连续无缺失。
R语言验证
# 检查缺失值 any(is.na(ts_data)) # 检查时间范围 range(time(ts_data))
Python语言验证
# 检查缺失值数量 print(ts_series.isna().sum()) # 检查时间范围 print(ts_series.index.min(), ts_series.index.max())
完成以上步骤后,得到的ts_data(R)或ts_series(Python)即可直接用于ARIMA模型的拟合与预测。
内容的提问来源于stack exchange,提问作者Jai Surya
相关产品推荐
相关产品推荐

