电力系统负荷预测包含不同类型变电站电站和母线出线端负荷等数据,对每15分钟为一个时间间隔的负荷数据进行数据处理与建模,预测未来多天的负荷数据。电网线路连接情况复杂,需预测结果数量非常多。
针对问题一本次赛题为长序列时间序列预测任务,该Baseline对数据进行了处理与特征提取,基于5折LightGBM全流程运行时间一般在2分钟内。本次代码首先对数据进行可视化,其次对数据进行特征工程,最后通过机器学习catboost、xgboost、lightgbm进行预测,文中包括数据清洗、特征工程、模型预测以及后期优化策略,神经网络代码LSTM以及时序prophet模型、ARIMA。
tianqi['白天风力风向'].unique()
tianqi['夜晚风力风向'].unique()
dic = {'无持续风向<3级':0,
'北风3~4级':1,
'北风4~5级':2}
tianqi['白天风力风向'] = tianqi['白天风力风向'].map(dic)
tianqi['夜晚风力风向'] = tianqi['夜晚风力风向'].map(dic)# # 天气进行有序编码
tianqi['天气1'].unique()tianqi['天气2'].unique()
dic1 = {'晴':1,
'多云':2,
'阴':3, '小雨':4,
'小雨-中雨':5,
'中雨':6,
'中雨-大雨':7,
'大雨':8}
tianqi['天气1'] = tianqi['天气1'].map(dic1)
tianqi['天气2'] = tianqi['天气2'].map(dic1)
del tianqi['天气状况']# # 连接两张表
y = y.rename(columns={'数据时间':'日期1'})
y['日期'] = y['日期1'].apply(lambda x: x.split(' ')[0])
tianqi.loc[:, '日期'] = pd.to_datetime(tianqi.loc[:, '日期'], format='%Y年%m月%d日', errors='coerce')
y.loc[:, '日期'] = pd.to_datetime(y.loc[:, '日期'], format='%Y/%m/%d', errors='coerce')
train = y.merge(tianqi,on='日期',how='left')del train['日期'] # # 时序特征提取(后期直接加入测试集数据)
train['日期1'] = pd.to_datetime(train['日期1'])train['月'] = train['日期1'].dt.month train['天'] = train['日期1'].dt.day
train['小时'] = train['日期1'].dt.hourtrain['一年第几天'] = train['日期1'].dt.dayofyeartrain['一年第几周'] = train['日期1'].dt.week
部分可视化
针对问题二,时间突变检测,包括MK突变检验,统计学检验,t检验,多种检验方式。
def plot_anomaly(ts,anomaly_pred = None,anomaly_true=None,file_name = 'file'): fig = go.Figure() yhat = go.Scatter( x = ts.index, y = ts, mode = 'lines', name = ts.name) fig.add_trace(yhat) if anomaly_pred is not None: status = go.Scatter( x = anomaly_pred.index, y = ts.loc[anomaly_pred.index], mode = 'markers', name = anomaly_pred.name,marker= {'color':'red','size':10,'symbol':'star','line_width':0}) fig.add_trace(status) if anomaly_true is not None: status = go.Scatter( x = anomaly_true.index, y = ts.loc[anomaly_true.index], mode = 'markers', name = anomaly_true.name,marker= {'color':'yellow','size':10,'symbol':'star-open','line_width':2}) fig.add_trace(status) fig.show() def plot_anomaly_window(ts,anomaly_pred = None,file_name = 'file',window='1h'): fig = go.Figure() yhat = go.Scatter( x = ts.index, y = ts, mode = 'lines', name = ts.name) fig.add_trace(yhat) if anomaly_pred is not None: for i in anomaly_pred.index: fig.add_vrect(x0=i - pd.Timedelta(window),x1= i,line_width=0, fillcolor="red", opacity=0.2) fig.show()