Подмножество сложного вложенного словаря на основе определенных ключей и значений

#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. Спасибо. Пробовал это 🙂