Медленный запрос API L oop in Python - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь сделать несколько простых запросов API от облачного сервера IEX, чтобы получить цены закрытия для ряда ценных бумаг. Я успешно извлекаю данные, но они занимают вечность, и их даже не много. Было бы ОГРОМНОЙ помощью, если бы кто-нибудь смог помочь мне реструктурировать мой код, чтобы сделать его быстрее и эффективнее. Ниже то, что я имею до сих пор .. Большое спасибо, ребята

for i, row in Universe.iterrows():
    try:
        request = urllib.request.urlopen('https://cloud.iexapis.com/stable/stock/'+Universe['ticker'][i]+'/chart/date/'+Px_1+'?chartByDay=true&token=TOKEN').read()
        data = json.loads(request)
        Universe['Px_1'][i] = data[0]['close']
    except:
        Universe['Px_1'][i] = np.nan

1 Ответ

2 голосов
/ 19 февраля 2020

Используйте пакет requests для создания многоразового постоянного соединения, которое должно ускорять каждый запрос:

import requests

session = requests.Session()

for i, row in Universe.iterrows():
    try:
        data = session.get(url).json()
        Universe['Px_1'][i] = data[0]['close']
    except:
        Universe['Px_1'][i] = np.nan

Вы также можете выполнять запросы параллельно, используя пул потоков:

from multiprocessing.dummy import Pool


def get_px1(ticker):
    url = 'https://cloud.iexapis.com/stable/stock/' + ticker + '/chart/date/' + Px_1 + '?chartByDay=true&token=TOKEN'
    try:
        data = session.get(url).json()
        return data[0]['close']
    except:
        return np.nan


Universe['Px_1'] = Pool(20).map(get_px1, Universe.ticker)

Но не совсем ясно, может ли сеанс использоваться между потоками, возможно, вам придется использовать что-то особенное или вернуться к requests.get. И сервер может быть недоволен такой высокой частотой запросов.

Также остерегайтесь этого except, поскольку он может молча проглатывать ошибки в вашем коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...