Pandas - 规范化 JSON 按名称搜索文件

Pandas - Normalizing JSON File searching by name

美好的一天!

你能帮帮我吗?

使用下面的代码,我得到了这个输出:

import requests
import pandas as pd
import numpy as np
from pandas.io.json import json_normalize

url = 'https://openbanking.api.santander.com.br/open-banking/products-services/v1/personal-financings'
santander = requests.get(url).json()['data']['brand']['companies'][2]['personalFinancings'][4]['interestRates'][0]['applications']#['FINANCIAMENTO_MICROCREDITO']

microcredito = santander
dataframe = json_normalize(microcredito)
dataframe.head()

输出:

我需要得到完全相同的输出,但不是使用下面的数字 4,我需要找到属于 4 的类型的名称,即 "FINANCIAMENTO_MICROCREDITO。我试图直接使用名称、类型和所有内容,但总是出错。请看下面的图片和代码:

santander = requests.get(url).json()['data']['brand']['companies'][2]['personalFinancings']**[4]**['interestRates'][0]['applications']

我需要通过名称查找,因为名称是一个模式,但数字 4 不是,并且代码将是动态的,具有相似的数据。

你能帮帮我吗?

谢谢!

可以使用jmespath来遍历数据;在 personalFinancings 子数据中,您传递过滤器 [?type=='FINANCIAMENTO_MICROCREDITO'] 以获取 space.

中的所有数据

总结jmespath:访问一个键,使用.;要访问列表,请使用 []文档也很详细。

import jmespath
import requests
import pandas as pd

 url = 'https://openbanking.api.santander.com.br/open-banking/products-services/v1/personal-financings'

santander = requests.get(url).json()

base_expression = """data
                     .brand
                     .companies[2]
                     .personalFinancings[?type=='FINANCIAMENTO_MICROCREDITO']
                     .interestRates[]
                     .applications[]"""

expression = f"""{{ interval: {base_expression}.interval, 
                    index_rate: {base_expression}.indexer.rate, 
                    customer_rate: {base_expression}.customers.rate}}"""

expression = jmespath.compile(expression)

pd.DataFrame(expression.search(santander))


  interval indexer_rate customer_rate
0  1_FAIXA       0.0279        0.1080
1  4_FAIXA       0.0399        0.0739
2  2_FAIXA       0.0000        0.0000
3  3_FAIXA       0.0359        0.8181

您也可以只使用普通词典(jmespath 为嵌套 json 数据提供便利)::

from collections import defaultdict
data = defaultdict(list)

for entry in santander['data']['brand']['companies'][2]['personalFinancings']:
    for key, value in entry.items():
         if key == "type" and value == "FINANCIAMENTO_MICROCREDITO":
             for ent in entry['interestRates']:
                 data['interval'].extend([val['interval'] 
                                          for val in (ent['applications'])])
                 data['indexer_rate'].extend([val['indexer']['rate'] 
                                             for val in (ent['applications'])])
                 data['customer_rate'].extend([val['customers']['rate'] 
                                               for val in (ent['applications'])])


pd.DataFrame(data)
  interval indexer_rate customer_rate
0  1_FAIXA       0.0279        0.1080
1  4_FAIXA       0.0399        0.0739
2  2_FAIXA       0.0000        0.0000
3  3_FAIXA       0.0359        0.8181