2015-12-16 5 views
1

Я рассмотрел решение проблемы, и я не могу найти что-либо, что работает так, как я пытаюсь достичь.функция для агрегирования набора данных и вывода вложенного словаря

Я хочу создать функцию Python, которая имеет три аргумента

  1. data_object - это список словарей, где каждый словарь имеет то же поле, - где-то от 1-п количества «измерения» полей в группу от и от 1-го количества полей метрик, подлежащих агрегированию.
  2. размеры - список размеров полей в группе
  3. метрик - список метрических полей агрегировать

так, как я решить эту проблему ранее заключается в использовании 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, но (если я их не понял), все они либо требуют, чтобы вы знали, сколько полей измерения и метрики вы хотите работать, или они не выводят объект словаря, который мне нужен.

+0

просто из интереса @thefourtheye, почему вы изменить это? Я специально пытаюсь сделать функцию, которая будет использоваться в Python, так ли это неразумно ставить это в заголовок вопроса? –

+1

Фактический язык или технологии предпочтительнее в тегах, а не в названиях. Вот почему я отредактировал это. – thefourtheye

ответ

1

Это было намного проще, чем я думал :)

Моя главная проблема была, если у вас есть п размеры - как вы ссылаетесь на правильный уровень словаря, когда вы пробегаете по размерам для каждой строки.

Я решил эту проблему, создав переменный указатель и указывая его на новоиспеченный уровень словаря каждый раз я создал новый уровень

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