Как использовать wait для итерации и добавления к фрейму данных

#python #parallel-processing #concurrent.futures

#python #параллельная обработка #concurrent.futures

Вопрос:

Я пытаюсь понять, как добавить список запасов в один фрейм данных.

Кто-то сказал, что мне нужно использовать оператор wait (если я хочу выполнить итерацию с помощью оператора append). Я думаю, что у меня все настроено правильно, но я не могу даже выполнить простую итерацию

 from concurrent.futures import wait, ALL_COMPLETED

import concurrent.futures
import datetime
from datetime import timedelta
import yfinance as yf

pool = concurrent.futures.ThreadPoolExecutor(8)

end=datetime.date.today()
start=end - timedelta(weeks=104)

symbols = ['GOOG','CSCO']

def dl(stock):
    #sleep(randint(1, 5))
    #print(stock)
    return yf.download(stock, start=start, end=end).iloc[: , :5].dropna(axis=0, how='any')

futures = [pool.submit(dl, args) for args in symbols]
wait(futures, timeout=10, return_when=ALL_COMPLETED)

#print(futures[1])
futures[0].result()

stocks=[]

for x in range(len(symbols)):
    print(x)
    stocks.append(futures[x].result())
    futures[x].result()
    
print(stocks)
 

Итак … если я сделаю следующее

 stocks = []
# CHANGE IN THE BELOW LINE
for x in range(len(futures)):
    #print(x)
    stocks.append(futures[x].result())
    #futures[x].result()

print(stocks)
 

Он будет напечатан, но тогда это два блока по 502 строки в каждом… и я хочу один фрейм данных (т.Е. 1004 строки). Я смог выполнить это же поведение раньше, не используя wait…

Ответ №1:

 from concurrent.futures import wait, ALL_COMPLETED

import concurrent.futures
import datetime
from datetime import timedelta
import yfinance as yf

pool = concurrent.futures.ThreadPoolExecutor(8)

end = datetime.date.today()
start = end - timedelta(weeks=104)

stocks = ['GOOG', 'CSCO']


def dl(stock):
    # sleep(randint(1, 5))
    # print(stock)
    return yf.download(stock, start=start, end=end).iloc[:, :5].dropna(axis=0, how='any')


futures = [pool.submit(dl, args) for args in stocks]
wait(futures, timeout=10, return_when=ALL_COMPLETED)


# CHANGE IN THE BELOW LINE
stocks_data = pd.DataFrame()
for x in range(0,len(stocks)):
    stocks_data = pd.concat([stocks_data,pd.DataFrame(futures[x].result())])
print(stocks_data.shape)
(1004, 5)
 

Комментарии:

1. это не выполняется. Сначала я попробовал len (фьючерсы). Вы действительно запускали это? На самом деле это менее функционально, чем исходное, которое, по крайней мере, выводит значения x

2. Определенно, len(stocks) — это проблема, поскольку до stocks = [] .

3. мои извинения… странно… Я запускаю это в лаборатории jupyter и получаю «KeyError: ‘CSCO'». Я попробую только в jupyter

4. хорошо. Я собираюсь отредактировать свой вопрос. Я получаю что-то для работы с вашим примером

5. Мне нужен один фрейм данных из 1004 строк … можете ли вы найти волшебную формулу для этого?

Ответ №2:

Заслуга принадлежит Рафаэлю Валеро

но я решил опубликовать окончательный код… Я все еще получаю «keyerror» чаще, чем нет, но иногда заполняется весь фрейм данных

 from concurrent.futures import wait, ALL_COMPLETED

import concurrent.futures
import datetime
from datetime import timedelta
import yfinance as yf
import pandas as pd

pool = concurrent.futures.ThreadPoolExecutor(8)

end = datetime.date.today()
start = end - timedelta(weeks=104)

stocks = ['GOOG', 'CSCO']


def dl(stock):
    return yf.download(stock, start=start, end=end).iloc[:, :5].dropna(axis=0, how='any')


futures = [pool.submit(dl, args) for args in stocks]
wait(futures, return_when=ALL_COMPLETED)

stocks_data = pd.DataFrame()
for x in range(0,len(stocks)):
    prices = pd.DataFrame(futures[x].result())
    prices['Symbol'] = stocks[x]
    stocks_data = pd.concat([stocks_data,prices])

print(stocks_data)