我目前正在从事一个涉及财务数据的项目。我有一个数据框,其中包含许多基本变量以及许多不同公司的股票收益,如下所示:
year ticker tot_assets return
0 1999 AAPL 10.345 0.1294
1 2000 AAPL 10.988 0.1577
2 2001 AAPL 12.003 0.0782
.. ... ... ... ...
34521 2017 GMBO 0.893 0.2209
34522 2018 GMBO 1.206 0.1001
.. ... ... ... ...
200344 2012 ZZ 3.789 0.0032
200344 2013 ZZ 3.021 -0.0346
[我一直试图做的没有成功的事情是,根据t-1年的最接近ticker
值,使df中的每个公司tot_assets
与另一个公司匹配。因此,创建两个新列,其中一列具有匹配公司的ticker
及其在时间t的returns
。因此,我们在时间t-1进行匹配,但报告的回报是在时间t上。
所以它看起来应该像这样:
year ticker tot_assets return m_ticker m_return
0 1999 AAPL 10.345 0.1294 AA 0.0890
1 2000 AAPL 10.988 0.1577 AA 0.1666
2 2001 AAPL 12.003 0.0782 TSLA 0.3470
.. ... ... ... ... ... ...
34521 2017 GMBO 0.893 0.2209 AIR 0.0032
34522 2018 GMBO 1.206 0.1001 CECE 0.1123
.. ... ... ... ... ... ...
200344 2012 ZZ 3.789 0.0032 ASKI 0.0432
200344 2013 ZZ 3.021 -0.0346 ASKI 0.0339
我希望我的解释很清楚:P也许这就是我遇到麻烦的原因!我无法向您显示df,因为它有200,000多个观测值-但我希望以上概念对您有所帮助:)
谢谢你!
这应该使您的公司的股票代号与1年的tot_assets最匹配。希望,您只需运行一次即可创建数据集。否则,您将不得不研究更快的替代方法。
import numpy as np
def closest_match(row, df):
'''Uses absolute values and argmin to find closest match'''
try:
last_year = df.loc[df.year == row.year - 1, :]
absvals = np.abs(last_year['tot_assets'] - row.tot_assets)
return last_year.iloc[absvals.argmin(), last_year.columns.get_loc('ticker')]
except Exception as e:
return None
df['ticker_closest_tot_assets'] = df.apply(closest_match, args=(df,), axis=1)
# then look up return based on year, ticker_closest_tot_assets