WaveTrans.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import datetime
  2. import json
  3. import multiprocessing
  4. from service.plt_service import get_all_wind
  5. from service.trans_service import get_wave_conf, save_df_to_db, get_or_create_wave_table, \
  6. get_wave_data, delete_exist_wave_data
  7. from service.trans_conf_service import update_trans_status_running, update_trans_transfer_progress, \
  8. update_trans_status_success
  9. from utils.file.trans_methods import *
  10. from utils.log.trans_log import set_trance_id
  11. from utils.systeminfo.sysinfo import get_available_cpu_count_with_percent
  12. exec("from os.path import *")
  13. class WaveTrans(object):
  14. def __init__(self, id, wind_farm_code, read_dir):
  15. self.id = id
  16. self.wind_farm_code = wind_farm_code
  17. self.read_dir = read_dir
  18. self.begin = datetime.datetime.now()
  19. self.engine_count = 0
  20. self.min_date = None
  21. self.max_date = None
  22. self.data_count = 0
  23. def get_data_exec(self, func_code, filepath, measupoint_names: set):
  24. exec(func_code)
  25. return locals()['get_data'](filepath, measupoint_names)
  26. def del_exists_data(self, df):
  27. min_date, max_date = df['time_stamp'].min(), df['time_stamp'].max()
  28. db_df = get_wave_data(self.wind_farm_code + '_wave', min_date, max_date)
  29. exists_df = pd.merge(db_df, df,
  30. on=['wind_turbine_name', 'time_stamp', 'sampling_frequency', 'mesure_point_name'],
  31. how='inner')
  32. ids = [int(i) for i in exists_df['id'].to_list()]
  33. if ids:
  34. delete_exist_wave_data(self.wind_farm_code + "_wave", ids)
  35. def run(self):
  36. update_trans_status_running(self.id)
  37. trance_id = '-'.join([self.wind_farm_code, 'wave'])
  38. set_trance_id(trance_id)
  39. all_files = read_files(self.read_dir, ['txt'])
  40. self.data_count = len(all_files)
  41. update_trans_transfer_progress(self.id, 5)
  42. # 最大取系统cpu的 1/2
  43. split_count = get_available_cpu_count_with_percent(1 / 2)
  44. all_wind, _ = get_all_wind(self.wind_farm_code, False)
  45. get_or_create_wave_table(self.wind_farm_code + '_wave')
  46. wave_conf = get_wave_conf(self.wind_farm_code)
  47. base_param_exec = wave_conf['base_param_exec']
  48. map_dict = {}
  49. if base_param_exec:
  50. base_param_exec = base_param_exec.replace('\r\n', '\n').replace('\t', ' ')
  51. trans_print(base_param_exec)
  52. if 'import ' in base_param_exec:
  53. raise Exception("方法不支持import方法")
  54. mesure_poins = [key for key, value in wave_conf.items() if str(key).startswith('conf_') and value]
  55. for point in mesure_poins:
  56. map_dict[wave_conf[point]] = point.replace('conf_', '')
  57. wind_turbine_name_set = set()
  58. all_array = split_array(all_files, split_count * 10)
  59. total_index = len(all_array)
  60. for index, now_array in enumerate(all_array):
  61. index_begin = datetime.datetime.now()
  62. with multiprocessing.Pool(split_count) as pool:
  63. file_datas = pool.starmap(self.get_data_exec,
  64. [(base_param_exec, i, list(map_dict.keys())) for i in now_array])
  65. update_trans_transfer_progress(self.id, 20 + int(index / total_index * 60))
  66. trans_print("读取文件耗时:", datetime.datetime.now() - self.begin)
  67. result_list = list()
  68. for file_data in file_datas:
  69. if file_data:
  70. wind_turbine_name, time_stamp, sampling_frequency, rotational_speed, mesure_point_name, type, mesure_data = \
  71. file_data[0], file_data[1], file_data[2], file_data[3], file_data[4], file_data[5], file_data[6]
  72. if mesure_point_name in map_dict.keys():
  73. wind_turbine_name_set.add(wind_turbine_name)
  74. if self.min_date is None or self.min_date > time_stamp:
  75. self.min_date = time_stamp
  76. if self.max_date is None or self.max_date < time_stamp:
  77. self.max_date = time_stamp
  78. result_list.append(
  79. [wind_turbine_name, time_stamp, rotational_speed, sampling_frequency, mesure_point_name,
  80. type,
  81. mesure_data])
  82. if result_list:
  83. df = pd.DataFrame(result_list,
  84. columns=['wind_turbine_name', 'time_stamp', 'rotational_speed', 'sampling_frequency',
  85. 'mesure_point_name', 'type', 'mesure_data'])
  86. df['time_stamp'] = pd.to_datetime(df['time_stamp'], errors='coerce')
  87. df['mesure_point_name'] = df['mesure_point_name'].map(map_dict)
  88. df.dropna(subset=['mesure_point_name'], inplace=True)
  89. df['wind_turbine_number'] = df['wind_turbine_name'].map(all_wind).fillna(df['wind_turbine_name'])
  90. df['mesure_data'] = df['mesure_data'].apply(lambda x: json.dumps(x))
  91. df.sort_values(by=['time_stamp', 'mesure_point_name'], inplace=True)
  92. # self.del_exists_data(df)
  93. save_df_to_db(self.wind_farm_code + '_wave', df, batch_count=400)
  94. trans_print(f"总共{total_index}组,当前{index + 1}", "本次写入耗时:", datetime.datetime.now() - index_begin,
  95. "总耗时:", datetime.datetime.now() - self.begin)
  96. update_trans_status_success(self.id, len(wind_turbine_name_set), None,
  97. self.min_date, self.max_date, self.data_count)
  98. # update_trans_status_success(self.id)
  99. trans_print("总耗时:", datetime.datetime.now() - self.begin)