路由信息 ioRule.py 统计


In [56]:
from dist_time import *
import pandas as pd
from collections.abc import Iterator, Iterable, Generator
from collections import defaultdict
import re
import os
from sqlalchemy import create_engine
from sqlalchemy.types import Integer, Text, DateTime, Float, VARCHAR
from sqlalchemy import Table, MetaData, Column
import itertools as it
import pickle


MACHINE_MAP = {'PreSort': 'm', 'Unload': 'r', 'Secondary': 'c', 'Primary': 'm', 'Export':'e', 'Reload': 'RE'}
MACHINE_MAP_ID = {'PreSort': 'm', 'Unload': 'a', 'Secondary': 'c', 'Primary': 'm', 'Export':'e', 'Reload': 'RE'}
FILE_DEFAULT_PATH = "d:\\Git\\git.jupyter\\jupyter_app\\ipython\\py36_erzhou_input\\dist_time\\out"

class MySQLConfig:
    HOST = '10.0.149.62'
    USER = "root"
    PASS = "root123"
    DB = "cm_erzhou_v1_1"
    CHARSET = 'utf8'

    engine = create_engine(
        f'mysql+pymysql://{USER}:{PASS}@{HOST}/{DB}?charset={CHARSET}',
        isolation_level="READ UNCOMMITTED")
    
    
def creat_table():
    db_eng = MetaData(bind=MySQLConfig.engine)
    machine_table_sche = \
    Table(
        "i_queue_io",
        db_eng,
        Column("equipment_port_last", VARCHAR(length=32, )),
        Column("equipment_port_next", VARCHAR(length=32, )),
        Column("equipment_area_last", VARCHAR(length=32, )),
        Column("equipment_area_next", VARCHAR(length=32, )),
        Column("parameter_name", VARCHAR(length=64, )),
    )
    machine_table_sche.create(checkfirst=True)

def to_mysql(table_name: str, data: pd.DataFrame):
    
        try:
            data.to_sql(name=table_name,
                        con=MySQLConfig.engine,
                        if_exists='append',
                        index=0)
            print(f"mysql write table {table_name} succeed!")
            
        except Exception as exc:
            print(f"mysql write table {table_name} failed, error: {exc}.")
            raise Exception
    
    
def dict_to_dataframe(pd: pd, *, parameter_list: list=None):
   
    data = defaultdict(list)
    for paramer in parameter_list:
        data['process_time'].extend(list(paramer.values()))
        data ['parameter_name'].extend(list(paramer.keys()))
        
    return pd.DataFrame(data)


def df_to_excel(file_name, sheet, df):
    file = f"d:\\Git\\git.jupyter\\jupyter_app\\ipython\\py36_erzhou_input\\dist_time\\out\\{file_name}.xlsx"
    df.to_excel(file, sheet_name=sheet, index=False)
    
    
def df_to_pickle(df, path_file=None, file_name: str='data', compression: str='infer'):
    """"""
    if path_file is None:
        path_file = f"d:\\Git\\git.jupyter\\jupyter_app\\ipython\\py36_erzhou_input\\dist_time\\out\\{file_name}"
    else:
        path_file = os.path.join(path_file, file_name)
    if compression is None:
        
        df.to_pickle(path_file)
    else:
        df.to_pickle(path_file, compression)
    
    return path_file
    
    
def check_dic_value(data: dict=None):
    type_dic_value = set()
    if data is None:
        return
    else:
        for _,v in data.items():
            if isinstance(v, list):
                type_dic_value.add('L')
            elif isinstance(v, str):
                type_dic_value.add('S')
            elif isinstance(v, int):
                type_dic_value.add('I')
            else:
                raise ValueError('字典值类型不是字符或列表形式!')
            if len(type_dic_value) !=1:
                raise ValueError('字典值类型既有字符也有列表!')
        return {type_dic_value.pop(): data}

    
def dict_list_to_dataframe(pd: pd.DataFrame, parameter_list: list=None):
    if parameter_list:
        re_list = []
        for data in parameter_list:
#             print(data[1])
            ckeck_data = check_dic_value(data[0])
            for k, _ in ckeck_data.items():
                if k == 'L':  # L 表示字典存储值类型为列表
                    re_data = it.chain(
                        *[i for  i in map(
                            lambda x, y : [[x, v, data[1]] for v in y if  isinstance(y, list)], 
                            ckeck_data[k].keys(), ckeck_data[k].values())]
                    )
                    re_list.extend(re_data)
#                     return pd.DataFrame(list(re_data), columns=['equipment_port_last', 'equipment_port_next'])
                elif k == 'S':  # S表示字典存储值类型为字符串
                    re_data = [[k, v, data[1]] for k, v in ckeck_data[k].items()]
                    re_list.extend(re_data)
        return pd.DataFrame(re_list, columns=['equipment_port_last', 'equipment_port_next', 'parameter_name'])
    else:
        return parameter_list
    
# def add_area_tag(data: dict=None, tag: str=''):
#     if data:
#         return {_: v for k, v in data}

配置信息表


In [2]:
QUEUE_IO_DICT = {
    'R': [
        (R_Dock_Unload, 'R_Dock_Unload'), # 卸货口Dock与卸货区对应关系
        (R_Dock_R_PreSort_rule, 'R_Dock_R_PreSort_rule'), # 卸货区与初分拣机对应关系
        (R_PreSort_infeed_rule, 'R_PreSort_infeed_rule'), # 初分拣机入口与初分拣机对应关系
        (R_PreSort_D_Primary_rule, 'R_PreSort_D_Primary_rule'), # 初分拣机与国内初分拣机链接信息
        (R_PreSort_S_Primary_rule, 'R_PreSort_S_Primary_rule'), # 初分拣机与小件初分拣机链接信息
        (R_PreSort_I_Export_rule, 'R_PreSort_I_Export_rule'), # 初分拣机与海关机器入口链接信息
        (R_Secondary_infeed_rule, 'R_Secondary_infeed_rule'), # 终分拣机入口信息
        (R_Secondary_R_Reload_rule, 'R_Secondary_R_Reload_rule'), # 终分拣机出口与装货区出口对应信息
    ],
    'D': [
        (D_Dock_Unload, 'D_Dock_Unload'), #  卸货口Dock与卸货区对应关系
        (D_Dock_D_Primary_rule, 'D_Dock_D_Primary_rule'), # 卸货区与初分拣机对应关系
        (D_Dock_S_Primary_rule, 'D_Dock_S_Primary_rule'), # 初分拣机与小件初分拣机链接信息
        (D_Primary_infeed_rule, 'D_Primary_infeed_rule'), # 初分拣机入口与初分拣机对应关系
        (D_Secondary_infeed_rule, 'D_Secondary_infeed_rule'), #  终分拣机入口与终分拣机对应关系
        (D_Secondary_D_Reload_rule, 'D_Secondary_D_Reload_rule'), #  终分拣机出口与装货区出口链接信息
    ],
    'I': [
        (I_Dock_Unload, 'I_Dock_Unload'), # 卸货口Dock与卸货区对应关系
        (I_Dock_I_PreSort_rule, 'I_Dock_I_PreSort_rule'),  # 卸货区与初分拣机对应关系
        (I_PreSort_infeed_rule, 'I_PreSort_infeed_rule'),  #  初分拣机入口与初分拣机对应关系
        (I_PreSort_D_Primary_rule, 'I_PreSort_D_Primary_rule'),  #  国际初分拣与国内初分拣机对应关系
        (I_PreSort_S_Primary_rule, 'I_PreSort_S_Primary_rule'),  #  国际初分拣与小件初分拣机对应关系
        (I_Export_infeed_rule, 'I_Export_infeed_rule'),  # 海关机入口与海关机器对应关系
        (I_Export_I_Export_rule, 'I_Export_I_Export_rule'),  # 海关区与海关机对应关系
        (I_Secondary_infeed_rule, 'I_Secondary_infeed_rule'), # 终分拣机入口与终分拣机对应关系
        (I_Secondary_I_Reload_rule, 'I_Secondary_I_Reload_rule')  # 终分拣机出口与装货区出口链接信息
        
    ],
    'S': [
        (S_Secondary_infeed_rule, 'S_Secondary_infeed_rule'),  # 小件终分拣机入口与小件终分拣机对应关系
        (S_Secondary_D_Primary_rule, 'S_Secondary_D_Primary_rule'),  # 小件终分拣机与国内初分拣机对应关系
        (S_Secondary_I_PreSort_rule, 'S_Secondary_I_PreSort_rule'),  # 小件终分拣机与国际初分拣机对应关系
        (S_Secondary_S_Secondary_Pack_rule, 'S_Secondary_S_Secondary_Pack_rule'),  # 小件终分拣出口与打包机对应关系
        (S_Primary_infeed_rule, 'S_Primary_infeed_rule')  # 小件初分拣机入口与小件初分拣机对应关系
    ]       
}
QUEUE_RELOAD_DICT = {
    'D': [
        (R_Secondary_rule, 'R_PreSort_infeed_rule'), 
        (R_Reload_R_Secondary, 'R_PreSort_infeed_rule'),
    ]
}

R类


In [3]:
r_queue_df = dict_list_to_dataframe(pd, parameter_list=QUEUE_IO_DICT['R'])
r_queue_df['equipment_area_last'], r_queue_df['equipment_port_last'] = r_queue_df.equipment_port_last.str.split('_', 1).str
r_queue_df.equipment_port_next = r_queue_df.equipment_port_next.where(
    r_queue_df.equipment_port_next.str.contains('^[A-Z]_'), 
    'R_'+r_queue_df.equipment_port_next)
r_queue_df['equipment_area_next'], r_queue_df['equipment_port_next'] = r_queue_df.equipment_port_next.str.split('_', 1).str
r_queue_data = r_queue_df.loc[:,[
    'equipment_port_last', 'equipment_port_next', 'equipment_area_last', 'equipment_area_next', 'parameter_name']]
# r_queue_data.equipment_port_next
r_queue_data.head(10)


Out[3]:
equipment_port_last equipment_port_next equipment_area_last equipment_area_next parameter_name
0 Dock1 Unload1 R R R_Dock_Unload
1 Dock2 Unload1 R R R_Dock_Unload
2 Dock3 Unload1 R R R_Dock_Unload
3 Dock4 Unload1 R R R_Dock_Unload
4 Dock5 Unload1 R R R_Dock_Unload
5 Dock6 Unload1 R R R_Dock_Unload
6 Dock7 Unload1 R R R_Dock_Unload
7 Dock8 Unload1 R R R_Dock_Unload
8 Dock9 Unload1 R R R_Dock_Unload
9 Dock10 Unload1 R R R_Dock_Unload

D类


In [4]:
d_queue_df = dict_list_to_dataframe(pd, parameter_list=QUEUE_IO_DICT['D'])
d_queue_df.equipment_port_last = d_queue_df.equipment_port_last.where(
    d_queue_df.equipment_port_last.str.contains('^[A-Z]_'), 
    'D_'+d_queue_df.equipment_port_last)
d_queue_df['equipment_area_last'], d_queue_df['equipment_port_last'] = d_queue_df.equipment_port_last.str.split('_', 1).str
d_queue_df.equipment_port_next = d_queue_df.equipment_port_next.where(
    d_queue_df.equipment_port_next.str.contains('^[A-Z]_'), 
    'D_'+d_queue_df.equipment_port_next)
d_queue_df['equipment_area_next'], d_queue_df['equipment_port_next'] = d_queue_df.equipment_port_next.str.split('_', 1).str
d_queue_data = d_queue_df.loc[:,[
    'equipment_port_last', 'equipment_port_next', 'equipment_area_last', 'equipment_area_next', 'parameter_name']]
d_queue_data.sample(10)


Out[4]:
equipment_port_last equipment_port_next equipment_area_last equipment_area_next parameter_name
2495 Primary6_1_in4 Primary6_1 D D D_Primary_infeed_rule
1765 Dock442 Unload14 D D D_Dock_Unload
2812 Primary4_2_in9 Primary4_2 D D D_Primary_infeed_rule
2841 Primary7_2_in2 Primary7_2 D D D_Primary_infeed_rule
3933 Secondary16_1_ot23 Reload29_ot23 D D D_Secondary_D_Reload_rule
411 Dock103 Unload6 D D D_Dock_Unload
1847 Dock462 Unload23 D D D_Dock_Unload
2047 Dock512 Unload14 D D D_Dock_Unload
1324 Dock332 Unload10 D D D_Dock_Unload
2760 Primary28_1_in5 Primary28_1 D D D_Primary_infeed_rule

I类


In [5]:
i_queue_df = dict_list_to_dataframe(pd, parameter_list=QUEUE_IO_DICT['I'])
i_queue_df.equipment_port_last = i_queue_df.equipment_port_last.where(
    i_queue_df.equipment_port_last.str.contains('^[A-Z]_'), 
    'I_'+i_queue_df.equipment_port_last)
i_queue_df['equipment_area_last'], i_queue_df['equipment_port_last'] = i_queue_df.equipment_port_last.str.split('_', 1).str
i_queue_df.equipment_port_next = i_queue_df.equipment_port_next.where(
    i_queue_df.equipment_port_next.str.contains('^[A-Z]_'), 
    'I_'+i_queue_df.equipment_port_next)
i_queue_df['equipment_area_next'], i_queue_df['equipment_port_next'] = i_queue_df.equipment_port_next.str.split('_', 1).str
i_queue_data = i_queue_df.loc[:,[
    'equipment_port_last', 'equipment_port_next', 'equipment_area_last', 'equipment_area_next', 'parameter_name']]
i_queue_data.sample(10)
# i_queue_df[i_queue_df.equipment_port_last=='I_Dock72']#[70:]


Out[5]:
equipment_port_last equipment_port_next equipment_area_last equipment_area_next parameter_name
1937 PreSort8 Primary24_2 I D I_PreSort_D_Primary_rule
1108 Dock159 Unload17 I I I_Dock_Unload
1247 Dock179 Unload15 I I I_Dock_Unload
2811 Secondary6_2_ot1 Reload21_ot1 I I I_Secondary_I_Reload_rule
2160 Export9 Export9_1 I I I_Export_I_Export_rule
1745 Dock250 Unload19 I I I_Dock_Unload
1344 Dock193 Unload15 I I I_Dock_Unload
1871 PreSort9_1_in2 PreSort9_1 I I I_PreSort_infeed_rule
1611 Dock231 Unload18 I I I_Dock_Unload
1260 Dock181 Unload15 I I I_Dock_Unload

S类


In [6]:
s_queue_df = dict_list_to_dataframe(pd, parameter_list=QUEUE_IO_DICT['S'])
s_queue_df.equipment_port_last = s_queue_df.equipment_port_last.where(
    s_queue_df.equipment_port_last.str.contains('^[A-Z]_'), 
    'S_'+s_queue_df.equipment_port_last)
s_queue_df['equipment_area_last'], s_queue_df['equipment_port_last'] = s_queue_df.equipment_port_last.str.split('_', 1).str
s_queue_df.equipment_port_next = s_queue_df.equipment_port_next.where(
    s_queue_df.equipment_port_next.str.contains('^[A-Z]_'), 
    'S_'+s_queue_df.equipment_port_next)
s_queue_df['equipment_area_next'], s_queue_df['equipment_port_next'] = s_queue_df.equipment_port_next.str.split('_', 1).str
s_queue_data = s_queue_df.loc[:,[
    'equipment_port_last', 'equipment_port_next', 'equipment_area_last', 'equipment_area_next', 'parameter_name']]

s_queue_data.sample(10)  # [s_queue_data.equipment_port_next.str.contains('Secondary16_Pack100')]


Out[6]:
equipment_port_last equipment_port_next equipment_area_last equipment_area_next parameter_name
6600 Secondary11_2_ot137 Secondary11_Pack137 S S S_Secondary_S_Secondary_Pack_rule
8986 Secondary5_3_ot183 Secondary5_Pack183 S S S_Secondary_S_Secondary_Pack_rule
3456 Secondary14_1_ot35 Secondary14_Pack35 S S S_Secondary_S_Secondary_Pack_rule
2915 Secondary11_1_ot196 Secondary11_Pack196 S S S_Secondary_S_Secondary_Pack_rule
1563 Secondary6_1_ot14 Secondary6_Pack14 S S S_Secondary_S_Secondary_Pack_rule
1883 Secondary7_1_ot100 Secondary7_Pack100 S S S_Secondary_S_Secondary_Pack_rule
1379 Secondary5_1_ot64 Secondary5_Pack64 S S S_Secondary_S_Secondary_Pack_rule
6346 Secondary10_2_ot117 Secondary10_Pack117 S S S_Secondary_S_Secondary_Pack_rule
9410 Secondary7_3_ot139 Secondary7_Pack139 S S S_Secondary_S_Secondary_Pack_rule
4083 Secondary16_1_ot194 Secondary16_Pack194 S S S_Secondary_S_Secondary_Pack_rule

all queue

  • r_queue_data, d_queue_data, i_queue_data, s_queue_data

In [55]:
queue_concat = pd.concat([r_queue_data, d_queue_data, i_queue_data, s_queue_data], axis=0)

path_pkl = df_to_pickle(
    queue_concat, 
#     path_file = FILE_DEFAULT_PATH, 
    file_name='i_queue_io.xz',
    compression='xz'
)
df_pkl = pd.read_pickle(
    path=path_pkl, 
    compression='xz'
)
df_pkl.sample(10)


Out[55]:
equipment_port_last equipment_port_next equipment_area_last equipment_area_next parameter_name
6509 Secondary11_2_ot46 Secondary11_Pack46 S S S_Secondary_S_Secondary_Pack_rule
474 Secondary2_2_ot9 Reload31_ot9 R R R_Secondary_R_Reload_rule
6260 Secondary10_2_ot31 Secondary10_Pack31 S S S_Secondary_S_Secondary_Pack_rule
2536 Secondary10_1_ot51 Secondary10_Pack51 S S S_Secondary_S_Secondary_Pack_rule
9411 Secondary7_3_ot140 Secondary7_Pack140 S S S_Secondary_S_Secondary_Pack_rule
2065 Export8_1_in6 Export8_1 I I I_Export_infeed_rule
10569 Secondary12_3_ot128 Secondary12_Pack128 S S S_Secondary_S_Secondary_Pack_rule
6602 Secondary11_2_ot139 Secondary11_Pack139 S S S_Secondary_S_Secondary_Pack_rule
5590 Secondary7_2_ot63 Secondary7_Pack63 S S S_Secondary_S_Secondary_Pack_rule
270 Secondary13_3_in5 Secondary13_3 S S S_Secondary_infeed_rule

In [40]:
q_secondary_out = queue_concat[
    queue_concat.equipment_port_next.str.startswith('Unload') & queue_concat.parameter_name.str.endswith('Dock_Unload') 
#     & queue_concat.equipment_area_next.str.startswith('I') & queue_concat.equipment_area_last.str.startswith('I')
                       ]
# q_unload.parameter_name.str.contains

# q_secondary_out['equipment_id'], _ = q_secondary_out.equipment_port_last.str.split('_ot', 1).str
# q_secondary_out = q_secondary_out.loc[:,[
#     'equipment_port_last', 'equipment_port_next', 'equipment_area_last', 'equipment_area_next', 'parameter_name']]

# i_t_group = q_secondary_out.groupby(
#     ['equipment_id', 'equipment_area_last']).equipment_port_last.apply(set).apply(len).to_frame().reset_index()
# df_to_excel(file_name='unload_set', sheet='unload_set', df=q_secondary_out)
# q_secondary_out
# i_t_group #.sort_values([ 'equipment_port_next'])