main410.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # time: 2023/3/2 10:28
  4. # file: config.py
  5. # author: David
  6. # company: shenyang JY
  7. """
  8. 模型调参及系统功能配置
  9. """
  10. import argparse
  11. import pandas as pd
  12. from pathlib import Path
  13. from app.common.logs import params, logger
  14. """"
  15. 调用思路
  16. xxxx 1. 从入口参数中获取IN OUT文件位置 xxxx
  17. 2. 按照训练和预测加载和解析数据
  18. 3. 对数据进行预处理
  19. 4. 执行训练,保存模型,输出状态
  20. 5. 执行预测,输出结果,输出状态
  21. """
  22. def material(input_file, isDq=True):
  23. basi, station_info_w, station_info_d_w, station_info_s, station_info_d_s, nwp_w, nwp_s, nwp_w_h, nwp_s_h, power = (
  24. 'DQYC_IN_BASIC.txt', 'DQYC_IN_PLANT_WIND.txt', 'DQYC_IN_PLANT_DETAIL_WIND.txt', 'DQYC_IN_PLANT_SOLAR.txt',
  25. 'DQYC_IN_PLANT_DETAIL_SOLAR.txt', 'DQYC_IN_FORECAST_WEATHER_WIND.txt', 'DQYC_IN_FORECAST_WEATHER_SOLAR.txt',
  26. 'DQYC_IN_FORECAST_WEATHER_WIND_H.txt', 'DQYC_IN_FORECAST_WEATHER_SOLAR_H.txt', 'DQYC_IN_HISTORY_POWER_LONG.txt')
  27. basi_area = 'DQYC_AREA_IN_BASIC'
  28. nwp_v, nwp_v_h = 'DQYC_IN_FORECAST_WEATHER.txt', 'DQYC_IN_FORECAST_WEATHER_H.txt' # 多版本气象
  29. nwp_own, nwp_own_h = 'DQYC_IN_FORECAST_WEATHER_OWNER.txt', 'DQYC_IN_FORECAST_WEATHER_OWNER_H.txt', # 自有气象
  30. env_wf, env_sf = 'DQYC_IN_ACTUAL_WEATHER_WIND', 'DQYC_IN_ACTUAL_WEATHER_SOLAR' # 实测气象
  31. input_file = Path(input_file)
  32. env_w, env_s = None, None
  33. basic = pd.read_csv(input_file / basi, sep=r'\s+', header=0)
  34. power = pd.read_csv(input_file / power, sep=r'\s+', header=0)
  35. plant_type = int(basic.loc[basic['PropertyID'].to_list().index(('PlantType')), 'Value'])
  36. if isDq:
  37. nwp_v = pd.read_csv(input_file / '0' / nwp_v, sep=r'\s+', header=0)
  38. nwp_v_h = pd.read_csv(input_file / '0' / nwp_v_h, sep=r'\s+', header=0)
  39. nwp_own = pd.read_csv(input_file / '1' / nwp_own, sep=r'\s+', header=0)
  40. nwp_own_h = pd.read_csv(input_file / '1' / nwp_own_h, sep=r'\s+', header=0)
  41. if params['switch_nwp_owner']:
  42. nwp_v, nwp_v_h = nwp_own, nwp_own_h
  43. # 如果是风电
  44. if plant_type == 0:
  45. station_info = pd.read_csv(input_file / station_info_w, sep=r'\s+', header=0)
  46. station_info_d = pd.read_csv(input_file / station_info_d_w, sep=r'\s+', header=0)
  47. nwp = pd.read_csv(input_file / nwp_w, sep=r'\s+', header=0)
  48. nwp_h = pd.read_csv(input_file / nwp_w_h, sep=r'\s+', header=0)
  49. if (input_file / env_wf).exists():
  50. env_w = pd.read_csv(input_file / env_wf, sep=r'\s+', header=0)
  51. return station_info, station_info_d, nwp, nwp_h, power, nwp_v, nwp_v_h, env_w
  52. # 如果是光伏
  53. elif plant_type == 1:
  54. station_info = pd.read_csv(input_file / station_info_s, sep=r'\s+', header=0)
  55. station_info_d = pd.read_csv(input_file / station_info_d_s, sep=r'\s+', header=0)
  56. nwp = pd.read_csv(input_file / nwp_s, sep=r'\s+', header=0)
  57. nwp_h = pd.read_csv(input_file / nwp_s_h, sep=r'\s+', header=0)
  58. if (input_file / env_sf).exists():
  59. env_s = pd.read_csv(input_file / env_sf, sep=r'\s+', header=0)
  60. return station_info, station_info_d, nwp, nwp_h, power, nwp_v, nwp_v_h, env_s
  61. else:
  62. # 区域级预测待定,可能需要遍历获取场站数据
  63. basic_area = pd.read_csv(input_file / basi_area, sep=r'\s+', header=0)
  64. return basic_area
  65. def clean_power(power, env, plant_id):
  66. env_power = pd.merge(env, power, on=params['col_time'])
  67. if 'HubSpeed' in env.columns.tolist():
  68. from app.common.limited_power_wind import LimitPower
  69. lp = LimitPower(logger, params, env_power)
  70. power = lp.clean_limited_power(plant_id, True)
  71. elif 'Irradiance' in env.columns.tolist():
  72. from app.common.limited_power_solar import LimitPower
  73. lp = LimitPower(logger, params, env_power)
  74. power = lp.clean_limited_power(plant_id, True)
  75. return power
  76. def input_file_handler(input_file: str, model_name: str):
  77. # DQYC:短期预测,qy:区域级
  78. if 'dqyc' in input_file.lower():
  79. station_info, station_info_d, nwp, nwp_h, power, nwp_v, nwp_v_h, env = material(input_file, True)
  80. cap = round(float(station_info['PlantCap'][0]), 2)
  81. plant_id = int(station_info['PlantID'][0])
  82. # 含有model,训练
  83. if 'model' in input_file.lower():
  84. if env is not None and params['clean_power']: # 进行限电清洗
  85. power = clean_power(power, env, plant_id)
  86. train_data = pd.merge(nwp_v_h, power, on=params['col_time'])
  87. if model_name == 'fmi':
  88. from app.model.tf_fmi_train import model_training
  89. elif model_name == 'cnn':
  90. from app.model.tf_cnn_train import model_training
  91. else:
  92. from app.model.tf_lstm_train import model_training
  93. model_training(train_data, input_file, cap)
  94. # 含有predict,预测
  95. else:
  96. logger.info("训练路径错误!")
  97. else:
  98. # 区域级预测:未完
  99. basic_area = material(input_file, False)
  100. def main():
  101. # 创建解析器对象
  102. parser = argparse.ArgumentParser(description="程序描述")
  103. # 创建
  104. # 添加参数
  105. parser.add_argument("input_file", help="输入文件路径") # 第一个位置参数
  106. parser.add_argument("--model_name", default="lstm", help='选择短期模型') # 第二个位置参数
  107. # 解析参数
  108. args = parser.parse_args()
  109. # 使用参数
  110. print(f"文件: {args.input_file}")
  111. input_file_handler(args.input_file, args.model_name)
  112. if __name__ == "__main__":
  113. main()