有两个时间序列数据,
I. "stock_rec“->有两列
II. "stock_matrix“->有6列--> 1) ' date‘--日期时间索引2至6) Stock1、Stock2、Stock3、Stock4和Stock5。到目前为止,数据文件是空的。
要执行的操作:根据投资组合中的股票列表(Stock1、Stock2、Stock3、Stock4、Stock5) (可在“stock_rec”中找到)对每个日期进行,需要使"stock_matrix“中的特定单元格为1。
预期产出:假设“2018年1月”(日期指数),"stock_rec“表示'Stock1‘、'Stock4’在投资组合中。然后,需要为日期为“2018年1月”的dataframe“Stock1”和“Stock4”列中的值设置1。
输入:
stock_rec
Date Portfolio
Jan-10 ['Stock 1','Stock 5']
Feb-10 ['Stock 2','Stock 5']
Mar-10 ['Stock 3','Stock 4','Stock 5]
Apr-10 ['Stock 1']
May-10 []
stock_matrix
Date Stock 1 Stock 2 Stock 3 Stock 4 Stock 5
Jan-10 NaN NaN NaN NaN NaN
Feb-10 NaN NaN NaN NaN NaN
Mar-10 NaN NaN NaN NaN NaN
Apr-10 NaN NaN NaN NaN NaN
May-10 NaN NaN NaN NaN NaN
输出:
stock_matrix
Date Stock 1 Stock 2 Stock 3 Stock 4 Stock 5
Jan-10 1 NaN NaN NaN 1
Feb-10 NaN 1 NaN NaN 1
Mar-10 NaN NaN 1 1 1
Apr-10 1 NaN NaN NaN NaN
May-10 NaN NaN NaN NaN NaN
发布于 2019-04-03 16:14:58
您首先需要取消列表,或者堆叠列表系列。
取一段数据片段,定义我们想要的所有股票:
stocks = ['Stock 1', 'Stock 2', 'Stock 3', 'Stock 4', 'Stock 5']
df = pd.DataFrame({'date':['Jan-10', 'Feb-10'], 'Portfolio':[['Stock 1', 'Stock 5', 'Stock 4'], ['Stock 2', 'Stock 5']]})我要做的第一件事是为缺少的列制作一个假的"None"字段:
df['Portfolio'] = [['None'] if x == [] else x for x in df['Portfolio']]现在,我们将索引设置为date列,然后只获取所需的序列。然后,我们将每个列表作为自己的系列应用,然后将它们全部堆叠在另一个列表之上。然后重新设置索引,以便将日期返回到dataframe中。我们删除创建的level_1,并将0列重命名为Portfolio。最后,我们创建了一个只有1s的新列供以后使用。
df = df.set_index('date').Portfolio.apply(pd.Series) \
.stack() \
.reset_index(drop=False) \
.drop(['level_1'], axis=1) \
.rename(columns={0:'Portfolio'}) \
.assign(v=1)
date Portfolio v
0 Jan-10 Stock 1 1
1 Jan-10 Stock 5 1
2 Jan-10 Stock 4 1
3 Feb-10 Stock 2 1
4 Feb-10 Stock 5 1现在我们就可以把它转起来了。
pd.pivot_table(df,
columns='Portfolio',
index='date',
values='v') \
.drop(['None'], axis=1)现在,我们在股票列表中添加任何缺失的内容:
missing_cols = np.array(stocks)[~pd.Series(stocks).isin(piv.columns)].tolist()
for col in missing_cols:
piv[col] = np.nan
Portfolio Stock 1 Stock 2 Stock 4 Stock 5 Stock 3
date
Feb-10 NaN 1.0 NaN 1.0 NaN
Jan-10 1.0 NaN 1.0 1.0 NaN
Mar-10 NaN NaN NaN NaN NaN如果希望NaNs是0s,则可以将fill_value=0参数传递给pd.pivot_table()。
https://stackoverflow.com/questions/55462085
复制相似问题