202 lines
15 KiB
Python
202 lines
15 KiB
Python
|
|
# -*- coding: utf-8 -*-
|
||
|
|
# @Author: Owl
|
||
|
|
# @Date: 2025/11/27 11:17
|
||
|
|
# @Description: 路口优化对比页面相关公共函数
|
||
|
|
from pypinyin import lazy_pinyin
|
||
|
|
|
||
|
|
from app.eva_common import *
|
||
|
|
|
||
|
|
|
||
|
|
def gen_compare_overview_res(eva_overview, comp_eva_overview):
|
||
|
|
# comp_index 为优化前指标
|
||
|
|
main_flows_num = len(eva_overview['main_flow_src_desc'].split('、'))
|
||
|
|
comp_main_flows_num = len(comp_eva_overview['main_flow_src_desc'].split('、'))
|
||
|
|
high_stop_turns_num = sum([len(item.split('/')) for item in eva_overview['high_stop_turn_ratio_desc'].split('、')])
|
||
|
|
comp_high_stop_turns_num = sum([len(item.split('/')) for item in comp_eva_overview['high_stop_turn_ratio_desc'].split('、')])
|
||
|
|
overview = {
|
||
|
|
'stop_times': eva_overview['stop_times'],
|
||
|
|
'comp_stop_times': comp_eva_overview['stop_times'],
|
||
|
|
'stop_times_color': calc_index_color(eva_overview['stop_times'], comp_eva_overview['stop_times'], 'stop_times'),
|
||
|
|
'jam_index': eva_overview['jam_index'],
|
||
|
|
'comp_jam_index': comp_eva_overview['jam_index'],
|
||
|
|
'jam_index_color': calc_index_color(eva_overview['jam_index'], comp_eva_overview['jam_index'], 'jam_index'),
|
||
|
|
'high_park_percent': eva_overview['high_park_percent'].replace('%', ''),
|
||
|
|
'comp_high_park_percent': comp_eva_overview['high_park_percent'].replace('%', ''),
|
||
|
|
'high_park_percent_color': calc_index_color(float(eva_overview['high_park_percent'].replace('%', '')), float(comp_eva_overview['high_park_percent'].replace('%', '')), 'high_park_percent'),
|
||
|
|
'imbalance_index': eva_overview['imbalance_index'],
|
||
|
|
'comp_imbalance_index': comp_eva_overview['imbalance_index'],
|
||
|
|
'imbalance_index_color': calc_index_color(eva_overview['imbalance_index'], comp_eva_overview['imbalance_index'], 'imbalance_index'),
|
||
|
|
'speed': eva_overview['speed'],
|
||
|
|
'comp_speed': comp_eva_overview['speed'],
|
||
|
|
'speed_color': calc_index_color(eva_overview['speed'], comp_eva_overview['speed'], 'speed'),
|
||
|
|
'move_speed': eva_overview['move_speed'],
|
||
|
|
'comp_move_speed': comp_eva_overview['move_speed'],
|
||
|
|
'move_speed_color': calc_index_color(eva_overview['move_speed'], comp_eva_overview['move_speed'], 'move_speed'),
|
||
|
|
'delay_time': eva_overview['delay_time'],
|
||
|
|
'comp_delay_time': comp_eva_overview['delay_time'],
|
||
|
|
'delay_time_color': calc_index_color(eva_overview['delay_time'], comp_eva_overview['delay_time'], 'delay_time'),
|
||
|
|
'park_time': eva_overview['park_time'],
|
||
|
|
'comp_park_time': comp_eva_overview['park_time'],
|
||
|
|
'park_time_color': calc_index_color(eva_overview['park_time'], comp_eva_overview['park_time'], 'park_time'),
|
||
|
|
'service_level': eva_overview['service_level'],
|
||
|
|
'comp_service_level': comp_eva_overview['service_level'],
|
||
|
|
'main_flow_nums': main_flows_num,
|
||
|
|
'comp_main_flow_nums': comp_main_flows_num,
|
||
|
|
'high_stop_turns_num': high_stop_turns_num,
|
||
|
|
'comp_high_stop_turns_num': comp_high_stop_turns_num
|
||
|
|
}
|
||
|
|
return overview
|
||
|
|
|
||
|
|
|
||
|
|
def calc_index_color(index, comp_index, key):
|
||
|
|
color = 0
|
||
|
|
if key not in ('speed', 'move_speed'):
|
||
|
|
rate = 0 if (comp_index in (0, '-') or index == '-') else round((index - comp_index) / comp_index * 100, 2)
|
||
|
|
if rate > 20:
|
||
|
|
color = 1
|
||
|
|
elif rate < -20:
|
||
|
|
color = 2
|
||
|
|
else:
|
||
|
|
rate = 0 if (comp_index in (0, '-') or index == '-') else round((index - comp_index) / comp_index * 100, 2)
|
||
|
|
if rate < -20:
|
||
|
|
color = 1
|
||
|
|
elif rate > 20:
|
||
|
|
color = 2
|
||
|
|
return color
|
||
|
|
|
||
|
|
|
||
|
|
def parse_comp_inroad_delay_infos(inroad_delay_infos, comp_inroad_delay_infos):
|
||
|
|
inroad_data_keys = inroad_delay_infos.keys()
|
||
|
|
comp_inroad_data_keys = comp_inroad_delay_infos.keys()
|
||
|
|
all_keys = inroad_data_keys | comp_inroad_data_keys
|
||
|
|
res = {}
|
||
|
|
for key in all_keys:
|
||
|
|
comp_data = {
|
||
|
|
'item': '优化前',
|
||
|
|
'service_level': comp_inroad_delay_infos[key]['service_level'] if key in comp_inroad_data_keys else '-',
|
||
|
|
'stop_times': comp_inroad_delay_infos[key]['stop_times'] if key in comp_inroad_data_keys else '-',
|
||
|
|
'high_park_percent': comp_inroad_delay_infos[key]['high_park_percent'] if key in comp_inroad_data_keys else '-',
|
||
|
|
'imbalance_index': comp_inroad_delay_infos[key]['imbalance_index'] if key in comp_inroad_data_keys else '-',
|
||
|
|
'park_time': comp_inroad_delay_infos[key]['park_time'] if key in comp_inroad_data_keys else '-',
|
||
|
|
'delay_time': comp_inroad_delay_infos[key]['delay_time'] if key in comp_inroad_data_keys else '-',
|
||
|
|
'speed': comp_inroad_delay_infos[key]['speed'] if key in comp_inroad_data_keys else '-',
|
||
|
|
'move_speed': comp_inroad_delay_infos[key]['move_speed'] if key in comp_inroad_data_keys else '-'
|
||
|
|
}
|
||
|
|
item_data = {
|
||
|
|
'item': '优化后',
|
||
|
|
'service_level': inroad_delay_infos[key]['service_level'] if key in inroad_data_keys else '-',
|
||
|
|
'stop_times': inroad_delay_infos[key]['stop_times'] if key in inroad_data_keys else '-',
|
||
|
|
'high_park_percent': inroad_delay_infos[key]['high_park_percent'] if key in inroad_data_keys else '-',
|
||
|
|
'imbalance_index': inroad_delay_infos[key]['imbalance_index'] if key in inroad_data_keys else '-',
|
||
|
|
'park_time': inroad_delay_infos[key]['park_time'] if key in inroad_data_keys else '-',
|
||
|
|
'delay_time': inroad_delay_infos[key]['delay_time'] if key in inroad_data_keys else '-',
|
||
|
|
'speed': inroad_delay_infos[key]['speed'] if key in inroad_data_keys else '-',
|
||
|
|
'move_speed': inroad_delay_infos[key]['move_speed'] if key in inroad_data_keys else '-'
|
||
|
|
}
|
||
|
|
diff_data = {
|
||
|
|
'item': '变化量',
|
||
|
|
'service_level': '-' if item_data['service_level'] == '-' or comp_data['service_level'] == '-' else compare_level(item_data['service_level'], comp_data['service_level']),
|
||
|
|
'stop_times': '-' if item_data['stop_times'] == '-' or comp_data['stop_times'] == '-' else round(item_data['stop_times'] - comp_data['stop_times'], 2),
|
||
|
|
'high_park_percent': '-' if item_data['high_park_percent'] == '-' or comp_data['high_park_percent'] == '-' else round(float(item_data['high_park_percent'].replace('%', '')) - float(comp_data['high_park_percent'].replace('%', '')), 2),
|
||
|
|
'imbalance_index': '-' if item_data['imbalance_index'] == '-' or comp_data['imbalance_index'] == '-' else round(item_data['imbalance_index'] - comp_data['imbalance_index'], 2),
|
||
|
|
'park_time': '-' if item_data['park_time'] == '-' or comp_data['park_time'] == '-' else item_data['park_time'] - comp_data['park_time'],
|
||
|
|
'delay_time': '-' if item_data['delay_time'] == '-' or comp_data['delay_time'] == '-' else item_data['delay_time'] - comp_data['delay_time'],
|
||
|
|
'speed': '-' if item_data['speed'] == '-' or comp_data['speed'] == '-' else round(item_data['speed'] - comp_data['speed'], 2),
|
||
|
|
'move_speed': '-' if item_data['move_speed'] == '-' or comp_data['move_speed'] == '-' else round(item_data['move_speed'] - comp_data['move_speed'], 2),
|
||
|
|
'stop_times_color': '-' if item_data['stop_times'] == '-' or comp_data['stop_times'] == '-' else calc_index_color(item_data['stop_times'], comp_data['stop_times'], 'stop_times'),
|
||
|
|
'high_park_percent_color': '-' if item_data['high_park_percent'] == '-' or comp_data['high_park_percent'] == '-' else calc_index_color(float(item_data['high_park_percent'].replace('%', '')), float(comp_data['high_park_percent'].replace('%', '')), 'high_park_percent'),
|
||
|
|
'imbalance_index_color': '-' if item_data['imbalance_index'] == '-' or comp_data['imbalance_index'] == '-' else calc_index_color(item_data['imbalance_index'], comp_data['imbalance_index'], 'imbalance_index'),
|
||
|
|
'park_time_color': '-' if item_data['park_time'] == '-' or comp_data['park_time'] == '-' else calc_index_color(item_data['park_time'], comp_data['park_time'], 'park_time'),
|
||
|
|
'delay_time_color': '-' if item_data['delay_time'] == '-' or comp_data['delay_time'] == '-' else calc_index_color(item_data['delay_time'], comp_data['delay_time'], 'delay_time'),
|
||
|
|
'speed_color': '-' if item_data['speed'] == '-' or comp_data['speed'] == '-' else calc_index_color(item_data['speed'], comp_data['speed'], 'speed'),
|
||
|
|
'move_speed_color': '-' if item_data['move_speed'] == '-' or comp_data['move_speed'] == '-' else calc_index_color(item_data['move_speed'], comp_data['move_speed'], 'move_speed')
|
||
|
|
}
|
||
|
|
turn_type = inroad_delay_infos[key]['flow_delays'].keys()
|
||
|
|
comp_turn_type = comp_inroad_delay_infos[key]['flow_delays'].keys()
|
||
|
|
all_turn_type = turn_type | comp_turn_type
|
||
|
|
flow_delay_datas = {}
|
||
|
|
for item_turn in all_turn_type:
|
||
|
|
flow_comp_data = {
|
||
|
|
'item': '优化前',
|
||
|
|
'service_level': comp_inroad_delay_infos[key]['flow_delays'][item_turn]['service_level'] if item_turn in comp_turn_type else '-',
|
||
|
|
'stop_times': comp_inroad_delay_infos[key]['flow_delays'][item_turn]['stop_times'] if item_turn in comp_turn_type else '-',
|
||
|
|
'high_park_percent': comp_inroad_delay_infos[key]['flow_delays'][item_turn]['high_park_percent'] if item_turn in comp_turn_type else '-',
|
||
|
|
'park_time': comp_inroad_delay_infos[key]['flow_delays'][item_turn]['park_time'] if item_turn in comp_turn_type else '-',
|
||
|
|
'delay_time': comp_inroad_delay_infos[key]['flow_delays'][item_turn]['delay_time'] if item_turn in comp_turn_type else '-',
|
||
|
|
'speed': comp_inroad_delay_infos[key]['flow_delays'][item_turn]['speed'] if item_turn in comp_turn_type else '-',
|
||
|
|
'move_speed': comp_inroad_delay_infos[key]['flow_delays'][item_turn]['move_speed'] if item_turn in comp_turn_type else '-'
|
||
|
|
}
|
||
|
|
flow_item_data = {
|
||
|
|
'item': '优化后',
|
||
|
|
'service_level': inroad_delay_infos[key]['flow_delays'][item_turn]['service_level'] if item_turn in turn_type else '-',
|
||
|
|
'stop_times': inroad_delay_infos[key]['flow_delays'][item_turn]['stop_times'] if item_turn in turn_type else '-',
|
||
|
|
'high_park_percent': inroad_delay_infos[key]['flow_delays'][item_turn]['high_park_percent'] if item_turn in turn_type else '-',
|
||
|
|
'park_time': inroad_delay_infos[key]['flow_delays'][item_turn]['park_time'] if item_turn in turn_type else '-',
|
||
|
|
'delay_time': inroad_delay_infos[key]['flow_delays'][item_turn]['delay_time'] if item_turn in turn_type else '-',
|
||
|
|
'speed': inroad_delay_infos[key]['flow_delays'][item_turn]['speed'] if item_turn in turn_type else '-',
|
||
|
|
'move_speed': inroad_delay_infos[key]['flow_delays'][item_turn]['move_speed'] if item_turn in turn_type else '-'
|
||
|
|
}
|
||
|
|
flow_diff_data = {
|
||
|
|
'item': '变化量',
|
||
|
|
'service_level': '-' if flow_comp_data['service_level'] == '-' or flow_item_data['service_level'] == '-' else compare_level(flow_comp_data['service_level'], flow_item_data['service_level']),
|
||
|
|
'stop_times': '-' if flow_comp_data['stop_times'] == '-' or flow_item_data['stop_times'] == '-' else round(flow_comp_data['stop_times'] - flow_item_data['stop_times'], 2),
|
||
|
|
'high_park_percent': '-' if flow_comp_data['high_park_percent'] == '-' or flow_item_data['high_park_percent'] == '-' else round(float(flow_comp_data['high_park_percent'].replace('%', '')) - float(flow_item_data['high_park_percent'].replace('%', '')), 2),
|
||
|
|
'park_time': '-' if flow_comp_data['park_time'] == '-' or flow_item_data['park_time'] == '-' else round(flow_comp_data['park_time'] - flow_item_data['park_time'], 2),
|
||
|
|
'delay_time': '-' if flow_comp_data['delay_time'] == '-' or flow_item_data['delay_time'] == '-' else round(flow_comp_data['delay_time'] - flow_item_data['delay_time'], 2),
|
||
|
|
'speed': '-' if flow_comp_data['speed'] == '-' or flow_item_data['speed'] == '-' else round(flow_comp_data['speed'] - flow_item_data['speed'], 2),
|
||
|
|
'move_speed': '-' if flow_comp_data['move_speed'] == '-' or flow_item_data['move_speed'] == '-' else round(flow_comp_data['move_speed'] - flow_item_data['move_speed'], 2),
|
||
|
|
'stop_times_color': '-' if flow_item_data['stop_times'] == '-' or flow_comp_data['stop_times'] == '-' else calc_index_color(flow_item_data['stop_times'], flow_comp_data['stop_times'], 'stop_times'),
|
||
|
|
'high_park_percent_color': '-' if flow_item_data['high_park_percent'] == '-' or flow_comp_data['high_park_percent'] == '-' else calc_index_color(float(flow_item_data['high_park_percent'].replace('%', '')), float(comp_data['high_park_percent'].replace('%', '')), 'high_park_percent'),
|
||
|
|
'park_time_color': '-' if flow_item_data['park_time'] == '-' or flow_comp_data['park_time'] == '-' else calc_index_color(flow_item_data['park_time'], flow_comp_data['park_time'], 'park_time'),
|
||
|
|
'delay_time_color': '-' if flow_item_data['delay_time'] == '-' or flow_comp_data['delay_time'] == '-' else calc_index_color(flow_item_data['delay_time'], flow_comp_data['delay_time'], 'delay_time'),
|
||
|
|
'speed_color': '-' if flow_item_data['speed'] == '-' or flow_comp_data['speed'] == '-' else calc_index_color(flow_item_data['speed'], flow_comp_data['speed'], 'speed'),
|
||
|
|
'move_speed_color': '-' if flow_item_data['move_speed'] == '-' or flow_comp_data['move_speed'] == '-' else calc_index_color(flow_item_data['move_speed'], flow_comp_data['move_speed'], 'move_speed')
|
||
|
|
}
|
||
|
|
flow_delay_datas[item_turn] = {
|
||
|
|
'item_data': flow_item_data,
|
||
|
|
'comp_data': flow_comp_data,
|
||
|
|
'diff_data': flow_diff_data
|
||
|
|
}
|
||
|
|
res[key] = {
|
||
|
|
'src_dir': inroad_delay_infos[key]['src_dir'] if 'src_dir' in inroad_delay_infos[key] else comp_inroad_delay_infos[key]['src_dir'],
|
||
|
|
'dir_data': {
|
||
|
|
'item_data': item_data,
|
||
|
|
'comp_data': comp_data,
|
||
|
|
'diff_data': diff_data,
|
||
|
|
'flow_delay_datas': flow_delay_datas
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return res
|
||
|
|
|
||
|
|
|
||
|
|
def compare_level(new, old):
|
||
|
|
if new == '-' or old == '-':
|
||
|
|
return 0
|
||
|
|
scores = {'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5}
|
||
|
|
new_score, old_score = scores.get(new, 99), scores.get(old, 99)
|
||
|
|
if new_score == old_score:
|
||
|
|
return 0
|
||
|
|
return 2 if new_score < old_score else 1
|
||
|
|
|
||
|
|
|
||
|
|
def find_job_info(key, value_list):
|
||
|
|
result = []
|
||
|
|
# 遍历名字列表
|
||
|
|
for value in value_list:
|
||
|
|
# 检查是否完全匹配
|
||
|
|
if key in value['cross_name']:
|
||
|
|
result.append(value)
|
||
|
|
if key == value['cross_name']:
|
||
|
|
result = [value]
|
||
|
|
break
|
||
|
|
# 检查是否是首字母缩写匹配
|
||
|
|
elif len(key) >= 2 and len(value['cross_name']) >= 2:
|
||
|
|
# 将名字转换为拼音并提取首字母
|
||
|
|
first_pinyin = lazy_pinyin(value['cross_name'][0])[0]
|
||
|
|
second_pinyin = lazy_pinyin(value['cross_name'][1])[0]
|
||
|
|
if key[0].lower() == first_pinyin[0].lower() and key[1].lower() == second_pinyin[0].lower():
|
||
|
|
result.append(value)
|
||
|
|
# # 检查是否包含关键字
|
||
|
|
# elif key in value['wave_name']:
|
||
|
|
# result.append(value)
|
||
|
|
return result
|