Yahoo Financials Error: объект 'NoneType' не может быть подписан - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь загрузить список символов из 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

1 Ответ

0 голосов
/ 30 апреля 2020

Вы можете попробовать пакет под названием 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)])

или вы можете убедиться, что у вас есть действительные символы до вызова метода истории, что вы можете сделать с помощью следующего:

valid_tickers = tickers.validation

valid_tickers - это словарь, содержащий каждый символ в качестве ключа и логическое значение в качестве его значения. Затем просто переназначьте свойство символики списку допустимых тикеров:

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

Затем вызовите метод истории:

df = tickers.history(period='ytd')
...