#python #dictionary
#python #словарь
Вопрос:
Я использую пакет yahoofinancials для получения исторических цен по некоторому выбранному тикеру. Приведенный ниже код дает мне сложный вложенный словарь
from yahoofinancials import YahooFinancials
yahoo_financials = YahooFinancials(ticker_sub)
data = yahoo_financials.get_historical_price_data(start_date=period_start
, end_date=period_end
, time_interval='daily')
Вот пример словаря, который я получаю:
{'RYAN.L':
{
'eventsData': {}
}
, 'SAP':
{
'eventsData': {}
, 'firstTradeDate':
{
'formatted_date': '1995-09-18'
, 'date': 811431000
}
, 'currency': 'USD'
, 'instrumentType': 'EQUITY'
, 'timeZone': {'gmtOffset': -14400}
, 'prices': [{
'date': 1599249601
, 'high': 161.3000030517578
, 'low': 153.94000244140625
, 'open': 160.42999267578125
, 'close': 159.42999267578125
, 'volume': 702491
, 'adjclose': 159.42999267578125
, 'formatted_date': '2020-09-04'
}]
}
}
Однако, когда я запускаю приведенный ниже код, чтобы получить это в Pansdas DF (приведенный ниже код), я сталкиваюсь с некоторым KeyError [KeyError: ‘цены’].
stock_hist_df = pd.DataFrame({
a: {x['formatted_date']: x['adjclose'] for x in data[a]['prices']}
for a in ticker_sub
})
Я полагаю, потому что нет ключа [‘prices’] (любых данных) для первого элемента в словаре [data].
Я довольно новичок в Python и потратил большую часть своего дня на понимание циклов / списков, чтобы подмножить словарь для того, где [‘prices’] ключ и значение [> 0] выходят. Тогда, надеюсь, следующая часть [pd.DataFrame] будет работать! Интересно, может ли кто-нибудь помочь мне с этим или предложить альтернативный / лучший способ решения этой проблемы.
Приветствия 🙂
Nadeer
Ответ №1:
Вы можете попробовать следующий код.
stock_hist_df = pd.DataFrame({
a: {x['formatted_date']: x['adjclose'] for x in data[a].get('prices', [])}
for a in ticker_sub
})
Комментарии:
1. Спасибо. Очень признателен.
Ответ №2:
Для исторических данных вам может быть проще использовать библиотеку yfinance.
import yfinance as yf
import pandas as pd
df = yf.download('IBM',
start='2020-01-01',
end='2020-09-05',
progress=False)
Комментарии:
1. Спасибо. Пробовал это 🙂