processing_limit_power_by_machines.py 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import argparse
  2. import pandas as pd
  3. import numpy as np
  4. from pymongo import MongoClient
  5. import matplotlib.pyplot as plt
  6. from flask import Flask,request,jsonify
  7. from waitress import serve
  8. import time
  9. import logging
  10. import traceback
  11. app = Flask('processing_limit_power_by_machines——service')
  12. def get_data_from_mongo(args):
  13. mongodb_connection,mongodb_database,mongodb_read_table = args['mongodb_connection'],args['mongodb_database'],args['mongodb_read_table']
  14. client = MongoClient(mongodb_connection)
  15. # 选择数据库(如果数据库不存在,MongoDB 会自动创建)
  16. db = client[mongodb_database]
  17. collection = db[mongodb_read_table] # 集合名称
  18. data_from_db = collection.find() # 这会返回一个游标(cursor)
  19. # 将游标转换为列表,并创建 pandas DataFrame
  20. df = pd.DataFrame(list(data_from_db))
  21. client.close()
  22. return df
  23. def insert_data_into_mongo(res_df,args):
  24. mongodb_connection,mongodb_database,mongodb_write_table = args['mongodb_connection'],args['mongodb_database'],args['mongodb_write_table']
  25. client = MongoClient(mongodb_connection)
  26. db = client[mongodb_database]
  27. if mongodb_write_table in db.list_collection_names():
  28. db[mongodb_write_table].drop()
  29. print(f"Collection '{mongodb_write_table} already exist, deleted successfully!")
  30. collection = db[mongodb_write_table] # 集合名称
  31. # 将 DataFrame 转为字典格式
  32. data_dict = res_df.to_dict("records") # 每一行作为一个字典
  33. # 插入到 MongoDB
  34. collection.insert_many(data_dict)
  35. print("data inserted successfully!")
  36. #样板机法
  37. def windLight_machine_judgment(power,args):
  38. col_rp,col_tp = args['col_rp'],args['col_tp']
  39. power['diff'] = power[col_tp]-power[col_rp]
  40. power['is_limit_machine'] = False
  41. diff_mean,diff_std = power['diff'].mean(),power['diff'].std()
  42. threshold = diff_mean-1.96*(diff_std/np.sqrt(power.shape[0]))
  43. print("threshold",threshold)
  44. power.loc[abs(power['diff']) > threshold ,'is_limit_machine'] = True
  45. is_limit = power['is_limit_machine']
  46. # 可视化结果
  47. plt.figure(figsize=(300, 6))
  48. plt.plot(power[col_rp], label=col_rp)
  49. plt.plot(power[col_tp], label=col_tp)
  50. plt.scatter(power.index[is_limit], power[col_rp][is_limit], color='red', label='限电点')
  51. plt.legend()
  52. plt.title(f' 95%置信水平计算置信区间 ---限电 threshold={threshold}')
  53. plt.show()
  54. return power[power['is_limit_machine']!=True].drop(['diff','is_limit_machine'],axis=1)
  55. @app.route('/processing_limit_power_by_machines', methods=['POST'])
  56. def processing_limit_power_by_machines():
  57. # 获取程序开始时间
  58. start_time = time.time()
  59. result = {}
  60. success = 0
  61. print("Program starts execution!")
  62. try:
  63. args = request.values.to_dict()
  64. print("*********",args,"*******")
  65. power_df = get_data_from_mongo(args)
  66. res_df = windLight_machine_judgment(power_df,args)
  67. insert_data_into_mongo(res_df,args)
  68. success = 1
  69. except Exception as e:
  70. my_exception = traceback.format_exc()
  71. my_exception.replace("\n","\t")
  72. result['msg'] = my_exception
  73. end_time = time.time()
  74. result['success'] = success
  75. result['args'] = args
  76. result['start_time'] = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(start_time))
  77. result['end_time'] = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(end_time))
  78. print("Program execution ends!")
  79. return result
  80. if __name__=="__main__":
  81. print("Program starts execution!")
  82. logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
  83. logger = logging.getLogger("processing_limit_power_by_machines log")
  84. from waitress import serve
  85. serve(app, host="0.0.0.0", port=10087)
  86. print("server start!")