Как перебрать класс в Python? (класс yfinance)
Я пытаюсь получить данные по нескольким акциям, но просто for loop
не перебирает класс. Например:
In[2]: import yfinance as yf
stock = yf.Ticker('AAPL')
stock.info.get('sharesOutstanding')
Out[2]: 4375479808
И когда я пробую что-то вроде:
t = ['AAPL', 'MSFT']
for str in t:
stock = yf.Ticker(str)
a = []
a = stock.info.get('sharesOutstanding')
Я получаю только акции MSFT в обращении. В идеале результатом должен быть фрейм данных, например:
sharesOutstanding
AAPl 4375479808
MSFT 7606049792
Есть идеи, как это реализовать? На самом деле у меня есть список из примерно 6375 акций, но если будет решение для двух акций, то, я думаю, можно использовать набор кода для нескольких акций.
РЕШЕНИЕ ПРОБЛЕМ:
a = []
b = []
for str in t:
try:
stock = yf.Ticker(str)
a.append(stock.info.get('sharesOutstanding'))
b.append(stock.info.get('symbol'))
except KeyError:
continue
except IndexError:
continue
shares_ots = pd.DataFrame(a, b)
2 ответа
Проблема, скорее всего, возникает из-за того, что a
list объявляется локально внутри цикла, что означает, что данные, которые он хранит, переопределяются на каждой итерации.
Чтобы решить эту проблему, мы можем объявить список за пределами цикла. Таким образом, он может сохранить свою информацию.
t = ['AAPL', 'MSFT']
a = []
for str in t:
stock = yf.Ticker(str)
a.append(stock.info.get('sharesOutstanding'))
В качестве альтернативы вы можете использовать другую встроенную функцию в API, как показано в документации.
tickers = yf.Tickers('aapl msft')
# ^ returns a named tuple of Ticker objects
# access each ticker
tickers.msft.info.get('sharesOutstanding'))
tickers.aapl.info.get('sharesOutstanding'))
РЕДАКТИРОВАТЬ
Если хотите, вы можете упростить цикл с пониманием списка, как показано:
t = ['AAPL', 'MSFT']
a = [yf.Ticker(str).info.get('sharesOutstanding') for str in t]
Поскольку Ticker(str).info
объект представляет собой словарь Python, мы можем передать дополнительный аргумент в get
функция, чтобы указать резервное значение по умолчанию.
a = [yf.Ticker(str).info.get('sharesOutstanding', 'NaN') for str in t]
В этом случае, если в словаре нет 'sharesOutstanding'
ключ, по умолчанию будет None
. Таким образом, мы можем гарантировать, чтоlen(a) == len(t)
.
Чтобы создать фрейм данных pandas, попробуйте что-нибудь вроде
df = pd.DataFrame(a, t, columns=['sharesOutstanding'])
Вы повторно создаете массив на каждой итерации и в любом случае неправильно добавляете к этому массиву. Попробуй это:
t = ['AAPL', 'MSFT']
a = []
for str in t:
stock = yf.Ticker(str)
a.append(stock.info.get('sharesOutstanding'))