Более быстрые алгоритмы агрегирования данных для вложенных объектов

#python

#python

Вопрос:

У меня возникли некоторые проблемы с изучением новых методов выравнивания / агрегирования данных вложенных объектов в Python. Моя текущая реализация довольно медленная, и я хочу знать некоторые подходы к ускорению обработки. Учтите, что у меня есть набор данных пожертвований, определенный как:

 donations = [
  {
    "amount": 100,
    "organization": {
      "name": "Org 1",
      "total_budget": 8000,
      "states": [
        {
          "name": "Maine",
          "code": "ME"
        },
        {
          "name": "Massachusetts",
          "code": "MA"
        }
      ]
    }
  },
  {
    "amount": 5000,
    "organization": {
      "name": "Org 2",
      "total_budget": 10000,
      "states": [
        {
          "name": "Massachusetts",
          "code": "MA"
        }
      ]
    }
  },
  {
    "amount": 5000,
    "organization": {
      "name": "Org 1",
      "total_budget": 8000,
      "states": [
        {
          "name": "Maine",
          "code": "ME"
        },
        {
          "name": "Massachusetts",
          "code": "MA"
        }
      ]
    }
  }
]
  

Взаимосвязь этих объектов такова, что пожертвование относится к одной организации, а организация может быть связана с одним или несколькими состояниями.

Я дополнительно могу получить только набор данных организации как:

 organizations = [
  {
    "name": "Org 1",
    "total_budget": 8000,
    "states": [
      {
        "name": "Maine",
        "code": "ME"
      },
      {
        "name": "Massachusetts",
        "code": "MA"
      }
    ]
  },
  {
    "name": "Org 2",
    "total_budget": 10000,
    "states": [
      {
        "name": "Massachusetts",
        "code": "MA"
      }
    ]
  }
]
  

Результат, которого я хочу достичь, — это агрегирование по состоянию общих пожертвований и общего бюджета, где суммы пожертвований и общий бюджет организации равномерно распределены между всеми состояниями, с которыми он связан. Пример для приведенного выше набора данных:

 results = {
  "ME": {
    "name": "Maine",
    "total_donations": 2550
    "total_budget": 4000
  },
  "MA": {
    "name": "Massachusetts",
    "total_donations": 7550
    "total_budget": 14000
  }
}
  

До сих пор я пытался использовать циклы for для перебора каждого пожертвования и организации и сортировки их по defaultdict:

 from collections import defaultdict

def get_stats():
  return { "total_donations": 0, "total_budget": 0, "name": "" }

results = defaultdict(get_stats)

for donation in donations:
  for state in donation["organization"]["states"]
    results[state["code"]]["total_donations"]  = donation["amount"]/len(donation["organization"]["states"])

for organization in organizations:
  for state in organization["states"]:
    results[state["code"]]["total_budget"]  = organization["total_budget"]/len(organization["states"])
    results[state["code"]]["name"] = state["state"]
  

Я думал об использовании map / reduce здесь, но я не понял, что это улучшит производительность. Любой совет здесь был бы очень признателен.

Комментарии:

1. если набор данных большой, а производительность вызывает у вас большую озабоченность, вероятно, вам следует рассмотреть возможность использования Pandas .

2. Я просматривал множество примеров pandas , но я не мог понять, как сопоставить эти наборы данных там. Есть какие-либо рекомендации по примерной реализации?

3. Насколько медленным является текущий код? Любое очевидное узкое место?

4. Первый цикл for (пожертвования) занимает ~ 20 секунд, второй (организации) — ~ 5 секунд

5. @JasperSardonicus Для скольких объектов в списке? Как эти тайминги масштабируются для большего количества объектов?