实习程序3

来源:互联网 发布:完美云课堂软件 编辑:程序博客网 时间:2024/06/07 23:09
# coding: utf-8# In[31]:#导入必要模块import pymysql as mysqldbimport pandas as pdimport pymysql.cursorsimport influxdbimport datetimeimport osfrom influxdb import InfluxDBClientfrom influxdb import DataFrameClientfrom sqlalchemy import create_engineimport time# -*- coding: utf-8 -*-#encoding=utf-8# In[32]:def through_direct_connect():    connection = pymysql.connect(host='120.77.86.1',                                 port=6091,                                 user='root',                                 password='poi-t#admin',                                 db='poit_cloud2.0',                                 charset='utf8',                                 cursorclass=pymysql.cursors.DictCursor)    cursor = connection.cursor()    print("normal local way")    return connection,cursordef through_environ_connect():    connection = pymysql.connect(host=system_variable['MYSQL_HOST'],                                 port=int(system_variable['MYSQL_PORT']),                                 user=system_variable['MYSQL_USER'],                                 password=system_variable['MYSQL_PASSWORD'],                                 db=system_variable['MYSQL_DST_DB'],                                 charset='utf8',                                 cursorclass=pymysql.cursors.DictCursor)    cursor = connection.cursor()    print("environment way")    return connection,cursor# In[33]:def update_stream_equipment_status_day():#连接数据库    try:        connection,cursor = through_environ_connect()    except:        connection,cursor = through_direct_connect()            #拿到e_area在type=‘设备’上面的相关数据    try:        sql = "SELECT eid,id,parent_id,refer_meter,rated_current FROM " + "`" + system_variable['MYSQL_SRC_DB'] + "`" + "." + "e_area WHERE type='设备'"    except:        sql = "SELECT eid,id,parent_id,refer_meter,rated_current FROM e_area WHERE type='设备'"    cursor.execute(sql)    e_area = cursor.fetchall()        #关闭Mysql数据库    cursor.close()    connection.close()            # In[34]:        try:        client = DataFrameClient(host=system_variable['INFLUXDB_HOST'], port=int(system_variable['INFLUXDB_PORT']),username=system_variable['INFLUXDB_USER'], password=system_variable['INFLUXDB_PASSWORD'],database='original_data_db')        print("Influxdb environment way")    except:        client = DataFrameClient(host='120.77.86.1', port=6093, username='root', password='poi-t#admin', database='original_data_db')        print("Influxdb normal local way")            # In[35]:        def add_status_column(DataFrame):        if DataFrame['value']==0:            return "停机"        elif (DataFrame['value']>0) and (DataFrame['value']<DataFrame['rated_current']*0.1):            return "待机"        elif DataFrame['value']>= DataFrame['rated_current']*0.1:            return "运行"        else:            return "通讯异常"            # In[36]:        #定义变换数据结构函数,将输入的数据变成需要的数据结构    def change_to_right_type(DataFrame):        DataFrame = DataFrame.reset_index()        DataFrame = DataFrame.rename(columns={'index':'dt'})            def change_right_type(time):            return str(time).rsplit('+')[0]            DataFrame['dt'] = DataFrame['dt'].apply(change_right_type)            def convert_str_to_datetime(time_str):            #time_str = datetime.datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S")            #return time_str            time_str = datetime.datetime.strptime(time_str, "%Y-%m-%d %H:%M:%S")            time_str =  time_str + datetime.timedelta(hours=8)            return time_str                 DataFrame['dt'] = DataFrame['dt'].apply(convert_str_to_datetime)            def get_the_year(time_str):            time_year = time_str.year            return time_year        def get_the_month(time_str):            time_month = time_str.month            return time_month        def get_the_day(time_str):            time_day = time_str.day            return time_day            #DataFrame['year'] = DataFrame['dt'].apply(get_the_year)        #DataFrame['month'] = DataFrame['dt'].apply(get_the_month)        #DataFrame['day'] = DataFrame['dt'].apply(get_the_day)            return DataFrame            # In[37]:        def get_now_value_range(series):        if  series['status'] == '待机':            range_begin = 0            range_end = 0.1 * series['rated_current']        elif series['status'] == '运行':            range_begin = 0.1 * series['rated_current']            range_end = 10000000000000000000        elif series['status'] == '停机':            range_begin = -0.000000000000000000000000000000000000001            range_end = 0.000000000000000000000000000000000000000001        else:            range_begin = -100000000000000000000000            range_end = 0        return range_begin,range_end            # In[30]:            append_list = []    for each in e_area:        eid = each['eid']        tid = each['id']        rated_current = each['rated_current']        refer_meter = each['refer_meter']        sql = """SELECT time,value FROM s_electric_meter_data WHERE eid='%s' AND                      tag_name='%s' AND type='IA' ORDER  BY  time  DESC LIMIT 1""" \                % (str(eid), str(refer_meter))        data = client.query(sql)        #print(data)        if len(data) != 0:            data = data['s_electric_meter_data']            append_data = data.head(1).copy()            append_data['eid'] = eid            append_data['tid'] = tid            append_data['rated_current'] = rated_current            append_data['status'] = append_data.apply(add_status_column,axis=1)            append_data = change_to_right_type(append_data)            range_begin,range_end = get_now_value_range(append_data.loc[0])            #timem = time.time()            sql = """SELECT time,value FROM s_electric_meter_data WHERE  value>=%f AND                       tag_name='%s' AND type='IA' AND eid='%s' AND time>NOW()-90d ORDER  BY  time  DESC LIMIT 1""" \                % (range_end, str(refer_meter), str(eid))            begin_time_data1 = client.query(sql)            sql = """SELECT time,value FROM s_electric_meter_data WHERE value<=%f AND                       tag_name='%s' AND type='IA' AND eid='%s' AND time>NOW()-90d ORDER  BY  time  DESC LIMIT 1""" \                % ( range_begin ,  str(refer_meter), str(eid))            begin_time_data2 = client.query(sql)            #print("this is the traverse time:",timemm-timem)            if len(begin_time_data1) == 0:                begin_time_data2 = begin_time_data2['s_electric_meter_data']                begin_time_data2 = change_to_right_type(begin_time_data2)                begin_time_str2 = str(begin_time_data2['dt'][0])                begin_time_str = begin_time_str2                append_data = append_data.rename(columns={'dt':'end_time'})                begin_time = datetime.datetime.strptime(begin_time_str, "%Y-%m-%d %H:%M:%S")                append_data['begin_time'] = begin_time            elif len(begin_time_data2) == 0:                  begin_time_data1 = begin_time_data1['s_electric_meter_data']                begin_time_data1 = change_to_right_type(begin_time_data1)                begin_time_str1 = str(begin_time_data1['dt'][0])                begin_time_str = begin_time_str1                append_data = append_data.rename(columns={'dt':'end_time'})                begin_time = datetime.datetime.strptime(begin_time_str, "%Y-%m-%d %H:%M:%S")                append_data['begin_time'] = begin_time            else:                  begin_time_data1 = begin_time_data1['s_electric_meter_data']                begin_time_data1 = change_to_right_type(begin_time_data1)                begin_time_str1 = str(begin_time_data1['dt'][0])                begin_time_data2 = change_to_right_type(begin_time_data2)                begin_time_str2 = str(begin_time_data2['dt'][0])                begin_time_str = begin_time_str1 if begin_time_str1 > begin_time_str2 else begin_time_str2                append_data = append_data.rename(columns={'dt':'end_time'})                begin_time = datetime.datetime.strptime(begin_time_str, "%Y-%m-%d %H:%M:%S")                append_data['begin_time'] = begin_time            append_data.drop(['rated_current','value'],axis=1,inplace=True)            append_list.append(append_data)                                # In[38]:        last_append = pd.DataFrame(None, columns=['eid','tid','status','begin_time','end_time'])    for each in append_list:        last_append = last_append.append(each)            # In[39]:        try:        connection,cursor = through_environ_connect()      except:        connection,cursor = through_direct_connect()        sql = "truncate stream_equipment_status_day"    cursor.execute(sql)    connection.commit()    cursor.close()    connection.close()            # In[40]:        try:        engine = create_engine("mysql+pymysql://"+system_variable['MYSQL_USER']+":"+system_variable['MYSQL_PASSWORD']                             +"@"+system_variable['MYSQL_HOST']+":"+str(system_variable['MYSQL_PORT'])+                             "/" + system_variable['MYSQL_DST_DB'] + "?charset=utf8",echo=True)        print("engine environment way")    except:        engine = create_engine("mysql+pymysql://root:poi-t#admin@120.77.86.1:6091/poit_cloud2.0?charset=utf8",echo=True)        print("engine normal local way")            # In[30]:        last_append.to_sql(name='stream_equipment_status_day', con=engine, if_exists = 'append', index=False)        time1 = time.time()update_stream_equipment_status_day()time2 = time.time()print("running time:", time2-time1)         # In[ ]: