Yahoo Financials错误:“ NoneType”对象不可下标

问题描述 投票:0回答:1

我正在尝试从CSV中加载符号列表,然后从YahooFinancials中提取历史股票信息。该程序一直运行到我得到的最后一个组件:'NoneType' object is not subscriptable。我非常感谢您的帮助。这是我的第一篇文章,因此,如果需要更多信息,请告诉我。

这是我的代码:

import pandas as pd
import yfinance as yf
from yahoofinancials import YahooFinancials
import datetime

#import csv list of symbols
stocksmini = pd.read_csv('watchlistmini.csv')
stocksmini
symbollist = stocksmini['Symbol'].tolist()
symbollist

#symbollist has this format:
['BASWW', 'BBLC', 'EMGE', 'VBVT']

#pull stock info
test = symbollist

yahoo_financials = YahooFinancials(test)

data = yahoo_financials.get_historical_price_data (start_date='2020-01-01',
                                                   end_date='2020-04-26',
                                                   time_interval='daily')

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

test2

这是我得到的错误:

Error (Note: error referencing line starting with a: {x...)
TypeError: 'NoneType' object is not subscriptable
python pandas yahoo-finance
1个回答
0
投票

您可以尝试一个名为yahooquery的软件包。由于进行了类似的调用,将返回一个数据帧。

from yahooquery import Ticker

# Your symbollist from above
symbollist = [...]

tickers = Ticker(symbollist, asynchronous=True)

# Get historical pricing data
# Other arguments include start, end, and interval
df = tickers.history(period='ytd')

如果传递给构造函数的所有符号均有效,则从上面的语句返回的数据类型将为数据框。如果有无效符号,则结果将是字典。但是,您仍然可以如下创建数据框:

if isinstance(df, dict):
    [df[symbol].insert(0, "symbol", symbol) for symbol in symbollist if isinstance(df[symbol], pd.DataFrame)]
    df = pd.concat([df[symbol] for symbol in symbollist if isinstance(df[symbol], pd.DataFrame)])

您可以在调用history方法之前确保具有有效的符号,您可以使用以下操作:

valid_tickers = tickers.validation

valid_tickers是一个字典,其中包含每个符号作为键,并包含一个布尔值作为其值。接下来,只需将symbols属性重新分配给有效行情清单:

tickers.symbols = [k for k in k, v in valid_tickers.items() if v]

然后调用您的历史记录方法:

df = tickers.history(period='ytd')
© www.soinside.com 2019 - 2024. All rights reserved.