Оптимизировать функцию фильтрации для времени выполнения в пандах - PullRequest
0 голосов
/ 12 июня 2018
def filter_data(df, raw_col,threshold,filt_col):
    df['pct'] = None
    df[filt_col] = None
    df[filt_col][0] = df[raw_col][0]
    max_val = df[raw_col][0]
    for i in range(1,len(df)):
        df['pct'][i] = (df[raw_col][i] - max_val)*1.0 / max_val
        if abs(df['pct'][i]) < threshold:
            df[filt_col][i] = None
        else:
            df[filt_col][i] = df[raw_col][i]
            max_val = df[raw_col][i]
    df = df.dropna(axis=0, how='any').reset_index()
    return df


from random import randint
some_lst = [randint(50, 100) for i in range(0,50)]
some_df = pd.DataFrame({'raw_col':some_lst})
some_df_filt = filter_data(some_df,'raw_col',0.01,'raw_col_filt')

Цель - создать новый столбец (filter_col), в котором запись из числового столбца (raw_col) будет удалена с использованием следующей логики;если скорость изменения между двумя соседними строками меньше порога, удалите последний.Это работает, но очень неэффективно с точки зрения времени работы.Любые советы о том, как я мог бы оптимизировать это?

1 Ответ

0 голосов
/ 10 июля 2018

IIUC, вы можете сделать это очень просто, используя .pct_change() и loc

Сначала

df['pctn'] = df.raw_col.pct_change()

Затем

threshold  = 0.01
df.loc[df.pctn.abs() >= threshold]

Вы можете проверить, что это решение дает тот же результат, что и ваш, что вы сказали работает, но медленно

df.loc[df.pctn.abs() >= 0.01].raw_col.tolist() == some_df_filt.raw_col.tolist()
True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...