处理批量API请求的异常

2024-05-16 19:22:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我从允许批处理请求的API中提取数据,然后将数据存储到数据帧中。当通过API查找的一个项目出现异常时,我想完全跳过该项目(或将零写入数据帧),然后继续下一个项目。你知道吗

但我的问题是,由于API数据是批量访问的(即,不是循环访问列表中的每个项),因此列表中任何项的异常都会中断程序。那么,我怎样才能优雅地处理异常,而不必遍历tickers列表中的每一项呢?你知道吗

请注意,从tickers列表中删除ERROR将使程序能够成功运行:

import os
from iexfinance.stocks import Stock
import iexfinance

# Set IEX Finance API Token (Sandbox)
os.environ['IEX_API_VERSION'] = 'iexcloud-sandbox'
os.environ['IEX_TOKEN'] = 'Tpk_a4bc3e95d4c94810a3b2d4138dc81c5d'

# List of companies to get data for
tickers = ['MSFT', 'ERROR', 'AMZN']

batch = Stock(tickers, output_format='pandas')
income_ttm = 0

try:
    # Get income from last 4 quarters, sum it, and store to temp Dataframe
    df_income = batch.get_income_statement(period="year")
    print(df_income)

except (iexfinance.utils.exceptions.IEXQueryError, iexfinance.utils.exceptions.IEXSymbolError) as e:
    pass

Tags: 数据项目fromimport程序api列表os
1条回答
网友
1楼 · 发布于 2024-05-16 19:22:00

这样就可以了

import os
from copy import deepcopy

from iexfinance.stocks import Stock
import iexfinance

def find_wrong_symbol(tickers, err):
    wrong_ticker = []
    for one_ticker in tickers:
        if one_ticker.upper() in err:
            wrong_ticker.append(one_ticker)
    return wrong_ticker

# Set IEX Finance API Token (Sandbox)

os.environ['IEX_API_VERSION'] = 'iexcloud-sandbox'
os.environ['IEX_TOKEN'] = 'Tpk_a4bc3e95d4c94810a3b2d4138dc81c5d'

# List of companies to get data for
tickers = ['MSFT', 'AMZN', 'failing']

batch = Stock(tickers, output_format='pandas')
income_ttm = 0

try:
    # Get income from last 4 quarters, sum it, and store to temp Dataframe
    df_income = batch.get_income_statement(period="year")
    print(df_income)

except (iexfinance.utils.exceptions.IEXQueryError, iexfinance.utils.exceptions.IEXSymbolError) as e:
    wrong_tickers = find_wrong_symbol(tickers, str(e))
    tickers_to_get = deepcopy(tickers)
    assigning_dict = {}
    for wrong_ticker in wrong_tickers:
        tickers_to_get.pop(tickers_to_get.index(wrong_ticker))
        assigning_dict.update({wrong_ticker: lambda x: 0})
    new_batch = Stock(tickers_to_get, output_format='pandas')
    df_income = new_batch.get_income_statement(period="year").assign(**assigning_dict)

我创建了一个小函数来查找API不能处理的代码。在删除了错误的标记之后,我回忆起没有它的API,并使用assign函数添加带有0值的缺少的列(它可以是任何值,一个NaN或另一个默认值)。你知道吗

相关问题 更多 >