簡體   English   中英

如何迭代 python 中的 class? (y金融類)

[英]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 流通股。 理想情況下,結果必須是 dataframe,如:

     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)

最有可能出現問題是因為a列表是在循環中本地聲明的,這意味着它保存的數據在每次迭代時都會被覆蓋。

為了解決這個問題,我們可以在循環的 scope 之外聲明列表。 這樣,它可以保留其信息。

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

或者,您可以在 API 中使用另一個內置的 function,如文檔中所示。

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 object 是一個 Python 字典,我們可以向get function 傳遞一個額外的參數來指定一個默認的回退值。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM