我有一个dataset,我想保持平衡。
数据类型为:
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
。我希望所有increment
之间都没有空隙(即increment
不能为1,2,5
,必须为1,2,3,4,5
)。在只有1,2,5
的情况下,我想用increment
等于的行填充3
等于4
和increment
的行到2
,即向前填充。
此外,我希望按SYM_ROOT和DATE分组进行前向填充。
但是,我的expand函数原来效率很低。
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)
平衡1,000,000行数据需要很长时间。但是,实际上,我需要平衡的数据要多得多。任何想法如何实现有效的平衡?
我知道这与附加到数据帧有关,这是一个缓慢的操作。
任何想法如何有效地做到这一点?
答案 0 :(得分:2)
也许您可以首先创建一个数据帧,并根据需要填充“增量”列
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)