gpt4 book ai didi

python - 在Python中动态循环json数据

转载 作者:行者123 更新时间:2023-12-01 09:05:44 28 4
gpt4 key购买 nike

我在服务器中有两个 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'条目。现在,假设对于 11 个观测值,我们从数据文件的 61 个观测值中获得了'Clasentrix'。然后我们将计算整个贷款金额(61 行)的总和,然后从总贷款金额中减去由 'Clasentrix' 组成的 11 行的贷款金额总和。该数字将被视为应用第一个过滤器后的减少。

现在,对于 n 个标准中的每一个,我想在 python 中动态计算减少量。因此,在循环内,过滤器 json 文件将考虑属性、表达式和值创建过滤器。就像第一个过滤器一样,它是“Industry_name != 'Clasentrix'”。这应该反射(reflect)在 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"

}
]

最佳答案

可以使用Pandas将json数据转为dataframe,并将条件转为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])

关于python - 在Python中动态循环json数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52073018/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com