如何遍历 python 中的 class? (yfinance class)

How to iterate over the class in python? (yfinance class)

我正在尝试获取多只股票的一些数据,但简单 for loop 不会遍历 class。 例如:

    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 只股票的清单,但如果有两只股票的解决方案,那么我认为 code cample 可以用于多只股票。

问题解决:

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)

您在每次迭代时都重新创建了一个数组,并且无论如何都没有正确地附加到该数组。试试这个:

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

最有可能出现此问题的原因是 a 列表是在循环内局部声明的,这意味着它保存的数据在每次迭代时都会被覆盖。

为了解决这个问题,我们可以在循环范围之外声明列表。这样,它可以保留其信息。

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

或者,您可以使用 API 中的另一个内置函数,如 docs 中所示。

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