| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- # -*- coding: utf-8 -*-
- # @Author: Jin HuaiMing
- # @Date: 2025-08-11 15:19
- from torch.utils.data import Dataset,DataLoader
- import pandas as pd
- import torch
- from datetime import datetime, timedelta
- import os
- import numpy as np
- from sklearn.preprocessing import StandardScaler
- import joblib
- import glob
- class PipelineSolarDataset(Dataset):
- def __init__(self,
- input_folder,
- features,
- target,
- start_time,
- end_time,
- pre_seq,
- proj = 'OL_JIANGMEN',
- model_name = 'Dlinear',
- release = 'v1',
- saved_model_path = 'None',
- mode = 'train',
- capacity = 4050
- ):
-
- self.features = features
- self.target = target
- self.pre_seq = pre_seq
- self.proj = proj
- self.model_name = model_name
- self.release = release
- self.saved_model_path = saved_model_path
- self.mode = mode
- self.capacity = capacity
- if self.release == 'None':
- self.out_path = os.path.join(self.saved_model_path,self.proj,self.model_name,str(self.pre_seq))
- else:
- self.out_path = os.path.join(self.saved_model_path,self.proj,self.model_name,str(self.pre_seq),self.release)
-
- os.makedirs(self.out_path, exist_ok=True)
- files = []
- start_time = datetime.strptime(str(start_time), "%Y%m%d")
- end_time = datetime.strptime(str(end_time), "%Y%m%d")
- """按天遍历日期范围"""
- current = start_time
- while current <= end_time:
- file_00 = f'{input_folder}/{self.proj}/{current.strftime("%Y%m%d")}00.csv'
- file_12 = f'{input_folder}/{self.proj}/{current.strftime("%Y%m%d")}12.csv'
- if os.path.exists(file_00):
- files.append(file_00)
- if os.path.exists(file_12):
- files.append(file_12)
- current += timedelta(days=1)
-
-
- self.data_list = []
- # 将files每个文件对应的features列拼接到data_Scaler组成一个大的数组 (Sample, feature)
- scaler_arrays = []
- for f in files:
- df = pd.read_csv(f)
- # 判断截取pre_seq行,长度等于pre_seq,否则跳过
- if len(df.iloc[:self.pre_seq]) < self.pre_seq:
- continue
- # 保存原有data_list格式,便于原有get_item用
- self.data_list.append(
- {
- "x": df[self.features].to_numpy(),
- "y": df[self.target].to_numpy(),
- 'capacity': 4050
- }
- )
- # 训练模型制作归一化器
- if self.mode == 'train':
- # 只收集features, 拼接
- scaler_arrays.append(df[self.features].to_numpy()[:self.pre_seq])
- # 训练模型制作归一化器
- if self.mode == 'train':
- # 只收集features, 拼接
- scaler_arrays.append(df[self.features].to_numpy()[:self.pre_seq])
- if self.mode == 'train':
- scaler_arrays = np.concatenate(scaler_arrays, axis=0)
- # 保存归一化器到本地(例如.pkl文件,放到当前目录下)
- self.scaler = StandardScaler()
- self.scaler.fit(scaler_arrays)
- scaler_path = os.path.join(self.out_path, "scaler.pkl")
- joblib.dump(self.scaler, scaler_path)
- else:
- scaler_path = os.path.join(self.out_path, "scaler.pkl")
- if not os.path.exists(scaler_path):
- raise FileNotFoundError(f"Scaler file not found: {self.proj}-{self.model_name}-{self.pre_seq}-{self.release}")
- self.scaler = joblib.load(scaler_path)
-
- def __getitem__(self, idx):
- d = self.data_list[idx]
- # 应用self.scaler对x,y做归一化
- x_scaled = self.scaler.transform(d["x"][0:self.pre_seq, :])
- x = torch.tensor(x_scaled, dtype=torch.float32).view(self.pre_seq, d["x"].shape[1])
- y = torch.tensor(d["y"][0:self.pre_seq] / d['capacity'], dtype=torch.float32)
- # x = [batch, input_len, n_features]
- # y = [batch, output_len]
- return (x, y)
- def __len__(self):
- return len(self.data_list)
- if __name__ == "__main__":
-
- data = PipelineSolarDataset(
- "/home/jinhuaiming/OuLiPowerV1.0/data/short_term",
- ['ssrd','tcc','lcc','mcc','hcc','2t','2d','10u','10v'],
- '实际发电功率(kW)',
- "20250614",
- "20260331",
- 288,
- proj = 'JMJD01',
- model_name = 'GRU',
- release = 'v24',
- saved_model_path = '/home/jinhuaiming/OuLiPowerV1.0/saved_model',
- mode = 'train',
- capacity = 4050
- )
-
- dataload = DataLoader(dataset=data, batch_size=1)
- print(len(data))
- for item in dataload:
- x1, x2 = item
- print(x2)
-
|