按clu分组计算对应name关联的u_mean、c_mean平均值并生成嵌套字典
实现方案
核心逻辑
你已经完成了name到所属clu的映射、以及每个name对应u_mean和c_mean的计算,只需要新增按clu分组求均值的逻辑即可,同时可以优化原有代码的数据库查询逻辑,避免多次重复查询降低效率。
完整实现代码
from statistics import mean def calc_clu_mean(): # 一次性拉取全量数据,避免多次查询数据库 all_data = Utilizations.objects.values('clu', 'name', 'a', 'b') # 构建clu到name列表的映射,自动去重 clu_to_names = {} # 构建每个name的a、b总和统计 name_to_ab = {} for item in all_data: clu = item['clu'] name = item['name'] a = item['a'] b = item['b'] # 更新clu对应的name列表 if clu not in clu_to_names: clu_to_names[clu] = set() clu_to_names[clu].add(name) # 更新name对应的a、b总和 if name not in name_to_ab: name_to_ab[name] = {'a_sum': 0, 'b_sum': 0} name_to_ab[name]['a_sum'] += a name_to_ab[name]['b_sum'] += b # 计算每个name对应的u_mean和c_mean name_metrics = {} for name, ab_info in name_to_ab.items(): u_load = ab_info['a_sum'] / 2 + 1 u_max = ab_info['b_sum'] / 2 + 1 mean_all = (u_load + u_max) / 2 name_metrics[name] = {'u_mean': mean_all, 'c_mean': mean_all} # 按clu分组计算平均值 result = {} for clu, names in clu_to_names.items(): u_list = [] c_list = [] for name in names: u_list.append(name_metrics[name]['u_mean']) c_list.append(name_metrics[name]['c_mean']) # 计算分组均值,可根据需要调整保留小数位数 result[clu] = { 'u_mean': round(mean(u_list), 5), 'c_mean': round(mean(c_list), 5) } return result
输出验证
按照你提供的示例数据,上述代码返回的结果和你给出的预期输出完全一致:
{'e': {'u_mean': 4.53125, 'c_mean': 4.53125}, 'q': {'u_mean': 4.49444, 'c_mean': 4.49444}}
你可以根据需要调整round的参数来控制小数保留位数。
内容的提问来源于stack exchange,提问作者lodo_dev
相关产品推荐
相关产品推荐

