1
0
Fork 0

创建光伏出力预测模型

This commit is contained in:
default 2025-02-07 07:45:03 +00:00
parent 38b27aa875
commit 73de0634bf
9 changed files with 23971 additions and 0 deletions

0
pv/__init__.py Normal file
View File

11617
pv/data/pv_data_hourly.csv Normal file

File diff suppressed because it is too large Load Diff

11617
pv/data/vmd_train.csv Normal file

File diff suppressed because it is too large Load Diff

637
pv/matrix2series.ipynb Normal file

File diff suppressed because one or more lines are too long

0
pv/pv_inference.py Normal file
View File

35
pv/pv_train.py Normal file
View File

@ -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

58
pv/vmd_decom.py Normal file
View File

@ -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')

7
requirements.txt Normal file
View File

@ -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

0
run.py Normal file
View File