[英]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.