Python 以有效方式安装平衡面板(向前填充)
我有一个问题,我想平衡一下 数据类型包括:Python 以有效方式安装平衡面板(向前填充),python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我有一个问题,我想平衡一下 数据类型包括: TIME_M datetime64[ns] genesis datetime64[ns] SYM_ROOT category BEST_BID float64 BEST_ASK float64 judgement datetime64[ns] DATE int64 TIME_S obj
TIME_M datetime64[ns]
genesis datetime64[ns]
SYM_ROOT category
BEST_BID float64
BEST_ASK float64
judgement datetime64[ns]
DATE int64
TIME_S object
MIDPRICE float64
bps float64
spread float64
diff timedelta64[ns]
diff_sec int64
increment int64
dtype: object
我要平衡的变量是increment
。我希望所有增量
之间没有间隙(即增量
不能是1,2,5
,必须是1,2,3,4,5
)。在只有1,2,5
的情况下,我想用increment
等于3
和4
的行填充increment
等于2
的行,即向前填充
除此之外,我希望在SYM_根和日期组中进行正向填充
然而,我的扩展函数却非常低效
def expand_gap(x):
#function to expand gaps
#iterate through to find gaps
x['tmp_diff']=x['increment'].shift(-1)-x['increment']
tmp_df=x[x['tmp_diff']>1]
for i in range (0, len(tmp_df)):
expand_incre = tmp_df.iloc[i,tmp_df.columns.get_loc('increment')]
target_incre = tmp_df.iloc[i,tmp_df.columns.get_loc('increment')]+tmp_df.iloc[i,tmp_df.columns.get_loc('tmp_diff')]
while (target_incre-expand_incre)>1:
tmp_row=tmp_df.iloc[i:i+1]
new_row=tmp_row.copy()
expand_incre=expand_incre+1
new_row['increment'].iloc[0]=expand_incre
x=x.append(new_row)
return x
df=df.groupby(['SYM_ROOT','DATE']).apply(expand_gap)
平衡1000000行数据需要很长时间。然而,在现实中,我需要平衡的数据要多得多。你知道如何实现有效的平衡吗
我知道它与附加到数据帧有关,这是一个缓慢的操作
你知道如何有效地做吗 也许您可以先创建一个数据帧,根据需要填充“increment”列
max_lim = 20
my_list=list(range(1,max_lim))
my_array = np.array(my_list).reshape(max_lim-1, 1)
df = pd.DataFrame(my_array, columns=["increment"])
然后,您可以将其与数据帧连接起来
df=df.merge(tmp_df)
之后,您应该能够使用fillna实现您的目标:
df.fillna(method='ffill', inplace=True)
也许您可以先创建一个数据框,根据需要填充“increment”列
max_lim = 20
my_list=list(range(1,max_lim))
my_array = np.array(my_list).reshape(max_lim-1, 1)
df = pd.DataFrame(my_array, columns=["increment"])
然后,您可以将其与数据帧连接起来
df=df.merge(tmp_df)
之后,您应该能够使用fillna实现您的目标:
df.fillna(method='ffill', inplace=True)
我把max_lim=20作为例子,它应该是max(tmp_df.increment)。您应该只有两个数据帧要连接,df和temp_dfI认为它应该是外部连接,并将键指定为
increment
?我试图编辑它,但不知怎么被拒绝了…df=df.merge(tmp_-df,on=“increment”,how=“outer”)
@Giuseppe bonavatiyes,你需要外部连接-或左连接。我认为增量是不必要的,因为id是两个数据帧之间共享的唯一列。我是否通过每个组连接它?我将max_lim=20作为示例,它应该是max(tmp_df.increment)。您应该只有两个数据帧要连接,df和temp_dfI认为它应该是外部连接,并将键指定为increment
?我试图编辑它,但不知怎么被拒绝了…df=df.merge(tmp_-df,on=“increment”,how=“outer”)
@Giuseppe bonavatiyes,你需要外部连接-或左连接。我认为增量是不必要的,因为id是两个数据帧之间共享的唯一列。