Зацикливание данных JSON динамически в Python

1

У меня есть два json файла на сервере. Первый json файл является фреймворком данных в json-формате, где он имеет 21 столбец.

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

Оба jsons находятся на сервере. Пример этого, как показано ниже,

[{
        "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 наблюдений мы получили 'Clasentrix' из 61 наблюдения из файла данных. Затем мы возьмем сумму всей суммы кредита (61 строка) и затем вычтем сумму суммы кредита на 11 строк, которые состоят из 'Clasentrix' из общей суммы кредита. Этот номер будет считаться сокращением после применения первого фильтра.

Теперь для каждого из n критерия я хочу динамически вычислять редукцию в python. Таким образом, внутри цикла фильтр json файл будет создавать фильтр с учетом атрибута, выражения и значения. Как и для первого фильтра, это "Industry_name != 'Clasentrix'". Это должно отразиться для каждого набора строк для объекта json, как для второго критерия (фильтра), он должен быть "currency=['EUR','GBP','INR']" и так далее. Я также хочу рассчитать сокращение соответственно.

Я изо всех сил пытаюсь создать код python для вышеупомянутого упражнения. Мой пост слишком длинный, извинился за это. Но, пожалуйста, сообщите, как можно динамически вычислять уменьшение для каждого n критерия.

Заранее спасибо!!

UPDATE для первого файла данных, найдите несколько строк примеров;

[{
        "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"

    }
    ] 
  • 0
    Можете ли вы показать образец данных файла?
  • 0
    Что вы пробовали? Можете ли вы загрузить все данные JSON в память или файл данных очень большой? pandas могут быть полезны
Показать ещё 2 комментария
Теги:
loops

1 ответ

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)

EDIT: для вычисления совокупного сокращения суммы кредита вы можете комбинировать векторы индексирования с помощью оператора &.

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])
  • 0
    Отличный ответ Стюарт. Мне очень помогло. Просто пара вещей; 1. для c в критериях: locator = criterion_filter (df [c ["attribute"]], c ["expression"], c ["value"]) loan_total = df [locator] ["loan_amount"]. Sum () print "С критерием {} общая сумма кредита равна {}". Формат (c ["crit_no."] loan_total) дает мне уменьшенную сумму кредита после применения критерия. Но хочу, чтобы цифры о сокращениях только отражались. Я имею в виду, что если итоговое значение loan_amount было равно 100, а после применения критерия1 пересмотренное значение loan_amount равно 90, то сокращение равно 100-90 = 10. Я хочу, чтобы эта '10' была рассчитана.
  • 0
    & 2, если я также хочу рассчитать совокупное сокращение, как это можно сделать? Я имею в виду после применения двух критериев, каков общий показатель сокращения? Это также должно быть динамическим, я имею в виду, что код должен вычислять после совместного применения n критерия, что такое кумулятивное уменьшение, каким бы ни было значение n. Как включить эту накопительную часть также в этот код? Пожалуйста помоги. Спасибо.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню