config_parser.py 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. ##################################################################
  4. #
  5. # Copyright (c) 2023 CICV, Inc. All Rights Reserved
  6. #
  7. ##################################################################
  8. """
  9. @Authors: yangzihao(yangzihao@china-icv.cn)
  10. @Data: 2023/11/02
  11. @Last Modified: 2023/11/02
  12. @Summary: This module provides the function to parse the config json file.
  13. """
  14. import pandas as pd
  15. from common import json2dict
  16. class ConfigParse(object):
  17. """
  18. """
  19. def __init__(self, json_file):
  20. # weight info
  21. self.scoreModel = "builtin"
  22. self.dimension_weight = {}
  23. self.dimension_list = []
  24. self.dimension_name = {}
  25. self.type_weight = {}
  26. self.type_list = []
  27. self.type_name = {}
  28. self.metric_list = []
  29. self.metric_dict = {}
  30. self.name_dict = {}
  31. self.unit_dict = {}
  32. self.builtinDimensionList = ["comfort", "efficient"]
  33. self.builtinTypeList = []
  34. self.builtinMetricList = ["zigzag", "shake", "cadence", "slamBrake", "slamAccelerate",
  35. "averageSpeed", "stopDuration", "stopCount"]
  36. # score info
  37. self.config = {}
  38. # initialization
  39. self.config_dict = json2dict(json_file)
  40. self._config_parse(self.config_dict)
  41. def _config_parse(self, config_dict):
  42. # dimension info
  43. dimensionWeight = config_dict['dimensionWeight']
  44. self.dimension_weight = dimensionWeight
  45. self.dimension_name = config_dict['dimensionName']
  46. self.dimension_list = list(self.dimension_weight.keys())
  47. # type info
  48. typeWeight = config_dict['typeWeight']
  49. self.type_weight = typeWeight
  50. self.type_name = config_dict["typeName"]
  51. for dimension in self.dimension_list:
  52. self.config[dimension] = self._dimension_config_parse(dimension, config_dict, typeWeight, dimensionWeight)
  53. self.name_dict.update(self.config[dimension]['name'])
  54. self.unit_dict.update(self.config[dimension]['unit'])
  55. self.metric_dict[dimension] = self.config[dimension]['typeMetricDict']
  56. self.metric_list.extend(self.config[dimension]['metric'])
  57. self.type_list.extend(self.config[dimension]['type'])
  58. print()
  59. def _dimension_config_parse(self, dimension, config_dict, typeWeight, dimensionWeight):
  60. # get weight type
  61. typeWeightDimension = typeWeight[dimension]
  62. typeDimension = list(typeWeightDimension.keys()) # get type list
  63. typeWeightDimensionList = list(typeWeightDimension.values())
  64. flagCustomDimension = not all(x is None for x in typeWeightDimensionList)
  65. # get type name
  66. typeNameDimension = self.type_name[dimension]
  67. # Dimension
  68. dimension_dict = config_dict[dimension]
  69. dimension_value_dict = {}
  70. typeMetricDict = {}
  71. for type in typeDimension:
  72. dimension_value_dict.update(dimension_dict[type])
  73. typeMetricDict[type] = list(dimension_dict[type].keys())
  74. df_dimension_value = pd.DataFrame(dimension_value_dict).T
  75. # get metric list
  76. metricDimension = df_dimension_value.index.tolist()
  77. # get name list
  78. nameDimension = df_dimension_value['name'].to_dict()
  79. # nameDimensionList = list(nameDimension.values())
  80. # get unit list
  81. unitDimension = df_dimension_value['unit'].to_dict()
  82. # unitDimensionList = list(unitDimension.values())
  83. # get weight list
  84. weightDimension = df_dimension_value['weight'].astype(float).to_dict()
  85. weightDimensionList = list(weightDimension.values())
  86. # get priority list
  87. priorityDimension = df_dimension_value['priority'].astype(int).to_dict()
  88. priorityDimensionList = list(priorityDimension.values())
  89. # get paramList
  90. paramDimension = df_dimension_value['paramList'].to_dict()
  91. bulitin_first_key = next((key for key in paramDimension if key in self.builtinMetricList), None)
  92. first_key = next(iter(paramDimension)) if not bulitin_first_key else bulitin_first_key
  93. paramNum = len(paramDimension[first_key])
  94. kindDimension = [{} for _ in range(paramNum)]
  95. optimalDimension = [{} for _ in range(paramNum)]
  96. multipleDimension = [{} for _ in range(paramNum)]
  97. spareDimension = [{} for _ in range(paramNum)]
  98. # spare1Dimension = [{} for _ in range(paramNum)]
  99. # spare2Dimension = [{} for _ in range(paramNum)]
  100. customMetricParam = {} # custiom metric paramList
  101. for key, value_list in paramDimension.items():
  102. if key in self.builtinMetricList:
  103. for i in range(len(value_list)):
  104. kindDimension[i][key] = int(value_list[i]['kind'])
  105. optimalDimension[i][key] = float(value_list[i]['optimal'])
  106. multipleDimension[i][key] = [float(x) for x in value_list[i]['multiple']]
  107. spareDimension[i][key] = [item["param"] for item in value_list[i]["spare"]]
  108. # spareDimension[i][key] = [float(item["param"]) for item in value_list[i]["spare"]]
  109. # spare1Dimension[i][key] = (value_list[i]['spare1'])
  110. # spare2Dimension[i][key] = (value_list[i]['spare2'])
  111. else:
  112. customMetricParam[key] = value_list
  113. kindDimensionList = [value for dict_val in kindDimension for value in dict_val.values()]
  114. optimalDimensionList = [value for dict_val in optimalDimension for value in dict_val.values()]
  115. multipleDimensionList = [value for dict_val in multipleDimension for value in dict_val.values()]
  116. spareDimensionList = [value for dict_val in spareDimension for value in dict_val.values()]
  117. # spare1DimensionList = [value for dict_val in spare1Dimension for value in dict_val.values()]
  118. # spare2DimensionList = [value for dict_val in spare2Dimension for value in dict_val.values()]
  119. if paramNum == 1:
  120. kindDimension = kindDimension[0]
  121. optimalDimension = optimalDimension[0]
  122. multipleDimension = multipleDimension[0]
  123. spareDimension = spareDimension[0]
  124. # spare1Dimension = spare1Dimension[0]
  125. # spare2Dimension = spare2Dimension[0]
  126. result = {
  127. "weightDimension": float(dimensionWeight[dimension]),
  128. "weightCustom": flagCustomDimension,
  129. "type": typeDimension,
  130. "typeWeight": typeWeightDimension,
  131. "typeWeightList": typeWeightDimensionList,
  132. "typeName": typeNameDimension,
  133. "customMetricParam": customMetricParam,
  134. "metric": metricDimension,
  135. "typeMetricDict": typeMetricDict,
  136. "name": nameDimension,
  137. # "nameList": nameDimensionList,
  138. "unit": unitDimension,
  139. # "unitList": unitDimensionList,
  140. "weight": weightDimension,
  141. "weightList": weightDimensionList,
  142. "priority": priorityDimension,
  143. "priorityList": priorityDimensionList,
  144. "kind": kindDimension,
  145. "kindList": kindDimensionList,
  146. "optimal": optimalDimension,
  147. "optimalList": optimalDimensionList,
  148. "multiple": multipleDimension,
  149. "multipleList": multipleDimensionList,
  150. "spare": spareDimension,
  151. "spareList": spareDimensionList,
  152. # "spare1": spare1Dimension,
  153. # "spare1List": spare1DimensionList,
  154. # "spare2": spare2Dimension,
  155. # "spare2List": spare2DimensionList
  156. }
  157. return result