Prechádzať zdrojové kódy

Merge branch 'dev' of http://git.fast-fun.cn:92/lmstack/data_analyze_platform into dev

qingfeng 3 rokov pred
rodič
commit
c320db87f5

+ 30 - 0
LIB/BACKEND/OPENAPI/OpenApi.py

@@ -0,0 +1,30 @@
+'''
+数据预处理类
+
+'''
+__author__ = 'lmstack'
+
+import pandas as pd
+
+import requests
+import json
+
+class OpenApi:
+    def __init__(self):
+        pass
+
+    def get_device_fault(self, start_time="", end_time=""):
+        # start_time = "2021-12-30 00:00:00"
+        # end_time = "2021-12-31 00:00:00"
+        url = 'http://open.li-ai.com.cn/admin/v1/deviceFault'
+        headers = {'Content-Type':"application/json; charset=utf-8","token":"2A26DD0ADE53456D928562A17131A3B5"}
+        data = {}
+        if start_time != "":
+            data['startTime'] = start_time
+        if end_time != "":
+            data['endTime'] = end_time
+        response = requests.post(url,  json=data, headers=headers)
+        df = pd.DataFrame(columns=['sn', 'imei','faultTime', 'updateTime', 'overTime', 'faultStatus', 'questionType', 'questionTypeText', 'childProblem','childProblemText'])
+        for d in json.loads(response.text)["data"]:
+            df = df.append(d, ignore_index=True)
+        return df

+ 5 - 2
LIB/MIDDLE/Anomaly_Detection/V1_0_0/anomalyPCA.py

@@ -68,9 +68,12 @@ def transform(df_data_pro,model,df_data):
     X_train_inverse=pd.DataFrame(data=X_train_inverse,index=df_data_pro.index)
     #异常指数
     anomalyScoresModel=anomalyScores(df_data_pro,X_train_inverse)
-    anomalyScoresModel=savgol_filter(anomalyScoresModel,15,3)
     df_data2=df_data.copy()
-    df_data2['anomalyScores_'+str(model)]=anomalyScoresModel
+    if len(anomalyScoresModel)>15:
+        anomalyScoresModel=savgol_filter(anomalyScoresModel,15,3)
+        df_data2['anomalyScores_'+str(model)]=anomalyScoresModel
+    else:
+        df_data2['anomalyScores_'+str(model)]=0
     return df_data2
 
 #判断离群

+ 21 - 9
LIB/MIDDLE/Anomaly_Detection/V1_0_0/main_detection.py

@@ -20,7 +20,7 @@ l = len(fileNames)
 
 now_time=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')   #type: str
 now_time=datetime.datetime.strptime(now_time,'%Y-%m-%d %H:%M:%S')     #type: datetime
-start_time=now_time-datetime.timedelta(hours=3)
+start_time=now_time-datetime.timedelta(hours=6)
 end_time=str(now_time)
 start_time=str(start_time)
 
@@ -52,41 +52,53 @@ for k in range(l):
     try: 
         sn = fileNames[k]
         df_diag_ram_sn=df_diag_ram[df_diag_ram['product_id']==sn]
-        df_data = dbManager.get_data(sn=sn, start_time=start_time, end_time=end_time, data_groups=['bms'])
+        df_data = dbManager.get_data(sn=sn, start_time=start_time, end_time=end_time ,data_groups=['bms'])
         data_test = df_data['bms']
         data_test=data_test[data_test['SOC[%]']>20]
-        if len(data_test)>5:
+        if len(data_test)>15:
             pca1 = joblib.load('pca1_'+sn+'.m')  
             pca2 = joblib.load('pca2_'+sn+'.m') 
             res1 = pd.read_csv('res1_'+sn+'.csv',encoding='gbk')
             res2 = pd.read_csv('res2_'+sn+'.csv',encoding='gbk')
             pred1,pred2=prediction(data_test,pca1,pca2)
+            pred1=pred1.reset_index()
+            pred2=pred2.reset_index()
             outliers1=detect_outliers(res1,pred1,threshold=30)
             outliers2=detect_outliers(res2,pred2,threshold=16)
             if (len(outliers1)>0) & (len(outliers2)>0):
                 outliers=check_anomaly(outliers1,outliers2,res2)
                 if len(outliers)>5:
                     outliers['sn']=sn
+                    outliers=outliers.reset_index()
                     anomalies=anomalies.append(outliers)
+                    u_th=boxplot_fill(res2)
+                    outliers3=pred2[pred2['低压差']>u_th]
                     if df_diag_ram_sn.empty: 
                         product_id=sn
                         start_time=outliers.loc[0,'时间']
-                        if outliers.loc[-1,'时间'] == pred1.loc[-1,'时间']:
+                        start_time=start_time+'0:00'
+                        if outliers.loc[outliers.index[-1],'时间'] == pred1.loc[pred1.index[-1],'时间']:
+                            end_time='0000-00-00 00:00:00'
+                        elif outliers1.loc[outliers1.index[-1],'时间'] == outliers3.loc[outliers3.index[-1],'时间']:
                             end_time='0000-00-00 00:00:00'
                         else:
-                            end_time=outliers.loc[-1,'时间']
+                            end_time=outliers.loc[outliers.index[-1],'时间']
+                            end_time=end_time+'0:00'
                         code='C493'
                         level=4
                         info='热失控预警'
                         advice='建议返厂维修'
-                        df_res=df_res.append([start_time, end_time,product_id, code, level, info,advice])    
+                        df_res=df_res.append({'start_time':start_time, 'end_time':end_time,'product_id':product_id, 'code':code, 'level':level, 'info':info,'advice':advice},ignore_index=True)
                         with open(r'D:\Platform\platform_python\data_analyze_platform\USER\spf\01qixiang\06BatSafetyAlarm\热失控报警.txt','a') as file:
                             file.write(str(tuple(df_res.iloc[-1]))+'\n')    
                     else:
-                        if outliers.loc[-1,'时间'] == pred1.loc[-1,'时间']:
+                        if outliers.loc[outliers.index[-1],'时间'] == pred1.loc[pred1.index[-1],'时间']:
+                            end_time='0000-00-00 00:00:00'
+                        elif outliers1.loc[outliers1.index[-1],'时间'] == outliers3.loc[outliers3.index[-1],'时间']:
                             end_time='0000-00-00 00:00:00'
                         else:
-                            end_time=outliers.loc[-1,'时间']
+                            end_time=outliers.loc[outliers.index[-1],'时间']
+                            end_time=end_time+'0:00'
                             df_diag_ram_sn['end_time']=end_time
                             with open(r'D:\Platform\platform_python\data_analyze_platform\USER\spf\01qixiang\06BatSafetyAlarm\热失控报警.txt','a') as file:
                                 file.write(str(tuple(df_diag_ram_sn.iloc[-1]))+'\n')
@@ -95,4 +107,4 @@ for k in range(l):
     except Exception as e:
         print(repr(e))
         mylog.logopt(sn,e)
-        pass 
+        pass