【问题标题】:Looping json data dynamically in Python在 Python 中动态循环 json 数据
【发布时间】:2018-08-29 08:36:21
【问题描述】:

我在服务器中有两个 json 文件。第一个 json 文件是一个 json 格式的数据框,它有 21 列。

第二个 json 对象是要应用于第一个 json(数据文件)的不同过滤器的集合,我想在应用每个过滤器后动态计算数量列的减少。

两个 json 都在服务器中。示例如下,

[{
        "criteria_no.": 1,
        "expression": "!=",
        "attributes": "Industry_name",
        "value": "Clasentrix"

    },{ 
        "criteria_no.": 2,
        "expression": "=",
        "attributes": "currency",
        "value": ["EUR","GBP","INR"]


    },{
        "criteria_no.": 3,
        "expression": ">",
        "attributes": "Industry_Rating",
        "value": "A3"

    },{
        "criteria_no.": 4,
        "expression": "<",
        "attributes": "Due_date",
        "value": "01/01/2025"

    }
    ]

用python编码时,如下所示,

import urllib2, json
url = urllib2.urlopen('http://.../server/criteria_sample.json')
obj = json.load(url)
print obj

[{u'attributes': u'Industry_name', u'expression': u'!=', u'value': u'Clasentrix', u'criteria_no.': 1}, {u'attributes': u'currency', u'expression': u'=', u'value': [u'EUR', u'GBP', u'INR'], u'criteria_no.': 2}, {u'attributes': u'Industry_Rating', u'expression': u'>', u'value': u'A3', u'criteria_no.': 3}, {u'attributes': u'Due_date', u'expression': u'<', u'value': u'01/01/2025', u'criteria_no.': 4}]

现在,在示例 json 中,我们可以看到 "attributes",它们只是第一个数据文件中存在的列。我提到它有 21 列,"Industry_name","currency","Industry_Rating","Due_date" 是其中的四列。 "Loan_amount" 是数据文件中的另一列以及所有列。

现在,由于此标准列表只是一个示例,我们有 n 个此类标准或过滤器。我希望将此过滤器动态应用于数据文件并且我想计算贷款金额的减少。让我们考虑第一个过滤器,它说"Industry_name" 列不应该有"Clasentrix"。所以我想从数据文件中过滤"Industry_name",它不会有'Clasentrix' 条目。现在让我们假设在数据文件的 61 个观察结果中,我们有 11 个观察结果'Clasentrix'。然后我们将获取全部贷款金额的总和(61 行),然后从总贷款金额中减去包含'Clasentrix' 的 11 行的贷款金额总和。在应用第一个过滤器后,此数字将被视为减少。

现在对于每个 n 标准,我想在 python 中动态计算减少量。因此,在循环内,过滤器 json 文件将创建考虑属性、表达式和值的过滤器。就像第一个过滤器一样,它是"Industry_name != 'Clasentrix'"。这应该反映在 json 对象的每组行中,例如第二个标准(过滤器)应该是 "currency=['EUR','GBP','INR']" 等等。我也想相应地计算减少量。

我正在努力为上述练习创建 python 代码。我的帖子太长了,请见谅。但是请提供帮助,我如何动态计算每个 n 标准的减少量。

提前致谢!!

更新第一个数据文件,找到一些样本行;

[{
        "industry_id.": 1234,
        "loan_id": 1113456,
        "Industry_name": "Clasentrix",
        "currency": "EUR",
        "Industry_Rating": "Ba3",
        "Due_date": "20/02/2020",
        "loan_amount": 563332790,
        "currency_rate": 0.67,
        "country": "USA"


    },{ 
        "industry_id.": 6543,
        "loan_id": 1125678,
        "Industry_name": "Wolver",
        "currency": "GBP",
        "Industry_Rating": "Aa3",
        "Due_date": "23/05/2020",
        "loan_amount": 33459087,
        "currency_rate": 0.8,
        "country": "UK"


    },{
        "industry_id.": 1469,
        "loan_id": "8876548",
        "Industry_name": "GroupOn",
        "currency": "EUR",
        "Industry_Rating": "Aa1",
        "Due_date": "16/09/2021",
        "loan_amount": 66543278,
        "currency_rate": 0.67,
        "country": "UK"
    },{
        "industry_id.": 1657,
        "loan_id": "6654321",
        "Industry_name": "Clasentrix",
        "currency": "EUR",
        "Industry_Rating": "Ba3",
        "Due_date": "15/07/2020",
        "loan_amount": 5439908765,
        "currency_rate": 0.53,
        "country": "USA"

    }
    ] 

【问题讨论】:

  • 你能不能也展示一个数据流的样本?
  • 你试过什么?你能把所有的json数据加载到内存中,还是数据文件很大? pandas 可能有用。
  • @DanielRoseman,我也用数据文件的样本更新了我的问题
  • @Stuart,json 文件已加载到服务器中。我能够加载它们

标签: python json loops


【解决方案1】:

您可以使用 Pandas 将 json 数据转换为数据框,并将条件转换为 query 字符串。需要进行一些处理才能将标准 json 转换为有效查询。在下面的代码中,日期仍被视为字符串 - 您可能需要先显式设置日期查询才能将字符串转换为日期。

import pandas as pd
import json
# ...
criteria = json.load(url)
df = pd.DataFrame(json.load(data_url)) # data_url is the handle of the data file
print("Loan total without filters is {}".format(df["loan_amount"].sum()))

for c in criteria:
    if c["expression"] == "=":
        c["expression"] = "=="

    # If the value is a string we need to surround it in quotation marks
    # Note this can break if any values contain "
    if isinstance(c["value"], basestring):
        query = '{attributes} {expression} "{value}"'.format(**c)
    else:
        query = '{attributes} {expression} {value}'.format(**c)
    loan_total = df.query(query)["loan_amount"].sum()
    print "With criterion {}, {}, loan total is {}".format(c["criteria_no."], query, loan_total)

或者,您可以将每个标准转换为索引向量,如下所示:

def criterion_filter(s, expression, value):
    if type(value) is list:
        if expression == "=":
            return s.isin(value)
        elif expression == "!=":
            return ~s.isin(value)
    else:
        if expression == "=":
            return s == value
        elif expression == "!=":
            return s != value
        elif expression == "<":
            return s < value
        elif expression == ">":
            return s > value        

for c in criteria:
    filt = criterion_filter(df[c["attributes"]], c["expression"], c["value"])
    loan_total = df[filt]["loan_amount"].sum()
    print "With criterion {}, loan total is {}".format(c["criteria_no."],  loan_total)

编辑:要计算贷款总额的累积减少,您可以使用 & 运算符组合索引向量。

loans = [df["loan_amount"].sum()]
print("Loan total without filters is {}".format(loans[0]))
filt = True
for c in criteria:
    filt &= criterion_filter(df[c["attributes"]], c["expression"], c["value"])
    loans.append(df[filt]["loan_amount"].sum())
    print "Adding criterion {} reduces the total by {}".format(c["criteria_no."],
        loans[-2] - loans[-1])
    print "The cumulative reduction is {}".format(loans[0] - loans[-1])

【讨论】:

  • 很好的答案斯图尔特。帮了我很多。只是几件事; 1. for c in criteria: locator = criteria_filter(df[c["attributes"]], c["expression"], c["value"]) loan_total = df[locator]["loan_amount"].sum() print "使用标准 {},贷款总额为 {}".format(c["criteria_no."], loan_total) 在应用标准后给了我减少的贷款金额。但希望减少的数字只被反映。我的意思是如果总贷款金额为 100,并且在应用标准 1 后修改后的贷款金额为 90,则减少量为 100-90=10。我想计算这个“10”。
  • & 2、如果我也想计算累计减少量,怎么做?我的意思是在同时应用两个标准后,总减少量是多少?那也应该是动态的,我的意思是代码应该在一起应用n标准后计算,累积减少是多少,无论n的值是多少。如何将该累积部分也包含在该代码中?请帮忙。谢谢。
  • 我已经算出了第一个的计算方法。请帮我计算累计减少量。我的意思是当 n 个标准中的 m 个(n>m)一起应用时,代码将如何计算减少量?
  • 查看关于应用累积标准和计算贷款价值的逐步减少和总减少的编辑
猜你喜欢
  • 1970-01-01
  • 2015-07-25
  • 2016-04-15
  • 2017-02-16
  • 2020-04-14
  • 1970-01-01
  • 2014-10-18
  • 2016-12-06
  • 1970-01-01
相关资源
最近更新 更多