lmstack 3 lat temu
rodzic
commit
9c8c385ffe
3 zmienionych plików z 338 dodań i 35 usunięć
  1. 3 1
      .gitignore
  2. 70 34
      LIB/BACKEND/DBManager.py
  3. 265 0
      demo.ipynb

+ 3 - 1
.gitignore

@@ -6,4 +6,6 @@
 /*/__pycache__/
 /*/*/__pycache__/
 /*.ipynb
-*.csv
+*.csv
+*.doc
+!/demo.ipynb

+ 70 - 34
LIB/BACKEND/DBManager.py

@@ -88,7 +88,7 @@ class DBManager():
                 yield json.loads(line)
 
     @staticmethod
-    def _convert_to_dataframe(data, mode=0):
+    def _convert_to_bms(data, mode=0):
         CellU = []
         CellT = []
         OtherT = []
@@ -108,10 +108,12 @@ class DBManager():
         for i in range(OtherT_Num):
             CellU.append(data['ffBatteryStatus']['otherTempList'][i])
         if mode == 0:
-            data_len = 11
+            data_len = 15
             
             data_block = np.array([data['info']['obdTime'],data['ffBatteryStatus']['rssi'],data['ffBatteryStatus']['errorLevel'],data['ffBatteryStatus']['errorCode']
-                    ,data['ffBatteryStatus']['current'],data['ffBatteryStatus']['voltageInner'],data['ffBatteryStatus']['chargeState'],data['ffBatteryStatus']['heatState']
+                    ,data['ffBatteryStatus']['current'],data['ffBatteryStatus']['voltageInner'],data['ffBatteryStatus']['voltageOutter'],
+                    data['ffBatteryStatus']['totalOutputState'],data['ffBatteryStatus']['lockedState'],
+                    data['ffBatteryStatus']['chargeState'],data['ffBatteryStatus']['heatState'],data['ffBatteryStatus']['cellVoltageDiff']
                     ,data['ffBatteryStatus']['soc'],data['ffBatteryStatus']['soh'],data['ffBatteryStatus']['cellVolBalance']]).reshape(1,data_len)
         elif mode == 1:
             data_len = 7
@@ -128,13 +130,14 @@ class DBManager():
     def _convert_to_dataframe_Gps(data, mode=0):
         if mode == 0:
             if data['info']['subType'] == 1:
-                data_block = np.array([data['info']['obdTime'],data['ffGps']['satellites'],data['ffGps']['latitude'],data['ffGps']['longitude']
-                    ,data['ffGps']['altitude'],data['ffGps']['speed']]).reshape(1,6)
+                data_block = np.array([data['info']['obdTime'],data['ffGps']['locationType'], data['ffGps']['satellites'],
+                                       data['ffGps']['latitude'],data['ffGps']['longitude'],data['ffGps']['speed'], 
+                                       data['ffGps']['altitude'], data['ffGps']['direction']]).reshape(1,8)
                 df = pd.DataFrame(
-                    columns=['时间戳','卫星数','纬度','经度','海拔m','速度[km/h]'],data=data_block)
+                    columns=['时间戳','定位类型', '卫星数','纬度','经度','速度[km/h]','海拔','航向'],data=data_block)
             elif data['info']['subType'] == 2:
                 df = pd.DataFrame(
-                    columns=['时间戳','卫星数','纬度','经度','海拔m','速度[km/h]'])
+                    columns=['时间戳','定位类型', '卫星数','纬度','经度','速度[km/h]','海拔','航向'])
         if mode == 1:
                 data_block = np.array([data['info']['obdTime'],data['ffGps']['latitude'],data['ffGps']['longitude']
                     ,data['ffGps']['speed'], data['ffGps']['isValid']]).reshape(1,5)
@@ -144,9 +147,10 @@ class DBManager():
     
     @staticmethod
     def _get_data(urls,type_name,mode=0):
-        if type_name == 'BMS':
+        if type_name == 'bms':
             if mode == 0:
-                name_const = ['时间戳','GSM信号','故障等级','故障代码','总电流[A]','总电压[V]','充电状态','加热','SOC[%]','SOH[%]','单体均衡状态']
+                name_const = ['时间戳','GSM信号','故障等级','故障代码','总电流[A]','总电压[V]', '外电压', '总输出状态', '上锁状态', '充电状态','加热状态',
+                              '单体压差', 'SOC[%]','SOH[%]','单体均衡状态']
             elif mode == 1:
                 name_const = ['时间戳','GSM信号','总电流[A]','总电压[V]','充电状态','SOC[%]','SOH[%]']
             i=0
@@ -157,11 +161,11 @@ class DBManager():
             for line in DBManager._download_json_data(urls):
                 et = time.time()
                 if i==0:
-                    data_blocks,CellUNum,CellTNum,OtherTNumm = DBManager._convert_to_dataframe(line, mode)
+                    data_blocks,CellUNum,CellTNum,OtherTNumm = DBManager._convert_to_bms(line, mode)
                     i+=1
                     continue
                 try:
-                    data_block,CellUNum,CellTNum,OtherTNumm = DBManager._convert_to_dataframe(line, mode)
+                    data_block,CellUNum,CellTNum,OtherTNumm = DBManager._convert_to_bms(line, mode)
                 except:
                     continue
                 data_blocks = np.concatenate((data_blocks,data_block),axis=0)
@@ -178,35 +182,51 @@ class DBManager():
             df_all = pd.DataFrame(columns=columns_name,data=data_blocks)
             df_all.loc[:,'时间戳'] = df_all.loc[:,'时间戳'].apply(lambda x:time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(int(x)/1000)))
             return df_all
-        elif type_name =='GPS':
-            df_all = pd.DataFrame(columns=['时间戳','纬度','经度','速度[km/h]','有效位'])
+        elif type_name =='gps':
+            if mode == 0:
+                df_all = pd.DataFrame(columns=['时间戳','定位类型', '卫星数','纬度','经度','速度[km/h]','海拔','航向'])
+            elif mode == 1:
+                df_all = pd.DataFrame(columns=['时间戳','纬度','经度','速度[km/h]','有效位'])
             for line in DBManager._download_json_data(urls):
                 df_add = DBManager._convert_to_dataframe_Gps(line, mode)
                 df_all = df_all.append(df_add,ignore_index=True)
             df_all.loc[:,'时间戳'] = df_all.loc[:,'时间戳'].apply(lambda x:time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(int(x)/1000)))
             return df_all
 
-    def get_data(self, bms_url='http://172.16.126.13/store/load?dataType=12&limit=0&sn=', gps_url='http://172.16.126.13/store/load?dataType=16&limit=0&sn=',
-                sn='', start_time='', end_time='', gps_switch=True, mode=0):
+    def get_data(self, url='http://172.16.126.13/store/load?dataType={}&limit=0&sn={}', sn='', start_time='', end_time='', 
+                 data_groups=['bms', 'gps']):
         '''
         获取指定 sn 和起止日期的bms和gps数据.
         添加了重试机制。
 
         --------------输入参数------------
-        bms_url:bms 数据url, 可采用默认值
-        gps_url: gps 数据url, 可采用默认值
+        url:数据获取url, 可采用默认值
         sn: str, 电池sn号
         start_time: str, 开始时间
         end_time: str, 结束时间
-        gps_switch: True:获取gps数据; False:不获取gps数据
-        mode: 0:正常取数; 1:7255 取数
+        data_groups:  选择需要获取的数据组,可填入多个字符串(默认只获取bms和gps数据)
+                    bms: bms数据
+                    gps:gps数据
+                    system:system数据
+                    accum:accum数据
+        
 
         --------------输出参数------------
-        bms_data: 获取到的bms数据
-        gps_data: 获取到的gps数据
+        df_data: {'bms':dataframe, 'gps':dataframe, 'system':dataframe, ;accum':dataframe}
         '''
+        
+        if len(set(data_groups) - (set(data_groups) and set(['bms', 'gps', 'system', 'accum']))) > 0:
+            raise Exception("data_groups 参数错误")
+        
+        # mode: 0:正常取数; 1:7255 取数
+        if sn[0:2] == 'MG' or sn[0:2] == 'UD':
+            mode = 1
+        else:
+            mode = 0
         bms_all_data = pd.DataFrame()
         gps_all_data = pd.DataFrame()
+        system_all_data = pd.DataFrame()
+        accum_all_data = pd.DataFrame()
         maxnum = (datetime.datetime.strptime(end_time, "%Y-%m-%d %H:%M:%S") - datetime.datetime.strptime(start_time, "%Y-%m-%d %H:%M:%S")).days +1
         print("### start to get data {} from {} to {}".format(sn, start_time, end_time))
         # 为避免chunkEncodingError错误,数据每天获取一次,然后将每天的数据合并,得到最终的数据
@@ -218,15 +238,27 @@ class DBManager():
                 break
             elif timeto.strftime('%Y-%m-%d %H:%M:%S') > end_time:
                 timeto = datetime.datetime.strptime(end_time, '%Y-%m-%d %H:%M:%S')
-            File_url_bms = bms_url + sn + "&from="+timefrom.strftime('%Y-%m-%d %H:%M:%S')+"&to="+timeto.strftime('%Y-%m-%d %H:%M:%S')
-            File_url_gps = gps_url + sn + "&from="+timefrom.strftime('%Y-%m-%d %H:%M:%S')+"&to="+timeto.strftime('%Y-%m-%d %H:%M:%S')
             #print('{}_{}_----getting data----'.format(sn, timefrom))
+            bms_data = pd.DataFrame()
+            gps_data = pd.DataFrame()
+            system_data = pd.DataFrame()
+            accum_data = pd.DataFrame()
             while True:
                 try:
                     print('\r' + "# get data from {} to {}.........".format(str(timefrom), str(timeto)), end=" ")
-                    bms_data = DBManager._get_data(File_url_bms,'BMS',mode)
-                    if gps_switch:
-                        gps_data = DBManager._get_data(File_url_gps,'GPS', mode)
+                    for data_group in data_groups:
+                        if data_group == 'bms':
+                            file_url = url.format(12, sn) + "&from="+timefrom.strftime('%Y-%m-%d %H:%M:%S')+"&to="+timeto.strftime('%Y-%m-%d %H:%M:%S')
+                            bms_data = DBManager._get_data(file_url,'bms',mode)
+                        if data_group == 'gps':
+                            file_url = url.format(16, sn) + "&from="+timefrom.strftime('%Y-%m-%d %H:%M:%S')+"&to="+timeto.strftime('%Y-%m-%d %H:%M:%S')
+                            gps_data = DBManager._get_data(file_url,'gps',mode)
+                        if data_group == 'system':
+                            file_url = url.format(13, sn) + "&from="+timefrom.strftime('%Y-%m-%d %H:%M:%S')+"&to="+timeto.strftime('%Y-%m-%d %H:%M:%S')
+                            system_data = DBManager._get_data(file_url,'system',mode)
+                        if data_group == 'accum':
+                            file_url = url.format(23, sn) + "&from="+timefrom.strftime('%Y-%m-%d %H:%M:%S')+"&to="+timeto.strftime('%Y-%m-%d %H:%M:%S')
+                            accum_data = DBManager._get_data(file_url,'accum',mode)
                 except Exception as e:
                     if 'Connection broken' in str(e):
                         continue
@@ -234,13 +266,17 @@ class DBManager():
                         raise Exception
                 else:
                     bms_all_data = pd.concat([bms_all_data, bms_data], ignore_index=True)
-                    if gps_switch:
-                        gps_all_data = pd.concat([gps_all_data, gps_data], ignore_index=True)
+                    gps_all_data = pd.concat([gps_all_data, gps_data], ignore_index=True)
+                    system_all_data = pd.concat([system_all_data, system_data], ignore_index=True)
+                    accum_all_data = pd.concat([accum_all_data, accum_data], ignore_index=True)
+
                     break
-        if not bms_all_data.empty:
-            bms_all_data = bms_all_data.reset_index(drop=True)
-        if not gps_all_data.empty:
-            gps_all_data = gps_all_data.reset_index(drop=True)
-        print('all data-getting done, total_count is {} \n'.format(str(len(bms_all_data))))
-        return bms_all_data, gps_all_data
+
+        bms_all_data = bms_all_data.reset_index(drop=True)
+        gps_all_data = gps_all_data.reset_index(drop=True)
+        system_all_data = system_all_data.reset_index(drop=True)
+        accum_all_data = accum_all_data.reset_index(drop=True)
+        print('\nall data-getting done, bms_count is {}, gps_count is {}, system_count is {}, accum_count is {} \n'.format(
+            str(len(bms_all_data)), str(len(gps_all_data)), str(len(system_all_data)), str(len(accum_all_data))))
+        return {'bms':bms_all_data, 'gps':gps_all_data, 'system':system_all_data, 'accum':accum_all_data}
 

+ 265 - 0
demo.ipynb

@@ -0,0 +1,265 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "### start to get data PK50001A100000381 from 2021-06-29 12:00:00 to 2021-06-30 00:00:00\n",
+      "# get data from 2021-06-29 12:00:00 to 2021-06-30 00:00:00......... \n",
+      "all data-getting done, bms_count is 0, gps_count is 503, system_count is 0, accum_count is 0 \n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "# 获取数据\r\n",
+    "import sys\r\n",
+    "import CONFIGURE.PathSetting as PathSetting\r\n",
+    "sys.path.append(PathSetting.backend_path)\r\n",
+    "import DBManager\r\n",
+    "\r\n",
+    "dbManager = DBManager.DBManager()\r\n",
+    "df_data = dbManager.get_data(sn='PK50001A100000381', start_time='2021-06-29 12:00:00', \r\n",
+    "    end_time='2021-06-30 00:00:00', data_groups=['gps'])"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/html": [
+       "<div>\n",
+       "<style scoped>\n",
+       "    .dataframe tbody tr th:only-of-type {\n",
+       "        vertical-align: middle;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe tbody tr th {\n",
+       "        vertical-align: top;\n",
+       "    }\n",
+       "\n",
+       "    .dataframe thead th {\n",
+       "        text-align: right;\n",
+       "    }\n",
+       "</style>\n",
+       "<table border=\"1\" class=\"dataframe\">\n",
+       "  <thead>\n",
+       "    <tr style=\"text-align: right;\">\n",
+       "      <th></th>\n",
+       "      <th>时间戳</th>\n",
+       "      <th>定位类型</th>\n",
+       "      <th>卫星数</th>\n",
+       "      <th>纬度</th>\n",
+       "      <th>经度</th>\n",
+       "      <th>速度[km/h]</th>\n",
+       "      <th>海拔</th>\n",
+       "      <th>航向</th>\n",
+       "    </tr>\n",
+       "  </thead>\n",
+       "  <tbody>\n",
+       "    <tr>\n",
+       "      <th>0</th>\n",
+       "      <td>2021-06-29 14:07:24</td>\n",
+       "      <td>3.0</td>\n",
+       "      <td>4.0</td>\n",
+       "      <td>39.894867</td>\n",
+       "      <td>116.412804</td>\n",
+       "      <td>0.755616</td>\n",
+       "      <td>68.0</td>\n",
+       "      <td>170.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>1</th>\n",
+       "      <td>2021-06-29 14:09:13</td>\n",
+       "      <td>3.0</td>\n",
+       "      <td>4.0</td>\n",
+       "      <td>39.893982</td>\n",
+       "      <td>116.412666</td>\n",
+       "      <td>0.000000</td>\n",
+       "      <td>191.0</td>\n",
+       "      <td>138.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>2</th>\n",
+       "      <td>2021-06-29 14:11:02</td>\n",
+       "      <td>3.0</td>\n",
+       "      <td>6.0</td>\n",
+       "      <td>39.894615</td>\n",
+       "      <td>116.412964</td>\n",
+       "      <td>0.437072</td>\n",
+       "      <td>69.0</td>\n",
+       "      <td>100.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>3</th>\n",
+       "      <td>2021-06-29 14:12:50</td>\n",
+       "      <td>3.0</td>\n",
+       "      <td>7.0</td>\n",
+       "      <td>39.894615</td>\n",
+       "      <td>116.412964</td>\n",
+       "      <td>0.000000</td>\n",
+       "      <td>69.0</td>\n",
+       "      <td>242.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>4</th>\n",
+       "      <td>2021-06-29 14:14:39</td>\n",
+       "      <td>3.0</td>\n",
+       "      <td>6.0</td>\n",
+       "      <td>39.894615</td>\n",
+       "      <td>116.412964</td>\n",
+       "      <td>0.618568</td>\n",
+       "      <td>69.0</td>\n",
+       "      <td>126.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>...</th>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "      <td>...</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>498</th>\n",
+       "      <td>2021-06-29 22:48:10</td>\n",
+       "      <td>3.0</td>\n",
+       "      <td>13.0</td>\n",
+       "      <td>39.908268</td>\n",
+       "      <td>116.468376</td>\n",
+       "      <td>0.000000</td>\n",
+       "      <td>109.0</td>\n",
+       "      <td>152.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>499</th>\n",
+       "      <td>2021-06-29 22:49:58</td>\n",
+       "      <td>3.0</td>\n",
+       "      <td>11.0</td>\n",
+       "      <td>39.908249</td>\n",
+       "      <td>116.468361</td>\n",
+       "      <td>0.000000</td>\n",
+       "      <td>111.0</td>\n",
+       "      <td>52.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>500</th>\n",
+       "      <td>2021-06-29 22:51:47</td>\n",
+       "      <td>3.0</td>\n",
+       "      <td>12.0</td>\n",
+       "      <td>39.908249</td>\n",
+       "      <td>116.468361</td>\n",
+       "      <td>0.000000</td>\n",
+       "      <td>111.0</td>\n",
+       "      <td>52.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>501</th>\n",
+       "      <td>2021-06-29 22:53:35</td>\n",
+       "      <td>3.0</td>\n",
+       "      <td>10.0</td>\n",
+       "      <td>39.908249</td>\n",
+       "      <td>116.468361</td>\n",
+       "      <td>0.000000</td>\n",
+       "      <td>111.0</td>\n",
+       "      <td>54.0</td>\n",
+       "    </tr>\n",
+       "    <tr>\n",
+       "      <th>502</th>\n",
+       "      <td>2021-06-29 22:55:24</td>\n",
+       "      <td>3.0</td>\n",
+       "      <td>11.0</td>\n",
+       "      <td>39.908241</td>\n",
+       "      <td>116.468330</td>\n",
+       "      <td>0.359288</td>\n",
+       "      <td>113.0</td>\n",
+       "      <td>34.0</td>\n",
+       "    </tr>\n",
+       "  </tbody>\n",
+       "</table>\n",
+       "<p>503 rows × 8 columns</p>\n",
+       "</div>"
+      ],
+      "text/plain": [
+       "                     时间戳  定位类型   卫星数         纬度          经度  速度[km/h]     海拔  \\\n",
+       "0    2021-06-29 14:07:24   3.0   4.0  39.894867  116.412804  0.755616   68.0   \n",
+       "1    2021-06-29 14:09:13   3.0   4.0  39.893982  116.412666  0.000000  191.0   \n",
+       "2    2021-06-29 14:11:02   3.0   6.0  39.894615  116.412964  0.437072   69.0   \n",
+       "3    2021-06-29 14:12:50   3.0   7.0  39.894615  116.412964  0.000000   69.0   \n",
+       "4    2021-06-29 14:14:39   3.0   6.0  39.894615  116.412964  0.618568   69.0   \n",
+       "..                   ...   ...   ...        ...         ...       ...    ...   \n",
+       "498  2021-06-29 22:48:10   3.0  13.0  39.908268  116.468376  0.000000  109.0   \n",
+       "499  2021-06-29 22:49:58   3.0  11.0  39.908249  116.468361  0.000000  111.0   \n",
+       "500  2021-06-29 22:51:47   3.0  12.0  39.908249  116.468361  0.000000  111.0   \n",
+       "501  2021-06-29 22:53:35   3.0  10.0  39.908249  116.468361  0.000000  111.0   \n",
+       "502  2021-06-29 22:55:24   3.0  11.0  39.908241  116.468330  0.359288  113.0   \n",
+       "\n",
+       "        航向  \n",
+       "0    170.0  \n",
+       "1    138.0  \n",
+       "2    100.0  \n",
+       "3    242.0  \n",
+       "4    126.0  \n",
+       "..     ...  \n",
+       "498  152.0  \n",
+       "499   52.0  \n",
+       "500   52.0  \n",
+       "501   54.0  \n",
+       "502   34.0  \n",
+       "\n",
+       "[503 rows x 8 columns]"
+      ]
+     },
+     "execution_count": 2,
+     "metadata": {},
+     "output_type": "execute_result"
+    }
+   ],
+   "source": [
+    "df_data['gps']"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "interpreter": {
+   "hash": "82c48fa5b9935b41bc103dff27c1411e7645bc2453983fd386eae73200630fad"
+  },
+  "kernelspec": {
+   "display_name": "Python 3.7.6 64-bit ('MyQuant': conda)",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.7.6"
+  },
+  "orig_nbformat": 4
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}