我有以下问题:
1)df1
:一个DataFrame
,其以下各列:
date Unnamed: 1 Unnamed: 2 Unnamed: 3 ........ Unnamed: 102
2001-12-28 v1 v2 v4 v102
2002-1-30 v1 v3 v7 v102
2002-2-24 v2 v4 v5 v102
.
.
.
.
2020-05-20 v1 v8 v9 v102
在此DataFrame
中,我有日期和该日期在投资组合中存在的股票的名称(v1,v2,...,v102)。
2)df2
:在第二个“ DataFrame”中:
date code price
2002-04-21 v1 50
2002-04-23 v1 50.2
2002-04-23 v2 10.1
. . .
(955809 rows later). .
. . .
2020-05-20 v3 14.3
在我的第二个DataFrame
中,我具有以下日期的每只股票的名称和价格
3)我想创建几个DataFrames
,每个周期为3个月,从df1
第一行中的日期开始,然后再向前移动3个月,只剩下与开始日期匹配的df1
行中显示。
例如:
df3:开始日期2001-12-28
date code price
2001-12-28 v1 50
2001-12-29 v1 50.2
2001-12-29 v2 13.1
. . .
. . .
. . .
2020-03-28 v3 6.5
如果你们能指出我的方向,那我就不知道如何开始或如何紧凑地写作。
答案 0 :(得分:1)
获取第一行数据并获取日期
tickers = df1.iloc[0, 1:].tolist()
# if not datetime
#df1['date'] = pd.to_datetime(df1['date'])
start_date = df.date.iloc[0]
end_date = start_date + pd.DateOffset(months=3)
过滤掉不需要的数据
df2[(df2.date >= start_date) & (df2.date <= end_date) & (df2.ticker.isin(tickers))]
然后可以将这两个步骤添加到循环中。
list_df = []
last_date = df1.iloc[-1,0]
start_date = df1.date.iloc[0]
while True:
end_date = start_date + pd.DateOffset(months=3)
cut_off_date = min(last_date, end_date)
tickers = df1[df1.date == start_date].iloc[0, 1:].tolist()
list_df.append(df2[(df2.date >= start_date) & (df2.date <= cut_off_date) & (df2.ticker.isin(tickers))])
if end_date > last_date:
break
start_date = end_date