0

データフレーム (より具体的には、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 にあります。

4

1 に答える 1

0

実行可能な方法を見つけてよかったと思いますが、SArray ではベクトル演算が可能であるため、列のすべての要素をループする必要はありません。SArrays は反復しますが、それは本当に遅いです。

残念ながら、SArray は "timedelta" 型をサポートしていないため、datetime 型のベクトル操作をサポートしていません。ただし、これを行うことができます:

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

これにより、列が UNIX タイムスタンプに変換され、ベクトル化された差分操作が実行されます。これは十分に高速である必要があります...少なくとも NumPy への変換よりも高速です。

于 2016-03-25T17:15:47.413 に答える