data_show.py 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. #sys.path.append("..")
  2. import json
  3. import os
  4. import csv
  5. from temp import config_analysis
  6. from temp.utils_analysis import create_custom_heatmap, set_chinese_font, cross_corr, group_list
  7. from Database.database_ import Database, DatabaseParam
  8. def read_json(json_file, key:str='data'):
  9. """加载json"""
  10. with open(json_file, 'r', encoding='utf-8') as f:
  11. data_ = json.load(f)
  12. print('数据加载成功,总数量:', data_.get('len'))
  13. return data_.get(key)
  14. def select(d_list: list, l_list:list) -> list:
  15. counter_dict_row = {}
  16. counter_dict_col = {}
  17. # 行计数
  18. # for l in l_list:
  19. # counter_dict_row.update({l: 0})
  20. # counter_dict_col.update({l: 0})
  21. for d in d_list:
  22. counter_dict_row.update({d.get('A').get('name'): 0})
  23. counter_dict_col.update({d.get('B').get('name'): 0})
  24. # 列计数
  25. for d in d_list:
  26. counter_dict_row[d['A']['name']] += 1
  27. counter_dict_col[d['B']['name']] += 1
  28. # 剔除只自相关的数据字段
  29. new_d_list_idx = []
  30. for idx, d in enumerate(d_list):
  31. if d['A']['name'] == d['B']['name']:
  32. if counter_dict_row[d['A']['name']] == 1 and counter_dict_col[d['B']['name']] == 1:
  33. continue
  34. new_d_list_idx.append(idx)
  35. new_d_list = [d_list[i] for i in new_d_list_idx]
  36. return new_d_list
  37. if __name__ == '__main__':
  38. # 添加列表
  39. added_list = ['超滤总产水浊度','超滤总产水余氯']
  40. # 排除列表
  41. not_selected = ['电流', '控制字', '步序', '时间设定', '开关', '报警', '噪音']
  42. # 设置中文字体
  43. set_chinese_font()
  44. # 获取name和code的映射关系
  45. with open('../GetItem/92_all_items_name_code_transfer.json', 'r', encoding='utf-8') as f: # 总字段加载文件
  46. name_code_transfer = json.load(f)
  47. print(f'加载name与code映射字典,共{name_code_transfer.get('len')}条')
  48. name_2_code = name_code_transfer.get('name_2_code')
  49. code_2_name = name_code_transfer.get('code_2_name')
  50. del name_code_transfer
  51. # 结果表格化
  52. out_name = 'result_' + os.path.basename(config_analysis.OUTPUT_JSON_FILE)[:-5] + '.csv'
  53. data_list = read_json(config_analysis.OUTPUT_JSON_FILE)
  54. # 需要统计的所有字段
  55. total_name = read_json(config_analysis.OUTPUT_JSON_FILE[:-9] + '.json', 'total_name_list')
  56. total_code = read_json(config_analysis.OUTPUT_JSON_FILE[:-9] + '.json', 'total_code_list')
  57. data_list = select(data_list, total_name)
  58. # 写入csv
  59. if os.path.exists(out_name):
  60. os.remove(out_name)
  61. with open(out_name, 'a', encoding='utf-8') as f:
  62. csv.writer(f).writerow(['A序列', 'B序列', 'k1', 'p1', 'r1', 'k2', 'p2', 'r2', 'k3', 'p3', 'r3'])
  63. for item_dict in data_list:
  64. txt_content_A = [f'{item_dict.get('A').get('name')}({item_dict.get('A').get('code')})']
  65. txt_content_B = [f'{item_dict.get('B').get('name')}({item_dict.get('B').get('code')})']
  66. txt_content_res = []
  67. for it in item_dict.get('res'):
  68. txt_content_res.append(f'{it.get('k')}')
  69. txt_content_res.append(f'{it.get('p'):.4f}')
  70. txt_content_res.append(f'{it.get('r'):.4f}')
  71. csv.writer(f).writerow(txt_content_A + txt_content_B + txt_content_res)
  72. new_label_name = set()
  73. for d in data_list:
  74. new_label_name.add(d['A']['name'])
  75. new_label_name.add(d['B']['name'])
  76. # 增加添加列表
  77. for ele in added_list:
  78. new_label_name.add(ele)
  79. # 剔除排除列表
  80. new_label_name_temp = []
  81. for ele in new_label_name:
  82. flag = True
  83. for not_selected_ele in not_selected:
  84. if not_selected_ele in ele:
  85. flag = False
  86. break
  87. if flag: new_label_name_temp.append(ele)
  88. new_label_name = new_label_name_temp
  89. del new_label_name_temp
  90. new_label_code = [name_2_code.get(ele) for ele in new_label_name]
  91. # 二次筛选后的统计字段
  92. del data_list
  93. print('筛选后还剩下的字段数:', len(new_label_name))
  94. # 逐组进行二次计算
  95. db_param = DatabaseParam(
  96. db_host='192.168.50.4',
  97. db_user='root',
  98. db_password='*B-@p2b+97D5xAF1e6',
  99. db_name='ws_data',
  100. db_port=4000)
  101. # 按组计算
  102. with Database(db_param) as db:
  103. group_df = db.query_sql_time_series_group2data_frame(
  104. code_name_dict=code_2_name,
  105. project_id=config_analysis.PROJECT_ID,
  106. sheet_name=config_analysis.DB_SHEET_NAME,
  107. data_codes=new_label_code,
  108. start_year=config_analysis.CHECK_YEAR_START,
  109. end_year=config_analysis.CHECK_YEAR_END,
  110. start_month=config_analysis.CHECK_MONTH_START,
  111. end_month=config_analysis.CHECK_MONTH_END,
  112. start_day=config_analysis.CHECK_DAY_START,
  113. end_day=config_analysis.CHECK_DAY_END)
  114. del new_label_code, new_label_name
  115. new_label_code = sorted([i for i in group_df.columns.tolist() if i != 'time'])
  116. # 对列表进行分组
  117. row_group_elements_num = 25 # 行分组
  118. row_group_code = group_list(new_label_code, row_group_elements_num)
  119. col_group_elements_num = 50 # 列分组
  120. col_group_code = group_list(new_label_code, col_group_elements_num)
  121. for i, row_code in enumerate(row_group_code):
  122. for j, col_code in enumerate(col_group_code):
  123. corr = cross_corr(row_code, col_code, group_df, code_2_name)
  124. create_custom_heatmap(corr_matrix=corr, title=f'中荷水厂数据相关系数热力图{i}-{j}')
  125. query_name = input('是否继续查询结果所在位置(y/n):')
  126. if query_name == 'y' or query_name == 'Y':
  127. while query_name != '退出':
  128. query_name = input('查询:')
  129. flag = False
  130. for i, row_group in enumerate(row_group_code):
  131. if name_2_code.get(query_name) in row_group:
  132. flag = True
  133. print(f'位置:{i}-*.png')
  134. break
  135. if not flag:
  136. print(f'位置:{query_name}不在统计范围')