everyday_calculate.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. # -*- coding: UTF-8 -*-
  2. '''
  3. @Project :jh5_sonar
  4. @File :everyday_calculate.py
  5. @Author :Fang
  6. @Date :2024/6/25
  7. '''
  8. import copy
  9. import numpy as np
  10. from hard_disk_storage import HardDiskStorage
  11. from datetime import datetime, timedelta
  12. from filterpy.kalman import KalmanFilter
  13. import numpy as np
  14. db = 'dbjh'
  15. harddisk_db = HardDiskStorage()
  16. db_name = 'package_data'
  17. def Kalman_Filter(data,new_data):
  18. kf = KalmanFilter(dim_x=2, dim_z=1)
  19. kf.x = np.array([[data[-1]['assess_total_number']], [0]]) # 初始状态 (位置, 速度)
  20. kf.F = np.array([[1., 1.], [0., 1.]]) # 状态转移矩阵
  21. kf.H = np.array([[1., 0.]]) # 观测矩阵
  22. kf.P *= 1000. # 初始协方差矩阵
  23. kf.R = 7000 # 观测噪声协方差
  24. kf.Q = np.array([[1., 0.], [0., 1.]])
  25. kf.predict()
  26. kf.update(new_data)
  27. filtered_value = kf.x[0, 0]
  28. return filtered_value
  29. def caculate_data(res1, flag):
  30. original_data = int(np.mean([i['fish_count'] for i in res1]))
  31. # 预先输入数据
  32. x = np.array([2, 5.85, 11.7 , 13.6,])
  33. y = np.array([0, 12.6, 38.3 , 42.6, ])
  34. # 多项式拟合
  35. z1 = np.polyfit(x, y, 2)
  36. p1 = np.poly1d(z1)
  37. data = [p1(i['fish_count'] / 1000) * 10000 for i in res1]
  38. mean_data = int(np.mean(data))
  39. return mean_data , original_data
  40. def detect_outliers(res,current_date,mean_data):
  41. data_list = [i['map_data'] for i in res]
  42. datetime_list = [i['datetime'] for i in res]
  43. data_list.append(mean_data)
  44. datetime_list.append(current_date)
  45. median_value = np.mean(data_list)
  46. std_dev = np.std(data_list)
  47. threshold_max = median_value + 2 * std_dev
  48. threshold_min = median_value - 2 * std_dev
  49. if threshold_min < 0:
  50. threshold_min = 0
  51. filtered_data = []
  52. filtered_datetime = []
  53. for temp_data,temp_time in zip(data_list,datetime_list):
  54. if temp_data >= threshold_min and temp_data <= threshold_max:
  55. filtered_data.append(temp_data)
  56. filtered_datetime.append(temp_time)
  57. if current_date in filtered_datetime:
  58. return False
  59. else:
  60. return True
  61. if __name__ == '__main__':
  62. # start_date_str = "2024-09-4"
  63. # end_date_str = "2024-09-4"
  64. #
  65. # start_date = datetime.strptime(start_date_str, '%Y-%m-%d')
  66. # end_date = datetime.strptime(end_date_str, '%Y-%m-%d')
  67. #
  68. # date_list = []
  69. # current_date = start_date
  70. # while current_date <= end_date:
  71. # date_list.append(current_date)
  72. # current_date += timedelta(days=1)
  73. # #打印每一天的 datetime 对象
  74. # for current_date in date_list:
  75. current_date = datetime.now()
  76. yesterday = current_date - timedelta(days=1)
  77. otherStyleTime = yesterday.strftime("%Y-%m-%d")
  78. flag = otherStyleTime
  79. # 构建SQL查询语句
  80. sql3 = f"select id, datetime, fish_count from {db_name} where is_processed = 1 and is_abnormal = 0 and datetime like '%{flag}%';"
  81. res1 = harddisk_db.execute_sql(sql3, None)
  82. if len(res1) < 50:
  83. print("No data",otherStyleTime)
  84. exit()
  85. # sql3 = f"select original_data,map_data,first_filter,assess_total_number from jh5_dailyreport WHERE is_visible=1 order by datetime desc limit 1;;"
  86. # old_count = harddisk_db.execute_sql(sql3, None)[0]
  87. #
  88. # sql = 'INSERT INTO jh5_dailyreport (datetime ,original_data,map_data,first_filter,assess_total_number ,outliers_flag,is_visible,is_send) VALUES (%s , %s,%s , %s, %s , %s, %s, %s);'
  89. # var = (current_date, old_count['original_data'], old_count['map_data'], old_count['first_filter'], old_count['assess_total_number'], 0, 0, 1)
  90. # res1 = harddisk_db.execute_sql(sql, var)
  91. # continue
  92. # 使用 sorted 函数并指定 key 以及 reverse 参数
  93. sorted_data = sorted(res1, key=lambda x: x['fish_count'], reverse=True)
  94. # 计算前 70% 的大小
  95. top_70_percent_length = int(len(sorted_data) * 0.7)
  96. top_10_percent_length = int(len(sorted_data) * 0.1)
  97. # 获取前 70% 的数据
  98. top_70_percent_data = sorted_data[top_10_percent_length:top_70_percent_length]
  99. sorted_data = sorted(top_70_percent_data, key=lambda x: x['datetime'])
  100. mean_data,original_data = caculate_data(sorted_data,flag)
  101. print('全部时间前70%平均数量:', mean_data,original_data)
  102. old_day = (current_date - timedelta(days=5)).strftime('%Y-%m-%d')
  103. old_day = datetime.strptime(old_day, "%Y-%m-%d")
  104. sql3 = f"select datetime, map_data from jh5_dailyreport;"
  105. data = harddisk_db.execute_sql(sql3,None)
  106. otherStyleTime += ' 23:20:00'
  107. dt = datetime.strptime(otherStyleTime, "%Y-%m-%d %H:%M:%S")
  108. outliers_flag = detect_outliers(data,dt,mean_data)
  109. print(outliers_flag)
  110. sql3 = f"select datetime, assess_total_number from jh5_dailyreport WHERE datetime between '{old_day}' and '{current_date}';"
  111. data = harddisk_db.execute_sql(sql3, None)
  112. if outliers_flag == True:
  113. filter_list = [i['assess_total_number'] for i in data]
  114. filter_data = filter_list[-1]
  115. sql = 'INSERT INTO jh5_dailyreport (datetime ,original_data,map_data,first_filter,assess_total_number,outliers_flag ) VALUES (%s , %s, %s ,%s , %s, %s) ;'
  116. var = (dt, original_data, mean_data, filter_data, filter_data,1)
  117. res1 = harddisk_db.execute_sql(sql, var)
  118. else:
  119. if len(data) < 4:
  120. sql3 = f"select datetime,assess_total_number from jh5_dailyreport where is_visible=1 ORDER BY datetime DESC LIMIT 5;"
  121. data = harddisk_db.execute_sql(sql3, None)
  122. new_filter_data = Kalman_Filter(data, mean_data)
  123. sql = 'INSERT INTO jh5_dailyreport (datetime ,original_data,map_data,first_filter,assess_total_number ,outliers_flag,is_visible,is_send) VALUES (%s , %s,%s , %s, %s , %s, %s, %s);'
  124. var = (dt,original_data,mean_data,mean_data,new_filter_data, 0,0,1)
  125. res1 = harddisk_db.execute_sql(sql, var)
  126. print(res1)
  127. exit()
  128. else:
  129. filter_list = [i['assess_total_number'] for i in data ]
  130. filter_list.append(mean_data)
  131. filter_data = int(np.mean(filter_list))
  132. new_filter_data = Kalman_Filter(data,filter_data)
  133. sql = 'INSERT INTO jh5_dailyreport (datetime ,original_data,map_data,first_filter,assess_total_number,outliers_flag,is_visible,is_send ) VALUES (%s , %s ,%s , %s , %s, %s, %s, %s);'
  134. var = (dt,original_data, mean_data, filter_data,new_filter_data, 0,0,1)
  135. res1 = harddisk_db.execute_sql(sql, var)
  136. print(res1)