Как перебрать pandas-datareader и создать несколько фреймов данных для каждого тикера? - PullRequest
0 голосов
/ 20 января 2019

Я хочу итеративно создавать несколько фреймов данных из списка имен тикеров.

Вот сообщение о переполнении стека, на которое я ссылаюсь:

Пост переполнения стека - итеративное создание нескольких фреймов данных

У меня проблемы с пониманием, как это сделать, я чувствую, что я что-то здесь упускаю или неправильно понимаю?

Я написал следующий список и словарь

list_of_tickers = ['BAC','C','GS','JPM','MS','WFC']
dict_of_tickers = {name: pd.DataFrame() for name in list_of_tickers}

Однако, когда я запускаю эту часть кода, я получаю следующую ошибку:

for ticker, ticker_data in dict_of_tickers.items():
    ticker_data = data.DataReader(ticker,'yahoo',start,end)

Это создает единый кадр данных из всех тикеров, но не позволяет мне различать их, я чувствую, что здесь не хватает ключевой логики.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Я обнаружил, что DataReader выполняет итерацию по самому списку, поэтому нет необходимости создавать словарь для итерации.

Следующие строки кода достигают того, что я искал, что является альтернативой объединениюнесколько фреймов данных из каждого биржевого тикера, чтобы не указывать DataReader для каждого символа.

  1. Устанавливает диапазоны дат:
start = datetime.datetime(2006,1,1)
end = datetime.datetime(2016,1,1)
Указывает символы:
 list_of_tickers = ['BAC','C','GS','JPM','MS','WFC']
Перебирает каждый тикер, создает один многоуровневый столбец данных:
p = data.DataReader(list_of_tickers, 'yahoo', start, end)
ДОПОЛНИТЕЛЬНО: Затем поверните уровень столбца «символы» и замените индекс даты, чтобы его можно было использовать в анализе:
res = p.stack().reset_index()
ДОПОЛНИТЕЛЬНО: Этот шаг не является обязательным и был чисто эстетическим, чтобы очистить FrozenList и индексные имена:
res.columns.names=[None]
res.index.names = ['ID']
0 голосов
/ 20 января 2019

ticker_data - это просто переменная, которая создается и перезаписывается на каждой итерации цикла for.Это не помогаетЧтобы обновить свой словарь, назначьте значение ключу явно:

for ticker in dict_of_tickers:
    dict_of_tickers['ticker'] = data.DataReader(ticker, 'yahoo', start, end)

Это предполагает, что data.DataReader возвращает фрейм данных.Обратите внимание, что мы перебираем ключи, так как значение (пустой фрейм данных) не требуется для этого назначения.На самом деле, вам не нужно , чтобы определить словарь с пустыми значениями кадра данных.Просто используйте одно словарное понимание:

dict_of_tickers = {ticker: data.DataReader(ticker, 'yahoo', start, end) \
                   for ticker in list_of_tickers}
...