我有一个股票价格为{600,长度为〜600k的数据框,df
,是我从here下载的。
我将最后一列的名称从“名称”重命名为“ ticks”,并创建了一个新的空白列,称为“名称”:
df = df.rename(columns={'Name': 'Ticker'})
df['Name'] = ''
我编写了以下函数来返回给定股票代码的公司名称:
! pip3 install yfinance
import yfinance as yf
def return_company_name(ticker):
return yf.Ticker(ticker).info['longName']
return_company_name('MSFT')
>>> 'Microsoft Corporation'
现在,我想用相应的股票代码的公司名称填充“名称”列。为此,我编写了以下lambda函数:
df.Name = df.Ticker.apply(lambda x: return_company_name(x))
但是这最后一行代码仍在继续运行。有什么问题吗?如果是,该如何解决?
我用map
而不是apply
尝试了相同的方法,但结果相同。
答案 0 :(得分:1)
首先,您不需要lambda
或apply
。
df.Name = df.Ticker.map(return_company_name)
更好。其次,正如其他人所指出的那样,这是非常低效的。即使您的股票行情小得多,您也要拨打600000次电话。以下大锤方法将起作用:
class my_return():
def __init__(self):
self.tickdict = {}
def __call__(self, ticker):
ans = self.tickdict.get(ticker, None)
if ans is not None:
return ans
else:
self.tickdict[ticker] = return_company_name(ticker)
return self.tickdict[ticker]
然后在代码栏上映射my_return。
答案 1 :(得分:0)
从yfinance上查看源代码,您可以看到here
get_info
方法调用_get_fundamentals
,这反过来似乎对不同站点做了一些 调用,以获取所需的信息。
由于这是针对每一行执行的,因此您会遇到一些麻烦,因为网站可能会限制您的访问速度。 也许您可以迈出第一步,获取所有唯一的名称,然后查找一次,然后将它们保存在某种形式的CSV或类似格式的
中答案 2 :(得分:0)
您可以使用pandas.apply()
将函数应用于Dataframe中的每一行/列。
您还可以对每列使用lambda函数。例如:
modDfObj = dfObj.apply(lambda x : x + 10)
另一个示例(此处,仅将函数应用于列z
):
modDfObj = dfObj.apply(lambda x: np.square(x) if x.name == 'z' else x)