簡體   English   中英

基於特定鍵和值的復雜嵌套字典子集

[英]Subset complex nested dictionary based on specific keys and values

我正在使用 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: 'prices']。

stock_hist_df = pd.DataFrame({
    a: {x['formatted_date']: x['adjclose'] for x in data[a]['prices']}
        for a in ticker_sub
})

我認為,因為字典 [data] 中的第一個元素沒有 ['prices'] 鍵(任何數據)。

我對 Python 還是相當陌生,並且我一天中的大部分時間都在使用循環/列表理解來對 ['prices'] 鍵和值 [>0] 退出的位置進行子集化。 然后,下一部分 [pd.DataFrame] 有望成功! 想知道是否有人可以幫助我解決這個問題或建議替代/更好的方法來處理這個問題。

干杯:-)

納德爾

你可以試試下面的代碼。

stock_hist_df = pd.DataFrame({
    a: {x['formatted_date']: x['adjclose'] for x in data[a].get('prices', [])}
        for a in ticker_sub
})

對於歷史數據,您可能會發現使用 yfinance 庫更容易。

import yfinance as yf
import pandas as pd

df = yf.download('IBM', 
                  start='2020-01-01', 
                  end='2020-09-05', 
                  progress=False)
                                        

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM