выполнение асинхронных вызовов API с использованием python - PullRequest
0 голосов
/ 14 июля 2020

Я читаю файл .XLSX, используя Pandas, перехожу к определенному столбцу «Des c», извлекаю текст и форматирую его, чтобы сделать почтовый запрос к API классификатора текста. Я получаю ответ в следующем формате:

{"AB C": {"IA": 90, "HX": 5, "GH": 5}, "EFG" : {"DF": 50, "TR": 40, "UI": 10}}

Я уже вставил столбцы «AB C» и столбец «EFG» в свой фрейм данных, используя pandas и для каждого получаемого выходного ответа я заполняю каждое значение ячейки правильным выходным ответом. например, в моем текущем ответе API {"IA": 90, "HX": 5, "GH": 5} and {"DF": 50, "TR": 40, "UI": 10 обновляется под этой конкретной записью и номером ячейки.

Позже я использую df.to_excel, чтобы добавить эти столбцы в мою текущую электронную таблицу.

I я могу написать код синхронно c, и он работает нормально, но в моей таблице 20К строк, и этот метод займет у меня более 15 часов, чтобы выполнить всю задачу.

Как я могу сделать асинхронный Запрос API с использованием aiohttp, чтобы я мог выполнять параллельные вызовы API асинхронно и повышать производительность своего кода.

Вот мой синхронный код с использованием запросов, который работает абсолютно нормально, но требует более 15 часов для выполнения более 30К записей . Как я могу изменить этот код для выполнения асинхронных запросов API

import pandas as pd
import requests
import json

classifierUrl = 'https://X.X.X.X:3000/input'
headers = {'Content-type': 'application/json'}
df = pd.read_excel(r'C:\Users\XXXX\Downloads\test.xml')
df.insert(18, 'ABC', 'n/a')
df.insert(19, 'EFG', 'n/a')

for index, row in df.iterrows():
    if len(str(row["Desc"])) > 50:
        data = {'text': row["Desc"]}
        response = requests.post(classifierUrl, data=json.dumps(data), verify=False, headers=headers,
                                 allow_redirects=False)

        jsonResponse = response.json()
        for k, v in jsonResponse.items():
            if k == 'ABC':
                for key, val in v.items():
                    df.at[index, 'ABC'] = json.dumps(v)[1:-1]
                    break
            if k == 'Vertical':
                for key, val in v.items():
                    df.at[index, 'EFG'] = json.dumps(v)[1:-1]
                    break
df.to_excel(r'C:\Users\XXXX\Downloads\test.xlsx', index=False)
...