导入
能耗
应用时间序列分析技术来预测能源消耗。
...
1import pandas as pd 2import matplotlib.pyplot as plt 3 4df = pd.read_csv('AEP.csv') 5 6# 转换数据类型 7df["Date"] = pd.to_datetime(df['Date'], format='%Y-%m-%d') 8 9# 查看数据框的前几行和后几行 10print(df.head()) 11print(df.tail()) 12 13# 将日期设为索引 14df = df.set_index('Date') 15 16# 绘图 17fig, ax = plt.subplots(figsize=(7, 4.5), dpi=300) 18ax.plot(df) 19 20# 添加标签 21plt.xlabel("日期") 22plt.ylabel("兆瓦(MW)") 23plt.title("能源消耗") 24 25fig.savefig("output/output.png") 26plt.close(fig)
1import pandas as pd 2import matplotlib.pyplot as plt 3from statsmodels.tsa.seasonal import seasonal_decompose 4 5df = pd.read_csv('AEP.csv') 6 7# 转换数据类型 8df["Date"] = pd.to_datetime(df['Date'], format='%Y-%m-%d') 9 10# 将日期设为索引 11df = df.set_index('Date') 12 13# 去除异常值 14df = df[:-1] 15 16# 季节性分解 17result = seasonal_decompose( 18 df['AEP_MW'], 19 model='additive', 20 period=12, 21 extrapolate_trend='freq' 22 ) 23 24# 绘制季节性分解图 25fig = result.plot(observed=False) 26fig.savefig("output/output.png") 27plt.close(fig)
1import pandas as pd 2import matplotlib.pyplot as plt 3from statsmodels.graphics.tsaplots import plot_acf, plot_pacf 4import warnings 5 6warnings.filterwarnings("ignore") 7 8df = pd.read_csv('AEP.csv') 9 10# 转换数据类型 11df["Date"] = pd.to_datetime(df['Date'], format='%Y-%m-%d') 12 13# 将日期设为索引 14df = df.set_index('Date') 15 16# 去除异常值 17df = df[:-1] 18 19# 对数据进行一次差分 20df_dif = df['AEP_MW'] - df['AEP_MW'].shift(1) 21df_dif = df_dif - df_dif.shift(12) 22df_dif = df_dif.dropna() 23 24# 绘制自相关图(ACF)和偏自相关图(PACF) 25fig = plt.figure(figsize=(6,5)) 26 27ax1 = fig.add_subplot(211) 28ax1.set_xlabel('滞后阶数') 29ax1.set_ylabel('相关性') 30plot_acf(df_dif, ax=ax1, alpha=0.05) 31 32ax2 = fig.add_subplot(212) 33ax2.set_xlabel('滞后阶数') 34ax2.set_ylabel('偏相关性') 35plot_pacf(df_dif, ax=ax2, alpha=0.05) 36 37plt.subplots_adjust(left=0.2, 38 bottom=0.1, 39 right=0.9, 40 top=0.9, 41 wspace=0.4, 42 hspace=0.4) 43 44# 保存图像 45fig.savefig("output/output.png") 46plt.close(fig)
1import pandas as pd 2import matplotlib.pyplot as plt 3from sklearn.metrics import * 4from statsmodels.tsa.statespace.sarimax import SARIMAX 5from statsmodels.tsa.holtwinters import ExponentialSmoothing 6import warnings 7 8warnings.filterwarnings("ignore") 9 10df = pd.read_csv('AEP.csv') 11 12# 转换数据类型 13df["Date"] = pd.to_datetime(df['Date'], format='%Y-%m-%d') 14 15# 将日期设为索引 16df = df.set_index('Date') 17 18# 去除异常值 19df = df[:-1] 20 21# 计算朴素预测的时间滞后 22freq = 12 23df['t-'+str(freq)] = df['AEP_MW'].shift(freq) 24 25# 划分训练集和测试集 26df_train = df[:-freq] 27df_test = df[-freq:] 28 29# 使用朴素预测作为基准模型 30naive_forecast = df_test['t-'+str(freq)] 31baseline_error = round(mean_absolute_error(df_test['AEP_MW'], naive_forecast)) 32 33# 使用SARIMA模型进行预测 34sarima_results = SARIMAX( 35 df_train['AEP_MW'], order=(12,1,12)).fit(disp=0) 36 37sarima_predictions = sarima_results.predict( 38 start=len(df_train), 39 end=len(df_train)+freq-1 40 ) 41 42sarima_error = round(mean_absolute_error(df_test['AEP_MW'], sarima_predictions)) 43 44# 使用Holt-Winters模型进行预测 45hw_results = ExponentialSmoothing( 46 df_train['AEP_MW'], 47 trend='multiplicative', 48 seasonal='multiplicative').fit() 49 50hw_predictions = hw_results.predict( 51 start=df_test.index.min(), end=df_test.index.max() 52 ) 53 54hw_error = round(mean_absolute_error(df_test['AEP_MW'], hw_predictions)) 55 56# 绘图对比 57fig, ax = plt.subplots(figsize=(7, 4.5), dpi=300) 58 59ax.plot(df['AEP_MW'][-freq:], label = "真实值") 60ax.plot(naive_forecast, label = "基准模型 (MAE={0})".format(baseline_error)) 61ax.plot(sarima_predictions, label = "SARIMA (MAE={0})".format(sarima_error)) 62ax.plot(hw_predictions, label = "Holt-Winters (MAE={0})".format(hw_error)) 63plt.title("能源消耗") 64 65plt.legend() 66fig.savefig("output/output.png") 67plt.close(fig)
1import pandas as pd 2import matplotlib.pyplot as plt 3from sklearn.metrics import * 4from statsmodels.tsa.statespace.sarimax import SARIMAX 5from statsmodels.tsa.holtwinters import ExponentialSmoothing 6from datetime import timedelta 7import warnings 8 9warnings.filterwarnings("ignore") 10 11df = pd.read_csv('AEP.csv') 12 13# 转换数据类型 14df["Date"] = pd.to_datetime(df['Date'], format='%Y-%m-%d') 15 16# 将日期设为索引 17df = df.set_index('Date') 18 19# 去除异常值 20df = df[:-1] 21 22# 使用Holt-Winters模型进行未来预测 23freq=12 24hw_results = ExponentialSmoothing( 25 df['AEP_MW'], 26 trend='multiplicative', 27 seasonal='multiplicative', freq='M').fit() 28 29hw_predictions = hw_results.predict( 30 start=df.index.max()+timedelta(days=30), 31 end=df.index.max()+timedelta(days=12*30) 32 ) 33 34# 绘图展示历史数据与预测结果 35fig, ax = plt.subplots(figsize=(7, 4.5), dpi=300) 36 37ax.plot(df['AEP_MW'], label = "真实值") 38ax.plot(hw_predictions, label = "Holt-Winters 预测") 39plt.title("能源消耗") 40 41plt.legend() 42fig.savefig("output/output.png") 43plt.close(fig)