Browse Source

添加续驶里程

lmstack 3 years ago
parent
commit
44f8591cec

+ 47 - 0
LIB/FRONTEND/DrivingRange/create_table.py

@@ -0,0 +1,47 @@
+'''
+定义表的结构,并在数据库中创建对应的数据表
+'''
+__author__ = 'lmstack'
+
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy import Column, String, create_engine, Integer, DateTime, BigInteger, FLOAT, TIMESTAMP, func
+from urllib import parse
+Base = declarative_base()
+
+
+class ConsistencyDeltaSoc(Base):
+    __tablename__ = "driving_range_sn_factor"
+    __table_args__ = ({'comment': '续驶里程 sn factor'})  # 添加索引和表注释
+
+    id = Column(Integer, primary_key=True, autoincrement=True, comment="主键")
+    add_time = Column(TIMESTAMP(True), server_default=func.now(), comment='记录创建时间') # 创建时间
+    update_time = Column(TIMESTAMP(True), nullable=False, server_default=func.now(), onupdate=func.now(), comment='记录更新时间') # 更新时间
+    sn = Column(String(64), comment="sn")
+    date = Column(DateTime, comment="日期")
+    a0 = Column(FLOAT, comment="系数")
+    a1 = Column(FLOAT, comment="系数")
+    a2 = Column(FLOAT, comment="系数")
+    a3 = Column(FLOAT, comment="系数")
+    a4 = Column(FLOAT, comment="系数")
+
+
+    # def __init__(self, sn, current, time_stamp, pack_state, line_state):
+    #     self.sn = sn
+    #     self.current = current
+    #     self.time_stamp = time_stamp
+    #     self.pack_state = pack_state
+    #     self.line_state = line_state
+
+# 执行该文件,创建表格到对应的数据库中
+if __name__ == "__main__":
+    host = 'rm-bp10j10qy42bzy0q77o.mysql.rds.aliyuncs.com'
+    port = 3306
+    user = 'qx_cas'
+    password = parse.quote_plus('Qx@123456')
+    database = 'qx_cas'
+    
+    db_engine = create_engine(
+        "mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8".format(
+            user, password, host, port, database
+        ))
+    Base.metadata.create_all(db_engine)

+ 47 - 0
LIB/FRONTEND/DrivingRange/create_table1.py

@@ -0,0 +1,47 @@
+'''
+定义表的结构,并在数据库中创建对应的数据表
+'''
+__author__ = 'lmstack'
+
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy import Column, String, create_engine, Integer, DateTime, BigInteger, FLOAT, TIMESTAMP, func
+from urllib import parse
+Base = declarative_base()
+
+
+class ConsistencyDeltaSoc(Base):
+    __tablename__ = "driving_range_sn_factor_newest"
+    __table_args__ = ({'comment': '续驶里程 最新sn factor'})  # 添加索引和表注释
+
+    id = Column(Integer, primary_key=True, autoincrement=True, comment="主键")
+    add_time = Column(TIMESTAMP(True), server_default=func.now(), comment='记录创建时间') # 创建时间
+    update_time = Column(TIMESTAMP(True), nullable=False, server_default=func.now(), onupdate=func.now(), comment='记录更新时间') # 更新时间
+    sn = Column(String(64), comment="sn")
+    date = Column(DateTime, comment="日期")
+    a0 = Column(FLOAT, comment="系数")
+    a1 = Column(FLOAT, comment="系数")
+    a2 = Column(FLOAT, comment="系数")
+    a3 = Column(FLOAT, comment="系数")
+    a4 = Column(FLOAT, comment="系数")
+
+
+    # def __init__(self, sn, current, time_stamp, pack_state, line_state):
+    #     self.sn = sn
+    #     self.current = current
+    #     self.time_stamp = time_stamp
+    #     self.pack_state = pack_state
+    #     self.line_state = line_state
+
+# 执行该文件,创建表格到对应的数据库中
+if __name__ == "__main__":
+    host = 'rm-bp10j10qy42bzy0q77o.mysql.rds.aliyuncs.com'
+    port = 3306
+    user = 'qx_cas'
+    password = parse.quote_plus('Qx@123456')
+    database = 'qx_cas'
+    
+    db_engine = create_engine(
+        "mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8".format(
+            user, password, host, port, database
+        ))
+    Base.metadata.create_all(db_engine)

+ 49 - 0
LIB/FRONTEND/DrivingRange/create_table2.py

@@ -0,0 +1,49 @@
+'''
+定义表的结构,并在数据库中创建对应的数据表
+'''
+__author__ = 'lmstack'
+
+from sqlalchemy.ext.declarative import declarative_base
+from sqlalchemy import Column, String, create_engine, Integer, DateTime, BigInteger, FLOAT, TIMESTAMP, func
+from urllib import parse
+Base = declarative_base()
+
+
+class ConsistencyDeltaSoc(Base):
+    __tablename__ = "driving_range_result"
+    __table_args__ = ({'comment': '每5分钟计算一次续驶里程结果'})  # 添加索引和表注释
+
+    id = Column(Integer, primary_key=True, autoincrement=True, comment="主键")
+    add_time = Column(TIMESTAMP(True), server_default=func.now(), comment='记录创建时间') # 创建时间
+    update_time = Column(TIMESTAMP(True), nullable=False, server_default=func.now(), onupdate=func.now(), comment='记录更新时间') # 更新时间
+    sn = Column(String(64), comment="sn")
+    time = Column(DateTime, comment="时间")
+    soc = Column(FLOAT, comment="soc")
+    a0 = Column(FLOAT, comment="系数")
+    a1 = Column(FLOAT, comment="系数")
+    a2 = Column(FLOAT, comment="系数")
+    a3 = Column(FLOAT, comment="系数")
+    a4 = Column(FLOAT, comment="系数")
+    vehelecrng = Column(FLOAT, comment="续驶里程")
+
+
+    # def __init__(self, sn, current, time_stamp, pack_state, line_state):
+    #     self.sn = sn
+    #     self.current = current
+    #     self.time_stamp = time_stamp
+    #     self.pack_state = pack_state
+    #     self.line_state = line_state
+
+# 执行该文件,创建表格到对应的数据库中
+if __name__ == "__main__":
+    host = 'rm-bp10j10qy42bzy0q77o.mysql.rds.aliyuncs.com'
+    port = 3306
+    user = 'qx_cas'
+    password = parse.quote_plus('Qx@123456')
+    database = 'qx_cas'
+    
+    db_engine = create_engine(
+        "mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8".format(
+            user, password, host, port, database
+        ))
+    Base.metadata.create_all(db_engine)

+ 92 - 0
LIB/FRONTEND/DrivingRange/deploy_driving_range.py

@@ -0,0 +1,92 @@
+#coding=utf-8
+import os
+import datetime
+import pandas as pd
+from LIB.BACKEND import DBManager, Log
+from LIB.MIDDLE import SignalMonitor
+from sqlalchemy import create_engine
+from sqlalchemy.orm import sessionmaker
+import time, datetime
+import traceback
+from LIB.MIDDLE.DrivingRange import UpdtFct
+from urllib import parse
+import pymysql
+import dateutil.relativedelta
+
+dbManager = DBManager.DBManager()
+if __name__ == "__main__":
+    
+    # 时间设置
+    now_time = datetime.datetime.now()
+    pre_time = now_time + dateutil.relativedelta.relativedelta(minutes=-30)
+    end_time=datetime.datetime.strftime(now_time,"%Y-%m-%d %H:%M:%S")
+    start_time=datetime.datetime.strftime(pre_time,"%Y-%m-%d %H:%M:%S")
+
+
+    # # 更新sn列表
+    # host='rm-bp10j10qy42bzy0q7.mysql.rds.aliyuncs.com'
+    # port=3306
+    # db='qixiang_oss'
+    # user='qixiang_oss'
+    # password='Qixiang2021'
+    # conn = pymysql.connect(host=host, port=port, user=user, password=password, database=db)
+    # cursor = conn.cursor()
+    # cursor.execute("select sn, imei from app_device")
+    # res = cursor.fetchall()
+    # df_sn = pd.DataFrame(res, columns=['sn', 'imei'])
+    # df_sn = df_sn.reset_index(drop=True)
+    # conn.close();
+    
+    # 数据库配置
+    host = 'rm-bp10j10qy42bzy0q77o.mysql.rds.aliyuncs.com'
+    port = 3306
+    user = 'qx_cas'
+    password = parse.quote_plus('Qx@123456')
+    database = 'qx_cas'
+
+    db_engine = create_engine(
+        "mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8".format(
+            user, password, host, port, database
+        ))
+    DbSession = sessionmaker(bind=db_engine)
+    db_qx = pymysql.connect(
+        host='rm-bp10j10qy42bzy0q77o.mysql.rds.aliyuncs.com',
+        user='qx_read',
+        password='Qx@123456',#Qx@123456
+        database='qx_cas',
+        charset='utf8'
+    )
+    
+    # 日志配置
+    now_str = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()).replace(":","_")
+    log_path = 'log/driving_range/{}/'.format(now_str[0:10]) + now_str
+    if not os.path.exists(log_path):
+        os.makedirs(log_path)
+    log = Log.Mylog(log_name='driving_range', log_level = 'info')
+    log.set_file_hl(file_name='{}/info.log'.format(log_path), log_level='info', size=1024* 1024 * 100)
+    log.set_file_hl(file_name='{}/error.log'.format(log_path), log_level='error', size=1024* 1024 * 100)
+    logger = log.get_logger()
+
+    logger.info("pid is {}".format(os.getpid()))
+    
+    # SNdata_6060 = pd.read_excel('骑享资产梳理-20210621.xlsx', sheet_name='6060')
+    # SNnums_6060=SNdata_6060['SN号']
+    # # SNnums_6060 = ['PK504B00100004019','PK504B00100004029', 'PK504B00100004080', 'PK504B00100004264', 'PK504B10100004331']
+    # now_time=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
+    # now_time = "2021-08-01 00:00:00" # 定时任务开启时,需要删除改行!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+    # now_time=datetime.datetime.strptime(now_time,'%Y-%m-%d %H:%M:%S')
+    # start_time=now_time-datetime.timedelta(days=1000)
+    # end_time=str(now_time)
+    # start_time=str(start_time)
+    try:
+        #调度周期:每天运行一次。
+        #更新所有sn,连读多日的factor,如果start_date和end_date相隔一天,代表更新start_date的factor。
+        logger.info(u"{},{} 任务运行开始\n".format(start_time,end_time), exc_info=True)
+        UpdtFct.updtVehElecRng(db_qx, db_qx, db_engine, range_table_name='driving_range_result', sn_newest_table_name='driving_range_sn_factor_newest', input_time=pre_time)
+        logger.info(u"{},{} 续驶里程计算完成\n".format(start_time,end_time), exc_info=True)
+    except:
+        logger.error(traceback.format_exc)
+        logger.error(u"{},{} 任务运行错误\n".format(start_time,end_time), exc_info=True)
+
+

+ 95 - 0
LIB/FRONTEND/DrivingRange/deploy_sn_factor.py

@@ -0,0 +1,95 @@
+#coding=utf-8
+import os
+import datetime
+import pandas as pd
+from LIB.BACKEND import DBManager, Log
+from LIB.MIDDLE import SignalMonitor
+from sqlalchemy import create_engine
+from sqlalchemy.orm import sessionmaker
+import time, datetime
+import traceback
+from LIB.MIDDLE.DrivingRange import UpdtFct
+from urllib import parse
+import pymysql
+import dateutil.relativedelta
+
+dbManager = DBManager.DBManager()
+if __name__ == "__main__":
+    
+    # 时间设置
+    now_time = datetime.datetime.now()
+    pre_time = now_time + dateutil.relativedelta.relativedelta(days=-50)
+    end_time=datetime.datetime.strftime(now_time,"%Y-%m-%d 23:59:00")
+    start_time=datetime.datetime.strftime(pre_time,"%Y-%m-%d 23:59:00")
+
+
+    # # 更新sn列表
+    # host='rm-bp10j10qy42bzy0q7.mysql.rds.aliyuncs.com'
+    # port=3306
+    # db='qixiang_oss'
+    # user='qixiang_oss'
+    # password='Qixiang2021'
+    # conn = pymysql.connect(host=host, port=port, user=user, password=password, database=db)
+    # cursor = conn.cursor()
+    # cursor.execute("select sn, imei from app_device")
+    # res = cursor.fetchall()
+    # df_sn = pd.DataFrame(res, columns=['sn', 'imei'])
+    # df_sn = df_sn.reset_index(drop=True)
+    # conn.close();
+    
+    # 数据库配置
+    host = 'rm-bp10j10qy42bzy0q77o.mysql.rds.aliyuncs.com'
+    port = 3306
+    user = 'qx_cas'
+    password = parse.quote_plus('Qx@123456')
+    database = 'qx_cas'
+
+    db_engine = create_engine(
+        "mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8".format(
+            user, password, host, port, database
+        ))
+    DbSession = sessionmaker(bind=db_engine)
+    db_qx = pymysql.connect(
+        host='rm-bp10j10qy42bzy0q77o.mysql.rds.aliyuncs.com',
+        user='qx_read',
+        password='Qx@123456',#Qx@123456
+        database='qx_cas',
+        charset='utf8'
+    )
+    
+    # 日志配置
+    now_str = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()).replace(":","_")
+    log_path = 'log/sn_factor/' + now_str
+    if not os.path.exists(log_path):
+        os.makedirs(log_path)
+    log = Log.Mylog(log_name='driving_range', log_level = 'info')
+    log.set_file_hl(file_name='{}/info.log'.format(log_path), log_level='info', size=1024* 1024 * 100)
+    log.set_file_hl(file_name='{}/error.log'.format(log_path), log_level='error', size=1024* 1024 * 100)
+    logger = log.get_logger()
+
+    logger.info("pid is {}".format(os.getpid()))
+    
+    # SNdata_6060 = pd.read_excel('骑享资产梳理-20210621.xlsx', sheet_name='6060')
+    # SNnums_6060=SNdata_6060['SN号']
+    # # SNnums_6060 = ['PK504B00100004019','PK504B00100004029', 'PK504B00100004080', 'PK504B00100004264', 'PK504B10100004331']
+    # now_time=datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
+    # now_time = "2021-08-01 00:00:00" # 定时任务开启时,需要删除改行!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+    # now_time=datetime.datetime.strptime(now_time,'%Y-%m-%d %H:%M:%S')
+    # start_time=now_time-datetime.timedelta(days=1000)
+    # end_time=str(now_time)
+    # start_time=str(start_time)
+    try:
+        #调度周期:每天运行一次。
+        #更新所有sn,连读多日的factor,如果start_date和end_date相隔一天,代表更新start_date的factor。
+        logger.info(u"{},{} 任务运行开始\n".format(start_time,end_time), exc_info=True)
+        UpdtFct.updtAllSnFct(start_time[0:10],end_time[0:10], db_engine, db_qx, db_qx, sn_table_name='driving_range_sn_factor')
+        logger.info(u"{},{} sn 参数更新完成\n".format(start_time,end_time), exc_info=True)
+        logger.info(u"{},{} sn 最新参数更新开始\n".format(start_time,end_time), exc_info=True)
+        UpdtFct.updtNewestFctTb(db_qx, db_engine, sn_table_name='driving_range_sn_factor', sn_newest_table_name='driving_range_sn_factor_newest')
+        logger.info(u"{},{} sn 最新参数更新完成\n".format(start_time,end_time), exc_info=True)
+    except:
+        logger.error(traceback.format_exc)
+        logger.error(u"{},{} 任务运行错误\n".format(start_time,end_time), exc_info=True)
+
+

+ 2 - 0
LIB/FRONTEND/DrivingRange/run_driving_range.bat

@@ -0,0 +1,2 @@
+cd /d D:\deploy\python_platform\data_analyze_platform\LIB\FRONTEND\DrivingRange
+D:\env\py_pro\python.exe D:\deploy\python_platform\data_analyze_platform\LIB\FRONTEND\DrivingRange\deploy_driving_range.py

+ 2 - 0
LIB/FRONTEND/DrivingRange/run_sn_factor.bat

@@ -0,0 +1,2 @@
+cd /d D:\deploy\python_platform\data_analyze_platform\LIB\FRONTEND\DrivingRange
+D:\env\py_pro\python.exe D:\deploy\python_platform\data_analyze_platform\LIB\FRONTEND\DrivingRange\deploy_sn_factor.py

+ 2 - 1
LIB/MIDDLE/DrivingRange/UpdtFct.py

@@ -389,7 +389,7 @@ def updtVehElecRng(db_qx, db_local, db_engine, range_table_name='tb_sn_factor_so
     current_time_str="'"+current_time_str+"'"
 
     #从drive_info里面读取,该时间段内的name,time,soc三列
-    sql_cmd="select name,time,soc from drive_info where time between "+before6min_time_str+" and "+current_time_str
+    sql_cmd="select name,time,soc from drive_info where time between " + before6min_time_str + " and " + current_time_str
     # print(sql_cmd)
     range_soc_df = pd.read_sql(sql_cmd, db_qx)#使用read_sql方法查询qx数据库
     range_soc_df.rename(columns={'name':'sn'},inplace=True)#将name列重命名为sn列
@@ -413,6 +413,7 @@ def updtVehElecRng(db_qx, db_local, db_engine, range_table_name='tb_sn_factor_so
         sn_soc_factor_range_df=sn_soc_factor_range_df.append(sn_soc_factor_range_row)#拼接
 
     ##任务5,将sn_soc_factor_range_df写入到tb_sn_factor_soc_range中,使用替换关系。
+    pdb.set_trace()
     sn_soc_factor_range_df.to_sql(range_table_name,con=db_engine,chunksize=10000,\
         if_exists='replace',index=False)