如何遍历 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'])
我正在尝试获取多只股票的一些数据,但简单 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'])