pipeline.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. # -*- coding: utf-8 -*-
  2. # @Author: Jin HuaiMing
  3. # @Date: 2025-08-11 15:19
  4. from torch.utils.data import Dataset,DataLoader
  5. import pandas as pd
  6. import torch
  7. from datetime import datetime, timedelta
  8. import os
  9. import numpy as np
  10. from sklearn.preprocessing import StandardScaler
  11. import joblib
  12. import glob
  13. class PipelineSolarDataset(Dataset):
  14. def __init__(self,
  15. input_folder,
  16. features,
  17. target,
  18. start_time,
  19. end_time,
  20. pre_seq,
  21. proj = 'OL_JIANGMEN',
  22. model_name = 'Dlinear',
  23. release = 'v1',
  24. saved_model_path = 'None',
  25. mode = 'train',
  26. capacity = 4050
  27. ):
  28. self.features = features
  29. self.target = target
  30. self.pre_seq = pre_seq
  31. self.proj = proj
  32. self.model_name = model_name
  33. self.release = release
  34. self.saved_model_path = saved_model_path
  35. self.mode = mode
  36. self.capacity = capacity
  37. if self.release == 'None':
  38. self.out_path = os.path.join(self.saved_model_path,self.proj,self.model_name,str(self.pre_seq))
  39. else:
  40. self.out_path = os.path.join(self.saved_model_path,self.proj,self.model_name,str(self.pre_seq),self.release)
  41. os.makedirs(self.out_path, exist_ok=True)
  42. files = []
  43. start_time = datetime.strptime(str(start_time), "%Y%m%d")
  44. end_time = datetime.strptime(str(end_time), "%Y%m%d")
  45. """按天遍历日期范围"""
  46. current = start_time
  47. while current <= end_time:
  48. file_00 = f'{input_folder}/{self.proj}/{current.strftime("%Y%m%d")}00.csv'
  49. file_12 = f'{input_folder}/{self.proj}/{current.strftime("%Y%m%d")}12.csv'
  50. if os.path.exists(file_00):
  51. files.append(file_00)
  52. if os.path.exists(file_12):
  53. files.append(file_12)
  54. current += timedelta(days=1)
  55. self.data_list = []
  56. # 将files每个文件对应的features列拼接到data_Scaler组成一个大的数组 (Sample, feature)
  57. scaler_arrays = []
  58. for f in files:
  59. df = pd.read_csv(f)
  60. # 判断截取pre_seq行,长度等于pre_seq,否则跳过
  61. if len(df.iloc[:self.pre_seq]) < self.pre_seq:
  62. continue
  63. # 保存原有data_list格式,便于原有get_item用
  64. self.data_list.append(
  65. {
  66. "x": df[self.features].to_numpy(),
  67. "y": df[self.target].to_numpy(),
  68. 'capacity': 4050
  69. }
  70. )
  71. # 训练模型制作归一化器
  72. if self.mode == 'train':
  73. # 只收集features, 拼接
  74. scaler_arrays.append(df[self.features].to_numpy()[:self.pre_seq])
  75. # 训练模型制作归一化器
  76. if self.mode == 'train':
  77. # 只收集features, 拼接
  78. scaler_arrays.append(df[self.features].to_numpy()[:self.pre_seq])
  79. if self.mode == 'train':
  80. scaler_arrays = np.concatenate(scaler_arrays, axis=0)
  81. # 保存归一化器到本地(例如.pkl文件,放到当前目录下)
  82. self.scaler = StandardScaler()
  83. self.scaler.fit(scaler_arrays)
  84. scaler_path = os.path.join(self.out_path, "scaler.pkl")
  85. joblib.dump(self.scaler, scaler_path)
  86. else:
  87. scaler_path = os.path.join(self.out_path, "scaler.pkl")
  88. if not os.path.exists(scaler_path):
  89. raise FileNotFoundError(f"Scaler file not found: {self.proj}-{self.model_name}-{self.pre_seq}-{self.release}")
  90. self.scaler = joblib.load(scaler_path)
  91. def __getitem__(self, idx):
  92. d = self.data_list[idx]
  93. # 应用self.scaler对x,y做归一化
  94. x_scaled = self.scaler.transform(d["x"][0:self.pre_seq, :])
  95. x = torch.tensor(x_scaled, dtype=torch.float32).view(self.pre_seq, d["x"].shape[1])
  96. y = torch.tensor(d["y"][0:self.pre_seq] / d['capacity'], dtype=torch.float32)
  97. # x = [batch, input_len, n_features]
  98. # y = [batch, output_len]
  99. return (x, y)
  100. def __len__(self):
  101. return len(self.data_list)
  102. if __name__ == "__main__":
  103. data = PipelineSolarDataset(
  104. "/home/jinhuaiming/OuLiPowerV1.0/data/short_term",
  105. ['ssrd','tcc','lcc','mcc','hcc','2t','2d','10u','10v'],
  106. '实际发电功率(kW)',
  107. "20250614",
  108. "20260331",
  109. 288,
  110. proj = 'JMJD01',
  111. model_name = 'GRU',
  112. release = 'v24',
  113. saved_model_path = '/home/jinhuaiming/OuLiPowerV1.0/saved_model',
  114. mode = 'train',
  115. capacity = 4050
  116. )
  117. dataload = DataLoader(dataset=data, batch_size=1)
  118. print(len(data))
  119. for item in dataload:
  120. x1, x2 = item
  121. print(x2)