将开始日期和结束日期的数据透视表插入真值表

时间:2019-07-28 01:05:25

标签: python pandas

我有一个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,然后将其删除,然后再添加。

2 个答案:

答案 0 :(得分:1)

如果我对您的理解正确,则您正在尝试查找一系列日期中的S&P 500成份股列表。假设您的数据帧已经具有start作为endingdatetime64

# 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 构造函数与Dataframenp.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