123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- """
- @Authors: yangzihao(yangzihao@china-icv.cn)
- @Data: 2023/11/02
- @Last Modified: 2023/11/02
- @Summary: This module provides the function to parse the config json file.
- """
- import pandas as pd
- from common import json2dict
- class ConfigParse(object):
- """
- """
- def __init__(self, json_file):
-
- self.scoreModel = "builtin"
- self.dimension_weight = {}
- self.dimension_list = []
- self.dimension_name = {}
- self.type_weight = {}
- self.type_list = []
- self.type_name = {}
- self.metric_list = []
- self.metric_dict = {}
- self.name_dict = {}
- self.unit_dict = {}
- self.builtinDimensionList = ["comfort", "efficient"]
- self.builtinTypeList = []
- self.builtinMetricList = ["zigzag", "shake", "cadence", "slamBrake", "slamAccelerate",
- "averageSpeed", "stopDuration", "stopCount"]
-
- self.config = {}
-
- self.config_dict = json2dict(json_file)
- self._config_parse(self.config_dict)
- def _config_parse(self, config_dict):
-
- dimensionWeight = config_dict['dimensionWeight']
- self.dimension_weight = dimensionWeight
- self.dimension_name = config_dict['dimensionName']
- self.dimension_list = list(self.dimension_weight.keys())
-
- typeWeight = config_dict['typeWeight']
- self.type_weight = typeWeight
- self.type_name = config_dict["typeName"]
- for dimension in self.dimension_list:
- self.config[dimension] = self._dimension_config_parse(dimension, config_dict, typeWeight, dimensionWeight)
- self.name_dict.update(self.config[dimension]['name'])
- self.unit_dict.update(self.config[dimension]['unit'])
- self.metric_dict[dimension] = self.config[dimension]['typeMetricDict']
- self.metric_list.extend(self.config[dimension]['metric'])
- self.type_list.extend(self.config[dimension]['type'])
- print()
- def _dimension_config_parse(self, dimension, config_dict, typeWeight, dimensionWeight):
-
- typeWeightDimension = typeWeight[dimension]
- typeDimension = list(typeWeightDimension.keys())
- typeWeightDimensionList = list(typeWeightDimension.values())
- flagCustomDimension = not all(x is None for x in typeWeightDimensionList)
-
- typeNameDimension = self.type_name[dimension]
-
- dimension_dict = config_dict[dimension]
- dimension_value_dict = {}
- typeMetricDict = {}
- for type in typeDimension:
- dimension_value_dict.update(dimension_dict[type])
- typeMetricDict[type] = list(dimension_dict[type].keys())
- df_dimension_value = pd.DataFrame(dimension_value_dict).T
-
- metricDimension = df_dimension_value.index.tolist()
-
- nameDimension = df_dimension_value['name'].to_dict()
-
-
- unitDimension = df_dimension_value['unit'].to_dict()
-
-
- weightDimension = df_dimension_value['weight'].astype(float).to_dict()
- weightDimensionList = list(weightDimension.values())
-
- priorityDimension = df_dimension_value['priority'].astype(int).to_dict()
- priorityDimensionList = list(priorityDimension.values())
-
- paramDimension = df_dimension_value['paramList'].to_dict()
- bulitin_first_key = next((key for key in paramDimension if key in self.builtinMetricList), None)
- first_key = next(iter(paramDimension)) if not bulitin_first_key else bulitin_first_key
- paramNum = len(paramDimension[first_key])
- kindDimension = [{} for _ in range(paramNum)]
- optimalDimension = [{} for _ in range(paramNum)]
- multipleDimension = [{} for _ in range(paramNum)]
- spareDimension = [{} for _ in range(paramNum)]
-
-
- customMetricParam = {}
- for key, value_list in paramDimension.items():
- if key in self.builtinMetricList:
- for i in range(len(value_list)):
- kindDimension[i][key] = int(value_list[i]['kind'])
- optimalDimension[i][key] = float(value_list[i]['optimal'])
- multipleDimension[i][key] = [float(x) for x in value_list[i]['multiple']]
- spareDimension[i][key] = [item["param"] for item in value_list[i]["spare"]]
-
-
-
- else:
- customMetricParam[key] = value_list
- kindDimensionList = [value for dict_val in kindDimension for value in dict_val.values()]
- optimalDimensionList = [value for dict_val in optimalDimension for value in dict_val.values()]
- multipleDimensionList = [value for dict_val in multipleDimension for value in dict_val.values()]
- spareDimensionList = [value for dict_val in spareDimension for value in dict_val.values()]
-
-
- if paramNum == 1:
- kindDimension = kindDimension[0]
- optimalDimension = optimalDimension[0]
- multipleDimension = multipleDimension[0]
- spareDimension = spareDimension[0]
-
-
- result = {
- "weightDimension": float(dimensionWeight[dimension]),
- "weightCustom": flagCustomDimension,
- "type": typeDimension,
- "typeWeight": typeWeightDimension,
- "typeWeightList": typeWeightDimensionList,
- "typeName": typeNameDimension,
- "customMetricParam": customMetricParam,
- "metric": metricDimension,
- "typeMetricDict": typeMetricDict,
- "name": nameDimension,
-
- "unit": unitDimension,
-
- "weight": weightDimension,
- "weightList": weightDimensionList,
- "priority": priorityDimension,
- "priorityList": priorityDimensionList,
- "kind": kindDimension,
- "kindList": kindDimensionList,
- "optimal": optimalDimension,
- "optimalList": optimalDimensionList,
- "multiple": multipleDimension,
- "multipleList": multipleDimensionList,
- "spare": spareDimension,
- "spareList": spareDimensionList,
-
-
-
-
- }
- return result
|