material.py 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # @FileName :material.py
  4. # @Time :2025/4/29 11:07
  5. # @Author :David
  6. # @Company: shenyang JY
  7. import os.path
  8. import types
  9. import pandas as pd
  10. from pathlib import Path
  11. from app.common.config import logger, parser
  12. from concurrent.futures import ThreadPoolExecutor
  13. from functools import partial
  14. class MaterialLoader:
  15. def __init__(self, base_path, lazy_load=True):
  16. self.base_path = Path(base_path)
  17. self.lazy_load = lazy_load
  18. self._data_cache = {}
  19. self.opt = parser.parse_args_and_yaml()
  20. def wrapper_path(self, station_id, spec):
  21. return f"{self.base_path/station_id/spec}.txt"
  22. def _load_material(self, station_id):
  23. """核心数据加载方法"""
  24. # 根据您的原始代码逻辑简化的加载流程
  25. try:
  26. basic = pd.read_csv(self.wrapper_path(station_id, self.opt.doc_mapping['basic']), sep=r'\s+', header=0)
  27. power = pd.read_csv(self.wrapper_path(station_id, self.opt.doc_mapping['power']), sep=r'\s+', header=0)
  28. plant_type = int(basic.loc[basic['PropertyID'].tolist().index('PlantType'), 'Value'])
  29. assert plant_type == 0 or plant_type == 1
  30. # 根据电站类型加载数据
  31. nwp_v = pd.read_csv(self.wrapper_path(station_id, f"0/{self.opt.doc_mapping['nwp_v']}"), sep=r'\s+', header=0)
  32. nwp_v_h = pd.read_csv(self.wrapper_path(station_id, f"0/{self.opt.doc_mapping['nwp_v_h']}"), sep=r'\s+', header=0)
  33. nwp_own = pd.read_csv(self.wrapper_path(station_id, f"1/{self.opt.doc_mapping['nwp_own']}"), sep=r'\s+', header=0)
  34. nwp_own_h = pd.read_csv(self.wrapper_path(station_id, f"1/{self.opt.doc_mapping['nwp_own_h']}"), sep=r'\s+', header=0)
  35. if self.opt.switch_nwp_owner:
  36. nwp_v, nwp_v_h = nwp_own, nwp_own_h
  37. # 如果是风电
  38. if plant_type == 0:
  39. station_info = pd.read_csv(self.wrapper_path(station_id, self.opt.doc_mapping['station_info_w']), sep=r'\s+', header=0)
  40. station_info_d = pd.read_csv(self.wrapper_path(station_id, self.opt.doc_mapping['station_info_d_w']), sep=r'\s+', header=0)
  41. nwp = pd.read_csv(self.wrapper_path(station_id, self.opt.doc_mapping['nwp_w']), sep=r'\s+', header=0)
  42. nwp_h = pd.read_csv(self.wrapper_path(station_id, self.opt.doc_mapping['nwp_w_h']), sep=r'\s+', header=0)
  43. cap = float(station_info.loc[0, 'PlantCap'])
  44. if Path(self.wrapper_path(station_id, self.opt.doc_mapping['env_wf'])).exists():
  45. env = pd.read_csv(self.wrapper_path(station_id, self.opt.doc_mapping['env_wf']), sep=r'\s+', header=0)
  46. else:
  47. env = None
  48. # 如果是光伏
  49. else:
  50. station_info = pd.read_csv(self.wrapper_path(station_id, self.opt.doc_mapping['station_info_s']), sep=r'\s+', header=0)
  51. station_info_d = pd.read_csv(self.wrapper_path(station_id, self.opt.doc_mapping['station_info_d_s']), sep=r'\s+', header=0)
  52. nwp = pd.read_csv(self.wrapper_path(station_id, self.opt.doc_mapping['nwp_s']), sep=r'\s+', header=0)
  53. nwp_h = pd.read_csv(self.wrapper_path(station_id, self.opt.doc_mapping['nwp_s_h']), sep=r'\s+', header=0)
  54. cap = float(station_info.loc[0, 'PlantCap'])
  55. if Path(self.wrapper_path(station_id, self.opt.doc_mapping['env_sf'])).exists():
  56. env = pd.read_csv(self.wrapper_path(station_id, self.opt.doc_mapping['env_sf']), sep=r'\s+', header=0)
  57. else:
  58. env = None
  59. return types.SimpleNamespace(**{
  60. 'station_info': station_info,
  61. 'station_info_d': station_info_d,
  62. 'nwp': nwp,
  63. 'nwp_h': nwp_h,
  64. 'power': power,
  65. 'nwp_v': nwp_v,
  66. 'nwp_v_h': nwp_v_h,
  67. 'env': env,
  68. 'cap': cap
  69. })
  70. except Exception as e:
  71. print(f"Error loading {station_id}: {str(e)}")
  72. return None
  73. def get_material(self, station_id):
  74. if self.lazy_load:
  75. if station_id not in self._data_cache:
  76. self._data_cache[station_id] = self._load_material(station_id)
  77. return self._data_cache[station_id]
  78. else:
  79. return self._load_material(station_id)
  80. def add_weights(self, data_objects):
  81. """对nwp数据进行cap加权(nwp, nwp_h, nwp_v_, nwp_v_h)"""
  82. def local_sum(df, weight):
  83. """内部函数:对DataFrame进行加权求和"""
  84. weighted_df = df.copy()
  85. columns_to_scale = [col for col in df.columns if col not in ['PlantID', 'PlantName', 'PlantType', 'Qbsj', 'Datetime']]
  86. weighted_df[columns_to_scale] = weighted_df[columns_to_scale] * weight
  87. return weighted_df, weight
  88. # 从data_objects解构对象
  89. nwp, nwp_h, nwp_v, nwp_v_h, power, cap = (
  90. data_objects.nwp,
  91. data_objects.nwp_h,
  92. data_objects.nwp_v,
  93. data_objects.nwp_v_h,
  94. data_objects.power,
  95. data_objects.cap
  96. )
  97. # 对每个NWP数据集进行容量加权
  98. weighted_nwp, cap = local_sum(nwp, cap)
  99. weighted_nwp_h, _ = local_sum(nwp_h, cap)
  100. weighted_nwp_v, _ = local_sum(nwp_v, cap)
  101. weighted_nwp_v_h, _ = local_sum(nwp_v_h, cap)
  102. return {
  103. 'nwp': weighted_nwp,
  104. 'nwp_h': weighted_nwp_h,
  105. 'nwp_v': weighted_nwp_v,
  106. 'nwp_v_h': weighted_nwp_v_h,
  107. 'cap': cap
  108. }
  109. def get_material_region(self):
  110. try:
  111. basic = pd.read_csv(os.path.join(self.base_path, self.opt.doc_area_mapping['basic']+'.txt'), sep=r'\s+', header=0)
  112. power = pd.read_csv(os.path.join(self.base_path, self.opt.doc_area_mapping['power']+'.txt'), sep=r'\s+', header=0)
  113. plant_type = int(basic.loc[basic['PropertyID'].tolist().index('PlantType'), 'Value'])
  114. area_id = int(basic.loc[basic['PropertyID'].tolist().index('AreaId'), 'Value'])
  115. assert plant_type == 0 or plant_type == 1
  116. area_cap = float(basic.loc[basic['PropertyID'].tolist().index('AreaCap'), 'Value'])
  117. return types.SimpleNamespace(**{
  118. 'power': power,
  119. 'area_cap': area_cap,
  120. 'area_id': area_id
  121. })
  122. except Exception as e:
  123. print(f"Region Error loading: {str(e)}")
  124. return None
  125. if __name__ == "__main__":
  126. run_code = 0