高效的熊猫平衡面板(向前填充)

时间:2018-07-06 11:27:03

标签: python pandas pandas-groupby

我有一个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等于4increment的行到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行数据需要很长时间。但是,实际上,我需要平衡的数据要多得多。任何想法如何实现有效的平衡?

我知道这与附加到数据帧有关,这是一个缓慢的操作。

任何想法如何有效地做到这一点?

1 个答案:

答案 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)