データフレーム (より具体的には、graphlab SFrame データ構造) 内の 2 つの列の差 (日数) を見つけたいと考えています。
これを行うためにいくつかの関数を作成しようとしましたが、十分に高速な関数を作成できないようです。処理する行が最大 8,000 万行あるため、現在は速度が問題です。
2 つの異なる関数を試しましたが、どちらも遅すぎます。
t2_colname_str および t1_colname_str 引数は、使用する列名であり、両方の列に datetime.datetime オブジェクトが含まれています。
ループの場合
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 にあります。