У меня есть набор данных , и я хотел бы его сбалансировать.
Типы данных:
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 строк данных.Однако на самом деле у меня гораздо больше данных для баланса, чем это.Есть идеи, как добиться эффективной балансировки?
Я знаю, что это связано с добавлением к фреймам данных, что является медленной операцией.
Есть идеи, как это сделать эффективно?