main.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. # -*- coding: UTF-8 -*-
  2. import pandas as pd
  3. import numpy as np
  4. import time
  5. from sqlalchemy import create_engine
  6. import os
  7. import configparser
  8. import pymysql
  9. import datetime
  10. from LIB.BACKEND import DBManager#,Log
  11. import log
  12. import chrg_cal_alarm
  13. def diag_cal():
  14. global df_diag_alarm
  15. # 环境变量配置(通过环境变量确定当前程序运行在开发、测试、生产环境)
  16. env_dist = os.environ
  17. cur_env = env_dist.get("CURENV", 'dev') # 默认为开发环境
  18. # 读取配置文件 (该部分请不要修改)
  19. cf = configparser.ConfigParser()
  20. if cur_env == 'dev':
  21. cf.read("config-dev.ini")
  22. elif cur_env == 'test':
  23. cf.read("config-test.ini")
  24. elif cur_env == 'pro':
  25. cf.read("config-pro.ini")
  26. # 解析配置文件 (该部分请按照实际需求修改)
  27. host1 = cf.get("Mysql-1", 'host')
  28. port1 = int(cf.get("Mysql-1", 'port'))
  29. db1 = cf.get("Mysql-1", 'db')
  30. user1 = cf.get("Mysql-1", 'user')
  31. password1 = cf.get("Mysql-1", 'password')
  32. host2 = cf.get("Mysql-2", 'host')
  33. port2 = int(cf.get("Mysql-2", 'port'))
  34. db2 = cf.get("Mysql-2", 'db')
  35. user2 = cf.get("Mysql-2", 'user')
  36. password2 = cf.get("Mysql-2", 'password')
  37. # 日志配置(按照该配置,每次运行时可自动生成运行日期的文件夹, 会在与main.py同级的, 该部分可按照实际需求修改)
  38. host1='rm-bp10j10qy42bzy0q77o.mysql.rds.aliyuncs.com'
  39. port1=3306
  40. user1='hz_dev'
  41. password1='Qx@123456'
  42. param1 = 'pack_code, param'#'pack_code,param'#OCV-SOC曲线参数表
  43. param2 = 'vin, pack_model_code, pack_capacity, module_model_code, sn'
  44. db1 ='hz_dev'
  45. mysql1 = pymysql.connect (host=host1, user=user1, password=password1, port=port1, database=db1)
  46. cursor1 = mysql1.cursor()
  47. sql1 = "select %s from %s" %(param1, 'algo_pack_param')#'algo_pack_param'
  48. cursor1.execute(sql1)
  49. res1 = cursor1.fetchall()
  50. df_pack_param= pd.DataFrame(res1,columns=param1.split(','))#电池类型中电池OCV-SOC曲线
  51. np_clms_ocv_lst = df_pack_param.columns#OCV-SOC曲线参数表格中列名
  52. mysql2 = pymysql.connect (host=host1, user=user1, password=password1, port=port1, database=db1)
  53. cursor2 = mysql2.cursor()
  54. sql2 = "select %s from %s" %(param2, 'vin_pack_cell_info')#'algo_pack_param'
  55. cursor2.execute(sql2)
  56. res2 = cursor2.fetchall()
  57. df_vinmd_code= pd.DataFrame(res2,columns=param2.split(','))#电池的VIN与code对应关系表
  58. # 原始数据时间设置
  59. mylog=log.Mylog('log_diag.txt','error')
  60. mylog.logcfg()
  61. # df_ori_result = pd.read_csv(r'C:\Users\zldc\project\User\lzx\hz-application-algo\USER\lzx\状态统计\10万辆车\chrgtable\充电表单V3.csv',encoding='GB18030')#读取项目sn号
  62. path = r'C:\Users\zldc\project\User\lzx\hz-application-algo\USER\lzx\状态统计\10万辆车\chrgtable'
  63. def get_file(): #创建一个空列表
  64. files =os.listdir(path)
  65. files.sort() #排序
  66. file_list= []
  67. for file in files:
  68. if not os.path.isdir(path +file): #判断该文件是否是一个文件夹
  69. f_name = str(file)
  70. # print(f_name)
  71. tr = '\\' #多增加一个斜杠
  72. filename = path + tr + f_name
  73. file_list.append(filename)
  74. return file_list
  75. file_list_chrg = get_file()
  76. df_ori_result = pd.DataFrame()
  77. for file in file_list_chrg:
  78. df_data_temp = pd.read_csv(file, encoding='GB18030')
  79. df_ori_result = df_ori_result.append(df_data_temp)
  80. df_ori_result.reset_index(drop = True, inplace = True)
  81. df_sn_nums = np.unique(df_ori_result['vin'])
  82. chrg_soc_st = 65
  83. chrg_soc_sp = 50
  84. chek_delta_time = 90
  85. time_st = time.time()
  86. k = 0
  87. # 遍历资产列表,获取数据和参数,输入算法中
  88. for item_vin in df_sn_nums[k:]:#df_all_sn['VIN']:#range(0, df_all_sn.index[-1]):df_all_sn['VIN'][0:1]df_sn_nums['vin'][k:]
  89. start = time.time()
  90. print('第' + str(k) + '个电池')
  91. k += 1
  92. try:# 解析得到厂家、sn、协议类型、电芯参数等输入数据
  93. #------读
  94. df_diag_rlt = df_diag_alarm.loc[(df_diag_alarm['vin'] == item_vin) & (df_diag_alarm['end_flag'] == 0)]#筛选报警未结束的充电异常
  95. df_chrg_data = df_ori_result.loc[df_ori_result['vin'] == item_vin]#放电数据筛选
  96. df_chrg_data.reset_index(drop = True, inplace = True)
  97. # 调用核心算法
  98. df_diag_alarm_temp = chrg_cal_alarm.chrg_alarm(df_diag_rlt, df_chrg_data, chrg_soc_st, chrg_soc_sp, chek_delta_time)
  99. df_diag_alarm_add = df_diag_alarm_temp.chrg_outler_alarm()
  100. if len(df_diag_alarm_add) > 0:
  101. df_diag_alarm = df_diag_alarm.append(df_diag_alarm_add)
  102. df_diag_alarm.reset_index(drop = True, inplace = True)
  103. df_diag_alarm.to_csv(r'C:\Users\zldc\project\User\lzx\hz-application-algo\USER\lzx\chrg_alarm\充电异常报警.csv',index=False,encoding='GB18030')
  104. end=time.time()
  105. print(end-start)
  106. except Exception as e:
  107. print(repr(e))
  108. mylog.logopt(str(e) + item_vin)
  109. pass
  110. time_sp = time.time()
  111. print('代码总时长:' + str(time_sp - time_st))
  112. #...............................................主函数起定时作用.......................................................................................................................
  113. if __name__ == "__main__":
  114. #log信息配置
  115. mylog=log.Mylog('log_alarm.txt','error')
  116. mylog.logcfg()
  117. #读取fault_code=C599的当前故障
  118. df_diag_alarm = pd.read_csv(r'C:\Users\zldc\project\User\lzx\hz-application-algo\USER\lzx\chrg_alarm\充电异常报警.csv' ,encoding='GB18030')
  119. #定时任务.......................................................................................................................................................................
  120. diag_cal()