Дата и время в питоне — скорость вычислений — большие данные

Я хочу найти разницу (в днях) между двумя столбцами в кадре данных (точнее, в структуре данных graphlab SFrame).

Я попытался написать пару функций для этого, но не могу создать достаточно быструю функцию. Моя проблема сейчас - скорость, так как мне нужно обработать ~ 80 миллионов строк.

Я пробовал две разные функции, но обе они слишком медленные:

Аргументы t2_colname_str и t1_colname_str — это имена столбцов, которые я хочу использовать, и оба столбца содержат объекты datetime.datetime.

Цикл For

def diff_days(sframe_obj,t2_colname_str,t1_colname_str):
    import graphlab as gl
    import datetime as datetime

    # creating the new column name to be used later
    new_colname = str(t2_colname_str[:-9] + "_DiffDays_" + t1_colname_str[:-9])
    diff_days_list = []

    for i in range(len(sframe_obj[t2_colname_str])):
        t2 = sframe_obj[t2_colname_str][i]
        t1 = sframe_obj[t1_colname_str][i]
        try:
            diff = t2 - t1
            diff_days = diff.days
            diff_days_list.append(diff_days)
        except TypeError:
            diff_days_list.append(None)

    sframe_obj[new_colname] = gl.SArray(diff_days_list)

Понимание списка

Я знаю, что это не предназначено для понимания списков, но я просто попробовал, чтобы увидеть, было ли это быстрее.

def diff_days(sframe_obj,t2_colname_str,t1_colname_str):
    import graphlab as gl
    import datetime as datetime

    # creating the new column name to be used later
    new_colname = str(t2_colname_str[:-9] + "_DiffDays_" + t1_colname_str[:-9])

    diff_days_list = [(sframe_obj[t2_colname_str][i]-sframe_obj[t1_colname_str][i]).days if sframe_obj[t2_colname_str][i] and sframe_obj[t1_colname_str][i] != None else None for i in range(len(sframe_obj[t2_colname_str]))]

    sframe_obj[new_colname] = gl.SArray(diff_days_list)

Дополнительные примечания

Я использую GraphLab-Create от Dato и их структуру данных SFrame в основном потому, что она распараллеливает все вычисления, что делает мой анализ сверхбыстрым, и имеет отличную библиотеку для приложений машинного обучения. Это отличный продукт, если вы еще не проверили его.

Руководство пользователя GraphLab можно найти здесь: https://dato.com/learn/userguide/index.html


person mkultra    schedule 23.03.2016    source источник
comment
Я получаю сообщение об отказе в доступе, когда пытаюсь получить SFrame, который вы используете. Он открыт для скачивания всеми? Мне было бы интересно поиграть с ним.   -  person Evan Samanas    schedule 25.03.2016


Ответы (1)


Я рад, что вы нашли для себя рабочий способ, однако SArrays допускает векторные операции, поэтому вам не нужно перебирать каждый элемент столбца. SArrays будут повторяться, но при этом они ДЕЙСТВИТЕЛЬНО медленные.

К сожалению, массивы SArray не поддерживают векторные операции над типами даты и времени, потому что они не поддерживают тип «timedelta». Вы можете сделать это, хотя:

diff = sframe_obj[t2_colname].astype(int) - sframe_obj[t1_colname].astype(int)

Это преобразует столбцы в временную метку UNIX, а затем выполняет векторизованную разностную операцию, которая должна быть достаточно быстрой... по крайней мере, быстрее, чем преобразование в NumPy.

person Evan Samanas    schedule 25.03.2016
comment
Большой!!!! Спасибо. Это идеально и очень быстро ›› 1,57 секунды для всех ~80 миллионов строк. ----- - person mkultra; 27.03.2016
comment
вы можете добавить, что вам нужно разделить diff на 86400 (секунд в день), чтобы получить общую разницу в днях. - person mkultra; 27.03.2016