Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 嵌套对象的更快数据聚合算法_Python - Fatal编程技术网

Python 嵌套对象的更快数据聚合算法

Python 嵌套对象的更快数据聚合算法,python,Python,我在学习python中扁平化/聚合嵌套对象数据的新方法时遇到了一些困难。我目前的实现相当缓慢,我想知道一些加速处理的方法。考虑到我有一个捐赠数据集定义为: donations = [ { "amount": 100, "organization": { "name": "Org 1", "total_budget": 8000, "

我在学习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,但我没有感觉到它们会提高性能。这里的任何建议都会被超级赏识。

如果数据集很大,性能是你最大的关注点,那么你可能应该考虑使用<代码>熊猫> /COD>。我正在看很多代码< <代码>熊猫> <代码>,但是我不知道如何在那里匹配这些数据集。对示例实现有什么建议吗?当前代码有多慢?任何明显的瓶颈?第一个循环(捐赠)需要约20秒,第二个(组织)需要约5秒seconds@JasperSardonicus列表中有多少个对象?对于更多的对象,这些计时是如何缩放的?