pandas 创建历史S&P 500成分股数据框架

bpzcxfmw  于 2023-03-28  发布在  其他
关注(0)|答案(1)|浏览(77)

我试图创建一个DataFrame与标准普尔500公司在过去的每一天20年.我有条目的数据,并存在有记录在每个公司的进入日期和存在日期(如果是这种情况).它如下(更多行):

Action    Company            Code         Date
0   Added    FactSet Res         FDS.N      2021-12-20
1   Removed  HanesBrands         HBI.N      2021-12-20
2   Removed  Leggett & Platt     LEG.N      2021-12-20
3   Added    Signature Bank      SBNY.OQ    2021-12-20
4   Added    Solaredge Tech      SEDG.OQ    2021-12-20
5   Added    HanesBrands         HBI.N      2015-03-23
6   Added    Leggett & Platt     LEG.N      1999-10-18

在另一个dataframe中,我将每个交易日期作为索引,并将每个唯一的公司代码作为列。它看起来像这样(更多列):

Dates   FDS.N   HBI.N   LEG.N  SBNY.OQ  SEDG.OQ      
1999-12-31  NaN     NaN     NaN     NaN     NaN
2000-01-03  NaN     NaN     NaN     NaN     NaN
2000-01-04  NaN     NaN     NaN     NaN     NaN
2000-01-05  NaN     NaN     NaN     NaN     NaN
2000-01-06  NaN     NaN     NaN     NaN     NaN
...         ...     ...     ...     ...     ...
2021-12-27  NaN     NaN     NaN     NaN     NaN
2021-12-28  NaN     NaN     NaN     NaN     NaN
2021-12-29  NaN     NaN     NaN     NaN     NaN
2021-12-30  NaN     NaN     NaN     NaN     NaN
2021-12-31  NaN     NaN     NaN     NaN     NaN

我试图做的是用每个公司的名称填充第二个DataFrame,如果在每个索引日期,该公司是否是索引的一部分。它会像这样(这只是一个例子):

Dates   FDS.N   HBI.N   LEG.N  SBNY.OQ   SEDG.OQ     
1999-12-31  NaN     NaN    LEG.N     NaN       NaN
2000-01-03  NaN     NaN    LEG.N     NaN       NaN
2000-01-04  NaN     NaN    LEG.N     NaN       NaN
2000-01-05  NaN     NaN    LEG.N     NaN       NaN
2000-01-06  NaN     NaN    LEG.N     NaN       NaN
...         ...     ...     ...     ...        ...
2021-12-27  FDS.N   NaN     NaN    SBNY.OQ   SEDG.OQ
2021-12-28  FDS.N   NaN     NaN    SBNY.OQ   SEDG.OQ
2021-12-29  FDS.N   NaN     NaN    SBNY.OQ   SEDG.OQ
2021-12-30  FDS.N   NaN     NaN    SBNY.OQ   SEDG.OQ
2021-12-31  FDS.N   NaN     NaN    SBNY.OQ   SEDG.OQ

我真的不知道如何实现这一点。

wgx48brx

wgx48brx1#

在上市日和退市日的数据框中按发行进行提取,如果有两行,则第一行上市,第二行退市,因为存在上市和退市,并且由于一行只有上市日,因此日期范围作为指定的最后一天获得。最后,用所需交易日的指数更新S&P的数据。

import pandas as pd
import io
import yfinance as yf

sp500_idx = yf.download("^GSPC", periods=max)
new_index = sp500_idx.loc['1999-12-31':'2021-12-31',].index

data = '''
    Action    Company            Code         Date
0   Added    "FactSet Res"         FDS.N      2021-12-20
1   Removed  "HanesBrands"         HBI.N      2021-12-20
2   Removed  "Leggett & Platt"     LEG.N      2021-12-20
3   Added    "Signature Bank"      SBNY.OQ    2021-12-20
4   Added    "Solaredge Tech"      SEDG.OQ    2021-12-20
5   Added    "HanesBrands"         HBI.N      2015-03-23
6   Added    "Leggett & Platt"     LEG.N      1999-10-18
'''

df = pd.read_csv(io.StringIO(data), delim_whitespace=True)

df['Date'] = pd.to_datetime(df['Date'])

new_df = pd.DataFrame()
# start = '1999-12-31'
end = '2021-12-31'
for c in df['Code'].unique():
    dfc = df.query('Code == @c')
    dfc = dfc.sort_values('Date', ascending=True).reset_index()
    if len(dfc) == 2:
        drange = pd.date_range(dfc.loc[0,'Date'], dfc.loc[1,'Date'])
    else:
        drange = pd.date_range(dfc.loc[0,'Date'], end)
    s = pd.Series(c, index=drange, name=c)
    new_df = pd.concat([new_df, s],axis=1)

    FDS.N   HBI.N   LEG.N   SBNY.OQ     SEDG.OQ
Date                    
1999-12-31  NaN     NaN     LEG.N   NaN     NaN
2000-01-03  NaN     NaN     LEG.N   NaN     NaN
2000-01-04  NaN     NaN     LEG.N   NaN     NaN
2000-01-05  NaN     NaN     LEG.N   NaN     NaN
2000-01-06  NaN     NaN     LEG.N   NaN     NaN
...     ...     ...     ...     ...     ...
2021-12-27  FDS.N   NaN     NaN     SBNY.OQ     SEDG.OQ
2021-12-28  FDS.N   NaN     NaN     SBNY.OQ     SEDG.OQ
2021-12-29  FDS.N   NaN     NaN     SBNY.OQ     SEDG.OQ
2021-12-30  FDS.N   NaN     NaN     SBNY.OQ     SEDG.OQ
2021-12-31  FDS.N   NaN     NaN     SBNY.OQ     SEDG.OQ

相关问题