【问题标题】:Parsing complex Json retrieved from API解析从 API 检索到的复杂 Json
【发布时间】:2021-09-26 15:19:06
【问题描述】:

我正在尝试学习有关从 API 解析复杂 JSON 数据的教程。不幸的是,我遇到了麻烦,我相信这个问题可能与 API JSON 数据的不同结构有关,但我不能 100% 确定。这是我的代码的起点,它似乎工作正常。

import requests
import pandas as pd
import json
import pprint
import seaborn as sns
import matplotlib.pyplot as plt

base_url="https://data.sec.gov/api/xbrl/companyfacts/CIK0001627475.json"
headers={'User-Agent': 'Microsoft Edge My Header data'}
first_response=requests.get(base_url,headers=headers)
response_list=first_response.json()
print(response_list) 

我遇到麻烦的地方是我去解析和创建一个 PD DataFrame,如下所示;

data=[]
for respone in response_list:
    data.append({"cik":response.get('cik'),"entityName":response.get('entityName')}
base_df=pd.DataFrame(data)
base_df.head()

即使我很确定我已经直接按照教程进行操作(使用不同的 API 数据),但我收到以下错误;

File "<ipython-input-34-8206debe28ba>", line 4
    my_df=pd.DataFrame(data)
    ^
SyntaxError: invalid syntax

我很想了解这里的错误以及如何了解我需要发送的请求类型以分解如此复杂的 JSON 数据集并从 FACTS、DEI、US-GAAP 的子部分检索相关列等等

【问题讨论】:

    标签: json pandas api python-requests


    【解决方案1】:

    有一个SyntaxError,因为您忘记了上一行末尾的 ')':

    data.append({"cik":response.get('cik'),
                 "entityName":response.get('entityName')})  # <- HERE ')'
    

    但是现在,您的代码将引发AttributeError。您不需要遍历response_list,因为实际上它不是列表而是字典:

    >>> type(response_list)
    dict
    

    因此,您的代码可能很简单:

    base_df = pd.DataFrame(response_list)
    
    >>> base_df
                 cik   entityName                                              facts
    dei      1627475  UPWORK INC.  {'EntityCommonStockSharesOutstanding': {'label...
    us-gaap  1627475  UPWORK INC.  {'AccountsPayableCurrent': {'label': 'Accounts...
    

    【讨论】:

    • 太棒了,非常感谢。如果我想更深入地研究 JSON、DEI、US GAAP 等级别,是否需要在那个时候进行迭代?然后我需要指定要迭代的区域还是只使用上面提到的原始代码导致 CI​​K 和 EntityName 出现属性错误?
    • 你的数据结构真的很复杂,而且非常嵌套。我不认为你可以一次提取。在提取数据之前,您必须真正知道您需要什么。 pd.json_normalize可以帮到你。
    • 如果您发布有关您的结构的其他问题,请随时在此处发表评论以通知我。我会试着回答。 (和ty)
    • 谢谢,我发布了一个显示属性错误的新问题,我想了解如何导航 JSON 结构的各个级别。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    相关资源
    最近更新 更多