Панель баланса Pandas эффективным способом (прямое заполнение) - PullRequest
0 голосов
/ 06 июля 2018

У меня есть набор данных , и я хотел бы его сбалансировать.

Типы данных:

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.

Однако моя функция расширения оказывается очень неэффективной.

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 голосов
/ 06 июля 2018

возможно, вы можете сначала создать фрейм данных с заполненным столбцом «приращение», как вам нужно

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...