python 中的日期时间 - 计算速度 - 大数据
Datetime in python - speed of calculations - big data
我想找出数据框中两列之间的差异(以天为单位)(更具体地说是在 graphlab SFrame 数据结构中)。
我已经尝试编写几个函数来执行此操作,但我似乎无法创建足够快的函数。速度是我现在的问题,因为我有大约 8000 万行要处理。
我尝试了两种不同的功能,但都太慢了:
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)
补充说明
我一直在使用 Dato 的 GraphLab-Create 及其 SFrame 数据结构,主要是因为它并行化了所有计算,这使我的分析速度超快,并且它有一个很棒的机器学习应用程序库。如果您还没有检查过,那将是一个很棒的产品。
可在此处找到 GraphLab 用户指南:https://dato.com/learn/userguide/index.html
很高兴您找到了可行的方法,但是 SArray 允许向量运算,因此您不需要遍历列的每个元素。 SArrays 会迭代,但它们真的很慢。
遗憾的是,SArray 不支持日期时间类型的向量运算,因为它们不支持 "timedelta" 类型。你可以这样做:
diff = sframe_obj[t2_colname].astype(int) - sframe_obj[t1_colname].astype(int)
这会将列转换为 UNIX 时间戳,然后执行向量化差分运算,这应该非常快...至少比转换为 NumPy 快。
我想找出数据框中两列之间的差异(以天为单位)(更具体地说是在 graphlab SFrame 数据结构中)。
我已经尝试编写几个函数来执行此操作,但我似乎无法创建足够快的函数。速度是我现在的问题,因为我有大约 8000 万行要处理。
我尝试了两种不同的功能,但都太慢了:
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)
补充说明
我一直在使用 Dato 的 GraphLab-Create 及其 SFrame 数据结构,主要是因为它并行化了所有计算,这使我的分析速度超快,并且它有一个很棒的机器学习应用程序库。如果您还没有检查过,那将是一个很棒的产品。
可在此处找到 GraphLab 用户指南:https://dato.com/learn/userguide/index.html
很高兴您找到了可行的方法,但是 SArray 允许向量运算,因此您不需要遍历列的每个元素。 SArrays 会迭代,但它们真的很慢。
遗憾的是,SArray 不支持日期时间类型的向量运算,因为它们不支持 "timedelta" 类型。你可以这样做:
diff = sframe_obj[t2_colname].astype(int) - sframe_obj[t1_colname].astype(int)
这会将列转换为 UNIX 时间戳,然后执行向量化差分运算,这应该非常快...至少比转换为 NumPy 快。