聚合一组数据并输出嵌套字典的函数

function to aggregate a set of data and output nested dictionary

我找遍了这个问题的解决方案,但找不到任何符合我想要实现的方式的方法。

我想创建一个 Python 具有三个参数的函数

  1. data_object - 这是一个字典列表,其中每个字典都有相同的字段 - 从 1-n 数量的 'dimension' 字段到分组依据,以及从 1-n 数量的任何地方要聚合的指标字段。
  2. 维度 - 分组依据的维度字段列表
  3. metrics - 要聚合的指标字段列表

我之前解决这个问题的方法是使用setdefault:

struc = {}
for row in rows:
    year = row['year']
    month = row['month']
    affiliate = row['affiliate']
    website = row['website']
    pgroup = row['product_group']
    sales = row['sales']
    cost = row['cost']
    struc.setdefault(year, {})
    struc[year].setdefault(month, {})
    struc[year][month].setdefault(affiliate, {})
    struc[year][month][affiliate].setdefault(website, {})
    struc[year][month][affiliate][website].setdefault(pgroup, {'sales':0, 'cost':0})
    struc[year][month][affiliate][website][pgroup]['sales'] += sales
    struc[year][month][affiliate][website][pgroup]['cost'] += cost

问题是如果我查看不同的数据集,字段名、维度字段的数量和指标字段的数量都会不同

我看过有关递归函数和 defaultdict 的帖子,但是(除非我误解了它们)它们都要求您知道要使用多少维度和度量字段,或者它们不输出字典对象,即我需要什么。

比我想象的简单多了:)

我的主要问题是,如果您有 n 个维度 - 当您遍历每一行的维度时,如何引用字典的正确级别。

我通过创建一个指针变量并在每次创建新级别时将其指向字典的新级别来解决这个问题

def jsonify(data, dimensions, metrics, struc = {}):
    for row in data:
        pointer = struc
        for dimension in dimensions:
            pointer.setdefault(row[dimension], {})
            pointer = pointer[row[dimension]]
        for metric in metrics:
            pointer.setdefault(metric, 0)
            pointer[metric] += row[metric]
    return struc