我有一个Pandas DataFrame,它具有将SP500成分添加到索引或从索引中删除的日期。看起来像这样:
PERMNO start ending
0 10006.0 1957-03-01 1984-07-18
1 10030.0 1957-03-01 1969-01-08
2 10049.0 1925-12-31 1932-10-01
3 10057.0 1957-03-01 1992-07-02
4 10078.0 1992-08-20 2010-01-28
我也有一个有关日期的列表,其中包括2003年1月1日至2009年6月30日之间的交易日。我想创建一个数据框,其中这些日期在索引上,PERMNO作为列。该表将被填充为当日该库存是否已包含在SP500中的真值表。
有快速的方法吗?
注意:将一些库存添加到SP500,然后将其删除,然后再添加。
答案 0 :(得分:1)
如果我对您的理解正确,则您正在尝试查找一系列日期中的S&P 500成份股列表。假设您的数据帧已经具有start
作为ending
和datetime64
:
# the list of dates that you are interested in
dates = pd.Series(['1960-01-01', '1980-01-01'], dtype='datetime64[ns]')
start = df['start'].values
end = df['ending'].values
d = dates.values[:, None] # to prepare for array broadcasting
# if the date is between `start` and `ending` of the stock's membership in the S&P 500
match = (start <= d) & (d <= end)
# list of PERMNO for each as-of date
p = dates.index.to_series() \
.apply(lambda i: df.loc[match[i], 'PERMNO']) \
.stack().droplevel(-1)
# tying everything together
result = dates.to_frame('AsOfDate').join(p)
结果:
AsOfDate PERMNO
0 1960-01-01 10006.0
0 1960-01-01 10030.0
0 1960-01-01 10057.0
1 1980-01-01 10006.0
1 1980-01-01 10057.0
答案 1 :(得分:1)
您可以将SparkApi.client.get "/listings/#{listing_id}", :_expand => "CustomFields"
SparkApi.client.post "/listings/#{listing_id}/contacts
构造函数与Dataframe
和np.tile
配合使用,并按np.repeat
创建的掩码进行过滤:
ravel
与dates = pd.to_datetime(['1960-01-01', '1980-01-01'])
start = df['start'].values
end = df['ending'].values
d = dates.values[:, None]
#filter by boolean broadcasting
match = (start <= d) & (d <= end)
a = np.tile(df['PERMNO'], len(dates))
b = np.repeat(dates, len(df))
mask = match.ravel()
df1 = pd.DataFrame({'Date1':b[mask], 'PERMNO':a[mask]})
print (df1)
Date1 PERMNO
0 1960-01-01 10006.0
1 1960-01-01 10030.0
2 1960-01-01 10057.0
3 1980-01-01 10006.0
4 1980-01-01 10057.0
表类似的不同输出:
True/False