首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在python中加载Plaid banking对熊猫数据的响应?

如何在python中加载Plaid banking对熊猫数据的响应?
EN

Stack Overflow用户
提问于 2021-10-18 20:06:44
回答 1查看 517关注 0票数 2

我正在使用Plaid的API返回银行账户上的余额。它们的文档表明,所有响应都以标准的JSON格式出现。我有从请求模块加载JSON响应的经验,但我无法直接将Plaid的响应加载到一个熊猫dataframe。下面是我尝试的结果:

代码语言:javascript
复制
request = AccountsBalanceGetRequest(access_token=token)
response = client.accounts_balance_get(request)
df = pd.json_normalize(response, record_path=['accounts'])

ERROR:
File "C:\Users\<me>\AppData\Local\Programs\Python\Python39\lib\site-packages\pandas\io\json\_normalize.py", line 423, in _json_normalize
    raise NotImplementedError

作为参考,print(response'accounts')正确地访问响应的相关部分。下面是错误中的_normalize部分,但我不知道如何应用它来解决问题:

代码语言:javascript
复制
    if isinstance(data, list) and not data:
        return DataFrame()
    elif isinstance(data, dict):
        # A bit of a hackjob
        data = [data]
    elif isinstance(data, abc.Iterable) and not isinstance(data, str):
        # GH35923 Fix pd.json_normalize to not skip the first element of a
        # generator input
        data = list(data)
    else:
        raise NotImplementedError

如果我打印响应,则如下所示:

代码语言:javascript
复制
{'accounts': [{'account_id': 'account_1',
               'balances': {'available': 300.0,
                            'current': 300.0,
                            'iso_currency_code': 'USD',
                            'limit': None,
                            'unofficial_currency_code': None},
               'mask': 'xxx1',
               'name': 'SAVINGS',
               'official_name': 'Bank Savings',
               'subtype': 'savings',
               'type': 'depository'},
              {'account_id': 'account_2',
               'balances': {'available': 500.00,
                            'current': 600.0,
                            'iso_currency_code': 'USD',
                            'limit': None,
                            'unofficial_currency_code': None},
               'mask': 'xxx2',
               'name': 'CHECKING',
               'official_name': 'Bank Checking',
               'subtype': 'checking',
               'type': 'depository'},
              {'account_id': 'account_3',
               'balances': {'available': 2000.00,
                            'current': 2000.00,
                            'iso_currency_code': 'USD',
                            'limit': None,
                            'unofficial_currency_code': None},
               'mask': 'xxx3',
               'name': 'BUSINESS CHECKING',
               'official_name': 'Bank Business Checking',
               'subtype': 'checking',
               'type': 'depository'}],
 'item': {'available_products': ['balance'],
          'billed_products': ['auth', 'transactions'],
          'consent_expiration_time': None,
          'error': None,
          'institution_id': 'ins_123xyz',
          'item_id': 'item_123xyz',
          'update_type': 'background',
          'webhook': ''},
 'request_id': 'request_123xyz'}

如果Plaid的响应是标准的JSON,那么单引号的存在只是因为Python的打印将它们从双引号转换而来。如果我以这个字符串作为基,用双引号替换单引号,用" None“替换None,我可以加载到dataframe:

代码语言:javascript
复制
data = json.loads(responseString.replace("'", '"').replace('None', '"None"'))
df = pd.json_normalize(data, record_path=['accounts'])
print(df)

将此直接应用于Plaid的响应也是有效的:

代码语言:javascript
复制
data = str(response)
data = data.replace("'", '"').replace('None', '"None"')
data = json.loads(data)
df = pd.json_normalize(data, record_path=['accounts'])

我所拥有的似乎是一个暂时的解决办法,但不是一个强有力的或有意的解决方案。有更好的方法去吗?

UPDATE 1:本文中的第一个代码块的预期输出将产生下面的数据,而不是错误:

代码语言:javascript
复制
 account_id  mask               name           official_name   subtype  ... balances.available  balances.current  balances.iso_currency_code balances.limit balances.unofficial_currency_code
0  account_1  xxx1            SAVINGS            Bank Savings   savings  ...              300.0             300.0                         USD           None                              None
1  account_2  xxx2           CHECKING           Bank Checking  checking  ...              500.0             600.0                         USD           None                              None
2  account_3  xxx3  BUSINESS CHECKING  Bank Business Checking  checking  ...             2000.0            2000.0                         USD           None                              None

我可以用这个方法得到同样的输出,但是不明白为什么它是必要的,而且它似乎不是通过用双引号替换单引号来获得结果的很好的方法。

更新2:我在10/15/2021上安装了格子组件,使用非对接指令和npm。

代码语言:javascript
复制
print(plaid.__version__)
8.2.0
$ py --version
Python 3.9.6

更新3:根据的建议添加完整的解决方案。需要首先显式地将响应转换为dict,然后再从那里处理。起作用的是:

代码语言:javascript
复制
json_string = json.loads(json.dumps(response.to_dict()))
df = pd.json_normalize(json_string, record_path=['accounts'])

这使我能够在转换成字符串之后,删除所有需要的解决方案,并且基本上直接加载到dataframe。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-19 18:23:05

所以我认为解决办法是这样的

代码语言:javascript
复制
json_string = json.dumps(response.to_dict())
# which you can then input into a df

基本上,我们从从API返回字典转移到返回Python模型。所以我们需要从model -> dictionary -> json出发。to_dict是输出字典的每个模型上的一个方法,然后json.dumps接收字典并将其转换为有效的JSON。

如果这对你有用的话:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69621991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档