【问题标题】:How to parse JSON array of objects, and then append to Pandas Dataframe如何解析 JSON 对象数组,然后附加到 Pandas Dataframe
【发布时间】:2021-08-24 20:18:02
【问题描述】:

Jupyter 笔记本。批处理 API 调用返回一个 JSON 对象数组。解析需要 for 循环(奇怪)。我需要将某些 JSON 对象信息附加到 Pandas DataFrame 中。

import numpy as np
import pandas as pd
import xlsxwriter
import requests
from scipy import stats
from pandas_datareader import data
import math
import json

symbol = 'AAPL'
# api_url = f'https://financialmodelingprep.com/api/v3/ratios-ttm/{symbol}?apikey={blah}'
response = requests.get(f'https://financialmodelingprep.com/api/v3/ratios-ttm/{symbol}?apikey={blah}')
# data = requests.get(api_url).json()
data = requests.get(f'https://financialmodelingprep.com/api/v3/ratios-ttm/{symbol}?apikey={blah}').json()
# data = json.loads(response.text)
data

这会输出 AAPL 的股票数据。以:

开头的对象数组

[{'dividendYielTTM': 4, ...'peRatioTTM': 5, ...'priceToBookRatioTTM': 6, ...'priceToSalesRatioTTM': 7 ...}]

显然,这些值是假的。 Anyhoo,要解析和打印它,我必须使用 for 循环。诡异的。但我的代码有效。接下来,我制作了一个 Pandas 数据框。我只想解析 JSON 数组中的对象信息,然后附加它。我构建的数据框的名称是 final_dataframe。

my_columns = [ 'Ticker', 'Price', 'Market Capitalization', 'PE_ttm', 'PE_%', 'PB_ttm', 'PB_%', 'PS_ttm', 'PS_%', 'EV/GP', 'EV/GP_%', 'EV/EBITDA', 'EV/EBITDA_%', 'RV']
final_dataframe = pd.DataFrame(columns = my_columns)
final_dataframe

我尝试解析和追加使用 for 循环。我的 for 循环正在工作(也就是说,它没有给我错误)。但是 Dataframe 没有附加解析的信息。

for i in data:
    final_dataframe.append(
        pd.Series(
            [
                symbol,
                'N/A',
                'N/A',
                i['peRatioTTM'],
                'N/A',
                i['priceToBookRatioTTM'],
                'N/A',
                i['priceToSalesRatioTTM'],
                'N/A',
                'N/A',
                'N/A',
                'N/A',
                'N/A',
                'N/A',
            ],
        index = my_columns),
        ignore_index=True
    )
final_dataframe

请帮忙。任何人。我会提供啤酒和披萨。我确定我已经安装并更新了所有 Python / Pandas / Numpy 包。

【问题讨论】:

  • 在循环之前声明一个列表,将那些循环的数据帧附加到一个列表中,然后在循环结束后使用pd.concat(that_list)
  • "将其他行追加到调用者的末尾,返回一个新对象。" --pandas.DataFrame.append。请参阅下面@crayxt 的答案

标签: python json pandas dataframe parsing


【解决方案1】:

您实际上并不需要使用 for 循环来填充您的数据框。您可以使用pd.read_json 直接加载数据。例如。附上一些演示数据:

import pandas as pd

symbol = 'AAPL'
blah = 'demo'
df = pd.read_json(f'https://financialmodelingprep.com/api/v3/ratios-ttm/{symbol}?apikey={blah}')
df['symbol'] = symbol #create symbol column

您现在可以创建最终数据框并从 df 加载所需的列:

my_columns = [ 'Ticker', 'Price', 'Market Capitalization', 'PE_ttm', 'PE_%', 'PB_ttm', 'PB_%', 'PS_ttm', 'PS_%', 'EV/GP', 'EV/GP_%', 'EV/EBITDA', 'EV/EBITDA_%', 'RV']
final_dataframe = pd.DataFrame(columns = my_columns)
final_dataframe[['Ticker', 'PE_ttm', 'PB_ttm', 'PS_ttm']] = df[['symbol', 'peRatioTTM', 'priceToBookRatioTTM', 'priceToSalesRatioTTM']]

这将输出:

Ticker Price Market Capitalization PE_ttm PE_% PB_ttm PB_% PS_ttm PS_% EV/GP EV/GP_% EV/EBITDA EV/EBITDA_% RV
0 AAPL nan nan 27.4713 nan 30.3039 nan 6.4423 nan nan nan nan nan nan

【讨论】:

    【解决方案2】:

    您必须分配附加的结果,例如

    final_dataframe = final_dataframe.append(...)
    

    【讨论】:

      猜你喜欢
      • 2020-09-28
      • 1970-01-01
      • 2019-12-01
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 2021-07-13
      • 1970-01-01
      相关资源
      最近更新 更多