2016-03-23 7 views
0

データフレーム内の2つの列(具体的にはgraphlab SFrameデータ構造)の違いを(日単位で)探したいと思います。Pythonの日時 - 計算の速度 - 大きなデータ

これを行うためにいくつかの関数を記述しようとしましたが、十分に速い関数を作成できないようです。処理速度は8000万〜8000程度です。

私は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) 

追加メモ

私はそれが私の解析超高速になり、それは偉大なライブラリを持っているすべての計算を並列化する主な理由はダトとそのSFrameデータ構造によりGraphLab-作成し使用してきました機械学習アプリケーション用。あなたがすでにそれをチェックアウトしていないなら、それは素晴らしい製品です。 GraphLabユーザーガイドがここで見つけることができ

https://dato.com/learn/userguide/index.html

+0

使用しているSFrameを取得しようとすると「アクセスが拒否されました」というエラーが表示されます。 「Everyone」はダウンロード可能ですか?私はそれで遊ぶことに興味があるだろう。 –

答えて

0

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

残念ながら、SArraysは、 "timedelta"型をサポートしていないため、datetime型のベクトル演算をサポートしていません。あなたはこのかかわらを行うことができます。

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

速くnumpyのへの変換よりも、少なくとも... UNIXタイムスタンプに列を変換し、十分高速である必要がありますベクトル化差分演算を、行うようにします。

+0

素晴らしい!!!!ありがとうございました。これは完璧で超高速です>>すべての〜8000万行に1.57秒。 ----- – mkultra

+0

合計日数を取得するには、「差分」を86400(1日の秒数)で除算する必要があることを追加することがあります。 – mkultra

関連する問題