2 回答
TA贡献1906条经验 获得超10个赞
我不确定您当前的代码 - 但基本上您所需要的只是索引范围的列表。如果您的索引是线性的,则如下所示:
indexes = list(df[df.signal==1].index)
ranges = [(i,list(range(i-20,i+21))) for i in indexes] #create tuple (original index,range)
dfs = [df.loc[i[1]].copy().rename(
columns={'VXX_Full':i[0]}).reset_index(drop=True) for i in ranges]
#EDIT: for only the VXX_Full Column:
dfs = [df.loc[i[1]].copy()[['VXX_Full']].copy().rename(
columns={'VXX_Full':i[0]}).reset_index(drop=True) for i in ranges]
#here we take the -20:+20 slice of df, make a separate dataframe, the
#we change 'VXX_Full' to the original index value, and reset index to give it 0:40 index.
#The new index will be useful when putting all the columns next to each other.
因此,我们制作了一个信号== 1的索引列表,将其转换为范围列表,最后是具有重置索引的数据帧列表。现在我们想把它们合并在一起:
from functools import reduce
merged_df = reduce(lambda left, right: pd.merge(
left, right, left_index=True, right_index=True), dfs)
TA贡献1875条经验 获得超5个赞
我会从列表字典中构建生成的数据帧:
resul = pd.DataFrame({i:df.loc[i-20 if i >=20 else 0: i+40 if i <= len(df) - 40 else len(df), 'VXX_FULL'].values for i in df.loc[df.signal == 1].index})
诀窍是提取一个没有关联索引的numpy数组。.values
注意:上面的代码假设原始数据帧的索引只是行号。如果不同,请先使用。reset_index
添加回答
举报