您现在的位置:首页 >> 环保新闻

实战演练 | 指数平滑之能源供应需求预测

时间:2023-04-04 12:19:14

2].shape[0]

清洗资料

根据以上核查,发现资料相对还是比较干净的,但有2点缺陷:

1.翌年份有每一次 -> 以上核查中都可以看到资料并不是完仅有每一次,确实似乎偶有一分钟内多次上传资料,此时为了资料分层统一,摒弃较早的一条。

2.资料有漏报 -> 因光度计/网络等设施缺陷难免有资料漏报的情形,当前资料漏报间隔较短且漏报次数较不及,可以用到插数值的原理说明漏报资料。

# 去重 df.drop_duplicates(subset='Datetime', keep='last', inplace=True) # 插数值 df.set_index('Datetime', inplace=True) date_range = pd.date_range(start=df.index.min(), end=df.index.max(), freq='H') df = df.reindex(date_range) df['PJME_MW'].interpolate(method='linear', inplace=True) print(df) # 删掉临时列 df.drop('SPAN', axis=1, inplace=True)

拆分专业训练集/检验集

需求为预测期望1年的资料,首先一个缺陷是不管用什么仿真都至不及要有一份资料需要检验仿真效果。所以首先要拆分专业训练集和检验集,如果要非常精准的检验仿真效果还需拆分测试集。等待时间氨基酸中都一般根据等待时间拆分,较早的一直资料用于专业训练仿真,不太可能的一直用于检验/测试仿真效果。

比如我们要用过去5年的资料专业训练仿真,可以留出不太可能1年的资料作为检验集,再往前后下5年的资料做专业训练集。

train_years = 5 val_years = 1 last_date = df.index[-1] val_start_date = last_date - pd.DateOffset(years=val_years) train_start_date = val_start_date - pd.DateOffset(years=train_years) print(train_start_date, val_start_date, last_date)

df_train = df.loc[(df.index>= train_start_date) Company (df.index < val_start_date)] df_val = df.loc[df.index>= val_start_date]

专业训练仿真

仿真可选择

从资料的利用计算机上图中都能直观的看出来,当前资料为无渐进的短周期型等待时间氨基酸资料,短周期不等为1年。本次限定用到指数光滑原理,有短周期故用到三次指数光滑(Holt-Winters)原理,具体用到秋冬季DFT仿真还是乘法仿真可进行实验根据风险评估指标可选择。

仿真专业训练

>> 风险评估指标:MAPE

def mape(y_true, y_pred): y_true, y_pred = np.array(y_true), np.array(y_pred) pe = (y_true - y_pred) / y_true ape = np.abs(pe) mape = np.mean(ape) return f'{mape*100:.2f}%'

>> 专业训练仿真

短周期不等为24*365(一年,每天24个资料点),无渐进不而无须trend,有秋冬季暂而无须为DFT仿真。

仿真专业训练时回避资料量非常大,设置仿真数值初始数值不进行暴力搜索,建模算法用到‘L-BFGS-B’,目的为提高计算速度,不然实在太慢。

periods = 24*365 fit = ExponentialSmoothing(df_train['PJME_MW'], seasonal_periods=periods, seasonal='add').fit(method='L-BFGS-B', use_brute=False) print(fit) fcast = fit.forecast(len(df_val)) mape_hw = mape(y_true=df_val['PJME_MW'], y_pred=fcast) print(f'Our Holt-Winter model has a mean average percentage error of {mape_hw}')

>> 数值调优

HW中都的数值用到‘L-BFGS-B’建模算法自动建模,对比秋冬季DFT仿真,乘法仿真效果较好MAPE为11.75%。

fit = ExponentialSmoothing(df_train['PJME_MW'], seasonal_periods=periods, seasonal='mul').fit(method='L-BFGS-B', use_brute=False) fcast = fit.forecast(len(df_val)) mape_hw = mape(y_true=df_val['PJME_MW'], y_pred=fcast) print(f'Our Holt-Winter model has a mean average percentage error of {mape_hw1}')

仿真数据分析

通过进一步数据分析,认为用到7年资料专业训练仿真效果较好,此时在近1年上的检验集上MAPE为9.7%。

数据分析具体内容有以下两点:

(1). 数据分析专业训练资料的不等对仿真效果的影响

(2). 数据分析仿真在各有不同年份上的展现看仿真究竟稳定

def test_train_size(df): val_years = 1 periods = 24*365 for train_years in range(1,10): # 拆分翌年份 last_date = df.index[-1] val_start_date = last_date - pd.DateOffset(years=val_years) train_start_date = val_start_date - pd.DateOffset(years=train_years) # 专业训练集/检验集 df_train = df.loc[(df.index>= train_start_date) Company (df.index < val_start_date)] df_val = df.loc[df.index>= val_start_date] # 仿真专业训练 fit = ExponentialSmoothing(df_train['PJME_MW'], seasonal_periods=periods, seasonal='mul').fit(method='L-BFGS-B', use_brute=False) # 仿真预测 fcast = fit.forecast(len(df_val)) # 仿真风险评估 mape_hw = mape(y_true=df_val['PJME_MW'], y_pred=fcast) # 打印结果 if train_years == 1: val_date_desc = 'val_date_range : {}-{}'.format(val_start_date.strftime('%Y%m%d'), last_date.strftime('%Y%m%d')) print(val_date_desc) train_date_desc = 'train_date_range: {}-{}'.format(train_start_date.strftime('%Y%m%d'), val_start_date.strftime('%Y%m%d')) print(train_date_desc, 'train_years:', train_years, 'mape:', mape_hw) # 数据分析各有不同年翌年专业训练资料在18年(20170803-20180803)检验集上的展现 test_train_size(df) # 数据分析各有不同年翌年专业训练资料在17年(20160803-20170803)检验集上的展现 last_date = df.index[-1] - pd.DateOffset(years=1) test_train_size(df.loc[df.index<=last_date])

仿真预测

确定专业训练资料等待多世纪及仿真各项数值后,用到最新资料重新专业训练仿真,并预测期望一直的能源需求。

# 起始翌年份 last_date = df.index[-1] train_start_date = last_date - pd.DateOffset(years=7) # 专业训练集 df_train = df.loc[df.index>= train_start_date] # 仿真专业训练 fit = ExponentialSmoothing(df_train['PJME_MW'], seasonal_periods=periods, seasonal='mul').fit(method='L-BFGS-B', use_brute=False) # 仿真预测 fcast = fit.forecast(24*365) date_range = pd.date_range(start=df_train.index.min(), end=fcast.index.max(), freq='H') df_train = df_train.reindex(date_range) df_train['predict'] = fcast print(fcast.index.min(), fcast.index.max()) # 利用计算机 plt.figure(figsize=(20,4)) df_train['PJME_MW'].plot() df_train['predict'].plot() plt.xlabel('Date Company Time') plt.ylabel('Energy Demand [MW]') plt.title('Holt-Winter Forecast of Hourly Energy Demand') plt.show()

【声明】本文版权保护归制作者所有,具体内容为作者个人观点,转载目的在于传递非常多信息,如涉及作品具体内容、版权保护等缺陷,可联系本站删掉,谢谢。。

江西白癜风医院排行榜
江苏妇科专科医院哪个好
江苏白癜风医院哪家更好
成都试管婴儿做方法
郑州治疗不孕不育医院
相关阅读