forked from EEBD_AI/wgz_forecast
创建光伏出力预测模型
This commit is contained in:
parent
38b27aa875
commit
73de0634bf
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,35 @@
|
|||
import os
|
||||
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"
|
||||
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
|
||||
def time_series_to_supervised(data, n_in=10, n_out=1,dropnan=True):
|
||||
"""
|
||||
:param data:作为列表或2D NumPy数组的观察序列。需要。
|
||||
:param n_in:作为输入的滞后观察数(X)。值可以在[1..len(数据)]之间可选。默认为1。
|
||||
:param n_out:作为输出的观测数量(y)。值可以在[0..len(数据)]之间。可选的。默认为1。
|
||||
:param dropnan:Boolean是否删除具有NaN值的行。可选的。默认为True。
|
||||
:return:
|
||||
"""
|
||||
n_vars = 1 if type(data) is list else data.shape[1]
|
||||
df = pd.DataFrame(data)
|
||||
origNames = df.columns
|
||||
cols, names = list(), list()
|
||||
cols.append(df.shift(0))
|
||||
names += [('%s' % origNames[j]) for j in range(n_vars)]
|
||||
n_in = max(1, n_in)
|
||||
for i in range(n_in-1, 0, -1):
|
||||
time = '(t-%d)' % i
|
||||
cols.append(df.shift(i))
|
||||
names += [('%s%s' % (origNames[j], time)) for j in range(n_vars)]
|
||||
n_out = max(n_out, 0)
|
||||
for i in range(1, n_out+1):
|
||||
time = '(t+%d)' % i
|
||||
cols.append(df.shift(-i))
|
||||
names += [('%s%s' % (origNames[j], time)) for j in range(n_vars)]
|
||||
agg = pd.concat(cols, axis=1)
|
||||
agg.columns = names
|
||||
if dropnan:
|
||||
agg.dropna(inplace=True)
|
||||
return agg
|
|
@ -0,0 +1,58 @@
|
|||
import numpy as np
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
from vmdpy import VMD
|
||||
from skopt import gp_minimize
|
||||
from skopt.space import Real, Integer, Categorical
|
||||
from skopt.utils import use_named_args
|
||||
|
||||
|
||||
# 加载数据
|
||||
def do_vmd(dataframe):
|
||||
signal = dataframe['power'].values
|
||||
# 定义VMD函数,用于优化过程
|
||||
def vmd_objective(params):
|
||||
alpha, tau, K, DC, init, tol = params
|
||||
u, u_hat, omega = VMD(signal, alpha, tau, K, DC, init, tol)
|
||||
# 定义目标函数,这里使用模态的平均带宽作为优化目标
|
||||
# 你可以根据实际需求定义其他目标函数
|
||||
objective = np.mean([np.diff(np.where(um != 0)) for um in u])
|
||||
return -objective # gp_minimize用于最小化,所以取负值
|
||||
|
||||
# 定义参数空间
|
||||
space = [
|
||||
Real(low=2, high=100, prior='log-uniform', name='alpha'),
|
||||
Real(low=0, high=1, name='tau'),
|
||||
Integer(low=2, high=10, name='K'),
|
||||
Categorical(categories=[0, 1], name='DC'),
|
||||
Categorical(categories=[0, 1], name='init'),
|
||||
Real(low=1e-6, high=1e-2, prior='log-uniform', name='tol')
|
||||
]
|
||||
|
||||
# 使用贝叶斯优化
|
||||
@use_named_args(space)
|
||||
def objective_function(alpha, tau, K, DC, init, tol):
|
||||
return vmd_objective((alpha, tau, K, DC, init, tol))
|
||||
|
||||
result = gp_minimize(objective_function, space, n_calls=50, random_state=0)
|
||||
|
||||
print('最优参数:', result.x)
|
||||
print('最优目标函数值:', -result.fun) # 取负值回到原始目标函数的值
|
||||
|
||||
# 使用找到的最优参数进行VMD分解
|
||||
alpha_opt, tau_opt, K_opt, DC_opt, init_opt, tol_opt = result.x
|
||||
u_opt, u_hat_opt, omega_opt = VMD(signal, alpha_opt, tau_opt, K_opt, DC_opt, init_opt, tol_opt)
|
||||
|
||||
# 保存或处理分解得到的模态函数
|
||||
best_params = [alpha_opt, tau_opt, K_opt, DC_opt, init_opt, tol_opt]
|
||||
vmd_rst = u_opt.T
|
||||
|
||||
|
||||
vmd_train_data = pd.concat([data2vmd, pd.DataFrame.from_records(vmd_rst, index=data2vmd.index, columns=[f"vmd_{x}"for x in range(vmd_rst.shape[1])])], axis=1)
|
||||
|
||||
return vmd_train_data
|
||||
|
||||
if __name__ == '__main__':
|
||||
data2vmd = pd.read_csv('./data/pv_data_hourly.csv', index_col=0)
|
||||
train_data = do_vmd(data2vmd)
|
||||
train_data.to_csv('./data/vmd_train.csv', index=False, encoding='utf-8-sig')
|
|
@ -0,0 +1,7 @@
|
|||
numpy==2.0.2
|
||||
pandas==2.2.3
|
||||
EMD_signal==1.6.0
|
||||
vmdpy==0.2
|
||||
PyEMD==1.0.0
|
||||
scikit-optimize==0.10.1
|
||||
scikit_learn==1.2.1
|
Loading…
Reference in New Issue