Как перебрать класс в python? (класс yfinance) - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь получить данные для нескольких акций, но простой 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 ]

1 голос
/ 29 апреля 2020

Скорее всего, проблема возникает из-за того, что список a объявлен локально в пределах l oop, что означает, что данные, которые он содержит, переопределяются на каждой итерации.

Чтобы решить эту проблему, мы можем объявить список вне области действия l oop. Таким образом, он может сохранять свою информацию.

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'))

РЕДАКТИРОВАТЬ

Если вы предпочитаете, вы можете упростить l oop с пониманием списка, как показано:

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']) 
0 голосов
/ 29 апреля 2020

Вы воссоздаете массив на каждой итерации и неправильно добавляете этот массив в любом случае. Попробуйте это:

t = ['AAPL', 'MSFT']
a = []
for str in t:
    stock = yf.Ticker(str)
    a.append(stock.info.get('sharesOutstanding'))
...