我正试图用S&过去20年中,每天都有500家公司。我有条目和存在的数据,记录了每个公司的条目日期和存在日期(如果是这样的话(。如下所示(更多行(:
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
在另一个数据帧中,我将每个交易日期作为索引,并将每个唯一的公司代码作为列。它看起来像这样(更多的列(:
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
我真的不知道怎样才能做到这一点。
在上市日期和退市日期的数据框架中按问题提取,如果有两行,则第一行上市,第二行退市,因为存在上市和退市,并且在一行的情况下只有上市日期,因此日期范围作为指定的最后一天。最后,更新来自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