Как перебрать класс в 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'))
Другие вопросы по тегам