Использование панд для оптимизации хеширования, примененного к серии - PullRequest
2 голосов
/ 26 мая 2019

У меня есть функция, которая хэширует значения int, существующие в столбце pd.DataFrame some_id.Моя проблема в том, что в конце я вынужден использовать pd.Series.apply, чтобы использовать md5(x).hexdigest().Если apply(f) вызывается для кадра данных со значительным размером строки, это вызовет огромные проблемы с производительностью (время + память), потому что вызовы функций в python ужасны.Поэтому, если он применяется на 10 миллионов строк ... OOM kill неизбежно.(Я пробовал)

Следующая функция делает именно то, что должна, часть, которую нужно изменить, отмечена ниже #TODO

import pandas as pd
import numpy as np
from hashlib import md5
from pandas.api.types import is_numeric_dtype

def hash_some_id(data: pd.DataFrame) -> pd.DataFrame:
    # Remove all na and 0 values in order to encode the rest
    data_to_encode = data.copy()
    data_to_encode = data.replace(0, np.nan)
    data_to_encode.dropna(inplace=True)
    if is_numeric_dtype(data_to_encode.some_id):
        # Convert the int some_id to str and prepend 0 to it
        data_to_encode.some_id = "0" + data_to_encode.some_id.astype(str)
        # Encode to binary
        data_to_encode.some_id = data_to_encode.some_id.str.encode('ascii')

        # TODO : Optimize this
        #  This is inefficient as it is applied on each row of data. 
        #  Find a way to vectorize it
        encoded_data = data_to_encode.some_id.apply(lambda x : md5(x).hexdigest())

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