pandas параллельный запрос urllib для Loop

У меня есть код для анализа данных JSON через API, используя urllib, как показано ниже:

import pandas as pd
import json
import urllib.request
import os
import time
import csv
import datetime
    # Send URL Request & Get JSON Data
with urllib.request.urlopen("https://bittrex.com/api/v1.1/public/getmarketsummaries") as url:
    data = json.loads(url.read().decode())

    # Select Data from result section
    df = pd.DataFrame(data=data['result'])
# tickers = df['MarketName']
tickers= ["BTC-1ST", "BTC-2GIVE", "BTC-ABY", "BTC-ARDR", "BTC-WAVE"]
print(tickers)

for ticker in tickers:
    with urllib.request.urlopen("https://bittrex.com/Api/v2.0/pub/market/GetTicks?marketName=" + ticker + "&tickInterval=thirtyMin") as URL:
        data = json.loads(URL.read().decode())
        df2 = pd.DataFrame(data=data['result'])
        Market01 = "Market"
        df2[Market01] = ticker
        df2.to_csv('all.csv', encoding="utf-8-sig", index=False, mode='a', header=False)
        print("done " + ticker)

на самом деле это не запрос только пяти валют.. это 295 запросов 295 валют.. которые занимают 5 минут, чтобы заполнить все необходимые данные в CSV-файл (очень долго)

Интересно, есть ли способ отправить все запросы параллельно, чтобы уменьшить время с той же опцией, чтобы сохранить данные в CSV-файл в качестве dataframe

я искал много раз и нашел многопроцессорный модуль, но не смог найти образец, похожий на мой случай

любой может помочь мне, пожалуйста!!!!!!

1 ответ

Решение

Как насчет этого?

import pandas as pd
import json
import urllib.request
import os
from urllib import parse
import csv
import datetime
from multiprocessing import Process, Pool
import time

    # Send URL Request & Get JSON Data
with urllib.request.urlopen("https://bittrex.com/api/v1.1/public/getmarketsummaries") as url:
    data = json.loads(url.read().decode())

    # Select Data from result section
    df = pd.DataFrame(data=data['result'])
# tickers = df['MarketName']
tickers= ["BTC-1ST", "BTC-2GIVE", "BTC-ABY", "BTC-ARDR", "BTC-WAVE"]
print(tickers)

def http_get(url):
  result = {"url": url, "data": urllib.request.urlopen(url, timeout=5).read()}
  return result

urls = [ "https://bittrex.com/Api/v2.0/pub/market/GetTicks?marketName=" + ticker + "&tickInterval=thirtyMin" for ticker in tickers ]

pool = Pool(processes=5)

results = pool.map(http_get, urls)

for result in results:
    j = json.loads(result['data'].decode())
    df2 = pd.DataFrame(data=j)
    Market01 = "Market"
    marketName = parse.parse_qs(parse.urlparse(result['url']).query)['marketName'][0]
    df2[Market01] = marketName
    df2.to_csv('all.csv', encoding="utf-8-sig", index=False, mode='a', header=False)
    print("done " + marketName)
Другие вопросы по тегам