material.py 4.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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 types
  8. import pandas as pd
  9. from pathlib import Path
  10. from app.common.config import logger, parser
  11. from concurrent.futures import ThreadPoolExecutor
  12. from functools import partial
  13. class MaterialLoader:
  14. def __init__(self, base_path, lazy_load=True):
  15. self.base_path = Path(base_path)
  16. self.lazy_load = lazy_load
  17. self._data_cache = {}
  18. self.opt = parser.parse_args_and_yaml()
  19. def wrapper_path(self, station_id, spec):
  20. return f"{self.base_path/station_id/spec}.txt"
  21. def _load_material(self, station_id):
  22. """核心数据加载方法"""
  23. # 根据您的原始代码逻辑简化的加载流程
  24. try:
  25. basic = pd.read_csv(self.wrapper_path(station_id, self.opt.doc_mapping['basic']), sep=r'\s+', header=0)
  26. power = pd.read_csv(self.wrapper_path(station_id, self.opt.doc_mapping['power']), sep=r'\s+', header=0)
  27. plant_type = int(basic.loc[basic['PropertyID'].tolist().index('PlantType'), 'Value'])
  28. assert plant_type == 0 or plant_type == 1
  29. # 根据电站类型加载数据
  30. nwp_v = pd.read_csv(self.wrapper_path(station_id, f"0/{self.opt.doc_mapping['nwp_v']}"), sep=r'\s+', header=0)
  31. 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)
  32. nwp_own = pd.read_csv(self.wrapper_path(station_id, f"1/{self.opt.doc_mapping['nwp_own']}"), sep=r'\s+', header=0)
  33. 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)
  34. if self.opt.switch_nwp_owner:
  35. nwp_v, nwp_v_h = nwp_own, nwp_own_h
  36. # 如果是风电
  37. if plant_type == 0:
  38. station_info = pd.read_csv(self.wrapper_path(station_id, self.opt.doc_mapping['station_info_w']), sep=r'\s+', header=0)
  39. station_info_d = pd.read_csv(self.wrapper_path(station_id, self.opt.doc_mapping['station_info_d_w']), sep=r'\s+', header=0)
  40. nwp = pd.read_csv(self.wrapper_path(station_id, self.opt.doc_mapping['nwp_w']), sep=r'\s+', header=0)
  41. nwp_h = pd.read_csv(self.wrapper_path(station_id, self.opt.doc_mapping['nwp_w_h']), sep=r'\s+', header=0)
  42. cap = float(station_info.loc[0, 'PlantCap'])
  43. if Path(self.wrapper_path(station_id, self.opt.doc_mapping['env_wf'])).exists():
  44. env = pd.read_csv(self.wrapper_path(station_id, self.opt.doc_mapping['env_wf']), sep=r'\s+', header=0)
  45. else:
  46. env = None
  47. # 如果是光伏
  48. else:
  49. station_info = pd.read_csv(self.wrapper_path(station_id, self.opt.doc_mapping['station_info_s']), sep=r'\s+', header=0)
  50. station_info_d = pd.read_csv(self.wrapper_path(station_id, self.opt.doc_mapping['station_info_d_s']), sep=r'\s+', header=0)
  51. nwp = pd.read_csv(self.wrapper_path(station_id, self.opt.doc_mapping['nwp_s']), sep=r'\s+', header=0)
  52. nwp_h = pd.read_csv(self.wrapper_path(station_id, self.opt.doc_mapping['nwp_s_h']), sep=r'\s+', header=0)
  53. cap = float(station_info.loc[0, 'PlantCap'])
  54. if Path(self.wrapper_path(station_id, self.opt.doc_mapping['env_sf'])).exists():
  55. env = pd.read_csv(self.wrapper_path(station_id, self.opt.doc_mapping['env_sf']), sep=r'\s+', header=0)
  56. else:
  57. env = None
  58. return types.SimpleNamespace(**{
  59. 'station_info': station_info,
  60. 'station_info_d': station_info_d,
  61. 'nwp': nwp,
  62. 'nwp_h': nwp_h,
  63. 'power': power,
  64. 'nwp_v': nwp_v,
  65. 'nwp_v_h': nwp_v_h,
  66. 'env': env,
  67. 'cap': cap
  68. })
  69. except Exception as e:
  70. print(f"Error loading {station_id}: {str(e)}")
  71. return None
  72. def get_material(self, station_id):
  73. if self.lazy_load:
  74. if station_id not in self._data_cache:
  75. self._data_cache[station_id] = self._load_material(station_id)
  76. return self._data_cache[station_id]
  77. else:
  78. return self._load_material(station_id)
  79. if __name__ == "__main__":
  80. run_code = 0