在时间t-1和时间t匹配Python熊猫的面板数据

问题描述 投票:0回答:1

我目前正在从事一个涉及财务数据的项目。我有一个数据框,其中包含许多基本变量以及许多不同公司的股票收益,如下所示:

           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多个观测值-但我希望以上概念对您有所帮助:)

谢谢你!

python pandas numpy finance
1个回答
0
投票

这应该使您的公司的股票代号与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
© www.soinside.com 2019 - 2024. All rights reserved.