Я хочу найти разницу (в днях) между двумя столбцами в кадре данных (точнее, в структуре данных 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