Как оптимизировать приведенный ниже код, чтобы он работал быстрее, размер моего фрейма данных составляет почти 100 000 точек данных - PullRequest
0 голосов
/ 16 ноября 2018
def encoder(expiry_dt,expiry1,expiry2,expiry3):
    if expiry_dt == expiry1:
        return 1
    if expiry_dt == expiry2:
        return 2
    if expiry_dt == expiry3:
        return 3



FINAL['Expiry_encodings'] = FINAL.apply(lambda row: '{0}_{1}_{2}_{3}_{4}'.format(row['SYMBOL'],row['INSTRUMENT'],row['STRIKE_PR'],row['OPTION_TYP'], encoder(row['EXPIRY_DT'],
                                                                                                                                             row['Expiry1'],
                                                                                                                                             row['Expiry2'],
                                                                                                                                             row['Expiry3'])), axis =1)

Код работает совершенно нормально, но он слишком медленный, есть ли другая альтернатива для достижения этого за меньшее время?

Sample Dataframe

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Решение такое же, как указано выше, с небольшим изменением,

FINAL['expiry_number'] = '0'
    for c in '321':
        FINAL.loc[FINAL['EXPIRY_DT'] == FINAL['Expiry'+c], 'expiry_number'] = c

    FINAL['Expiry_encodings'] = FINAL['SYMBOL'].astype(str) + '_' + \
    FINAL['INSTRUMENT'].astype(str) + '_' + FINAL['STRIKE_PR'].astype(str) + \
    '_' + FINAL['OPTION_TYP'].astype(str) +' _' + FINAL['expiry_number']
0 голосов
/ 16 ноября 2018

Попробуйте следующее:

FINAL['expiry_number'] = '0'
for c in '321':
    FINAL.loc[FINAL['EXPIRY_DT'] == FINAL['Expiry'+c], 'expiry_number'] = c

FINAL['Expiry_encodings'] = FINAL['SYMBOL'].astype(str) + '_' + \
    FINAL['INSTRUMENT'].astype(str) + '_' + FINAL['STRIKE_PR'].astype(str) + \
    '_' + FINAL['OPTION_TYP'].astype(str) + '_' + FINAL['expiry_number']

Это позволяет избежать трех операторов if, имеет значение по умолчанию ('0'), если ни один из операторов if не оценивается как True, и позволяет избежать форматирования всех строк; Кроме того, он также избегает метода apply с lambda.

Примечание по порядку '321': это отражает порядок, в котором оценивается цепочка if в исходном разделе кода: 'Expiry3' имеет самый низкий приоритет, и в моем коде, приведенном здесь, он сначала переопределяется на # 2, а затем № 1. Исходная цепочка if будет ярлыком на # 1, учитывая, что это самый высокий приоритет. Например, если 'Expiry1' и 'Expiry3' имеют одинаковое значение (равное 'EXPIRY_DT'), назначенное значение будет 1, а не 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...