Наиболее эффективный способ обновления Dataframe с помощью массива JSON из WebService - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть столбец code, который я хотел бы передать веб-службе и обновить два поля в фрейме данных (dfMRD1['Cache_Ticker'] и dfMRD1['Cache_Product'] двумя значениями из возвращенного JSON (RbcSecurityDescription и RbcSecurityType1) Я достиг этого путем итерации, но я хотел бы знать, есть ли более эффективный способ сделать это?

# http://postgre01:5002/bond/912828XU9

import requests
url = 'http://postgre01:5002/bond/'

def fastquery(code):
    response = requests.get(url + code)
    return response.json()

Вот пример обратного вызова:

enter image description here

Вот обновление dfMRD1['Cache_Ticker'] и dfMRD1['Cache_Product']

dfMRD1 = df[['code']].drop_duplicates()
dfMRD1['Cache_Ticker'] = ""
dfMRD1['Cache_Product'] = ""
for index, row in dfMRD1.iterrows():
    result = fastquery(row['code'])
    row['Cache_Ticker'] = result['RbcSecurityDescription']        
    row['Cache_Product'] = result['RbcSecurityType1']          
display(dfMRD1.head(5))

enter image description here

Было бы лучше просто вернуть массив json, распаковать его и сбросить все поля его содержимого в другой файл df, к которому я могу присоединиться dfMRD1? Лучший способ добиться этого?

1 Ответ

0 голосов
/ 08 ноября 2018

Наиболее трудоемкой частью вашего кода, вероятно, является выполнение синхронных запросов. Вместо этого вы можете использовать request-futures для выполнения асинхронных запросов, построения столбцов в виде списков результатов и назначения обратно в DF. Нам не с чем тестировать, но подход будет выглядеть так:

from requests_futures.sessions import FuturesSession

session = FuturesSession(max_workers = 10)
codes = df[['code']].drop_duplicates().values.tolist() # Take out of DF
url = 'http://postgre01:5002/bond/'

fire_requests = [session.get(url + code) for code in codes] # Async requests
responses = [item.result() for item in fire_requests] # Grab the results

dfMRD1['Cache_Ticker'] = [result['RbcSecurityDescription']
                          for result in responses]
dfMRD1['Cache_Product'] = [result['RbcSecurityType1']
                           for result in responses] 

В зависимости от размера DF, вы можете получить много данных в памяти. Если это станет проблемой, вам понадобится фоновый обратный вызов обрезки ваших ответов JSON по мере их возвращения.

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