0

我正在尝试获取多只股票的一些数据,但 simplefor 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 只股票的清单,但如果有两只股票的解决方案,那么我认为代码 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)
4

2 回答 2

1

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

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

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

要创建熊猫数据框,请尝试类似

df = pd.DataFrame(a, t, columns=['sharesOutstanding']) 
于 2020-04-29T11:53:35.503 回答
0

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

t = ['AAPL', 'MSFT']
a = []
for str in t:
    stock = yf.Ticker(str)
    a.append(stock.info.get('sharesOutstanding'))
于 2020-04-29T11:51:07.753 回答