#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 Для скольких объектов в списке? Как эти тайминги масштабируются для большего количества объектов?