2017-08-22 14 views
1

私はあなたの脳を最適化することを望んでいます。私はまだPythonについて学び、日々の分析アナリストのためにそれを使用しています。私が持っているタスクの1つは、約60kの一意のレコード識別子をソートし、相互作用の約120kレコードを持つ別のデータフレームを検索し、その相互作用を作成した従業員と発生した時間です。参考のために パンダ - 最も早い日付を見つけるための照合番号

、のようなこの時点ルックに2つのデータフレーム:(識別子ファイルケースとして知られている)の名前、ユニークな識別子ですが執筆

main_data =一意識別子のみ nok_dataは=、上に作成し、テキストに注意してください。

私のセットアップでは、現在、およそ2500行/分でデータを並べ替えて照合するので、実行には約25-30分程度の時間がかかります。全体的な

  • 知識の私の不足を回避するための構文の貧しい人々の使用を私のプロセスを遅く

    冗長と非効率的な
    1. :私は好奇心はある私が実行されたすべてのステップがあります。以下は

    私のコードです:

    nok_data = pd.read_csv("raw nok data.csv") #Data set from warehouse 
    
    main_data = pd.read_csv("exampledata.csv") #Data set taken from iTx ids from referral view 
    
    row_count = 0 
    error_count = 0 
    print(nok_data.columns.values.tolist()) 
    print(main_data.columns.values.tolist()) #Commented out, used to grab header titles if needed. 
    data_length = len(main_data) #used for counting how many records left. 
    earliest_nok = {} 
    nok_data["Created On"] = pd.to_datetime(nok_data["Created On"]) #convert all dates to datetime at beginning. 
    
    
    for row in main_data["iTx Case ID"]: 
        list_data = [] 
        nok = nok_data["Case File Identifier"] == row 
        matching_dates = nok_data[["Created On", "Authored By Name"]][nok == True] #takes created on date only if nok shows row was true 
        if len(matching_dates) > 0: 
         try: 
          min_dates = matching_dates.min(axis=0) 
          earliest_nok[row] = [min_dates[0], min_dates[1]] 
         except ValueError: 
          error_count += 1 
          earliest_nok[row] = None 
    
        row_count += 1 
        print("{} out of {} records").format(row_count, data_length) 
    
    
    with open('finaloutput.csv','wb') as csv_file: 
        writer = csv.writer(csv_file) 
        for key, value in earliest_nok.items(): 
         writer.writerow([key, value]) 
    

    は、私が持ってはるかに長く、このようなものを実行するコードから何かアドバイスや専門知識を探しています。これを読む時間をとった皆さんに感謝します。ハッピー火曜日、

    アンディ・M.

    ****データを表示するように要求EDIT 任意のデータ型を含めていないが、私の初心者の移動のため申し訳ありません。

    main_data例

    ITX Case ID 
    2017-023597 
    2017-023594 
    2017-023592 
    2017-023590 
    

    nok_data "生NOKのdata.csv" 別名

    Authored By: Case File Identifier: Note Text: Authored on 
    John Doe   2017-023594   Random Text  4/1/2017 13:24:35 
    John Doe   2017-023594   Random Text  4/1/2017 13:11:20 
    Jane Doe   2017-023590   Random Text  4/3/2017 09:32:00 
    Jane Doe   2017-023590   Random Text  4/3/2017 07:43:23 
    Jane Doe   2017-023590   Random Text  4/3/2017 7:41:00 
    John Doe   2017-023592   Random Text  4/5/2017 23:32:35 
    John Doe   2017-023592   Random Text  4/6/2017 00:00:35 
    
  • +2

    サンプルデータ[MCVE]を投稿する必要があります。最初の一見は、列による反復が非常に遅いということです。 – Alexander

    +0

    'main_data'と' nok_data'にいくつかのダミーデータを提供できますか? –

    +0

    こんにちは@Alexanderそれぞれの基本データをいくつか追加しました。 –

    答えて

    1

    あなたはCase File Identifierにグループ化すると、最小の日付と対応する著者を得るように見えます。

    # Sort the data by `Case File Identifier:` and `Authored on` date 
    # so that you can easily get the author corresponding to the min date using `first`. 
    
    nok_data.sort_values(['Case File Identifier:', 'Authored on'], inplace=True) 
    df = (
        nok_data[nok_data['Case File Identifier:'].isin(main_data['ITX Case ID'])] 
        .groupby('Case File Identifier:')['Authored on', 'Authored By:'].first() 
    ) 
    d = {k: [v['Authored on'], v['Authored By:']] for k, v in df.to_dict('index').iteritems()} 
    
    >>> d 
    {'2017-023590': ['4/3/17 7:41', 'Jane Doe'], 
    '2017-023592': ['4/5/17 23:32', 'John Doe'], 
    '2017-023594': ['4/1/17 13:11', 'John Doe']} 
    
    >>> df 
             Authored on Authored By: 
    Case File Identifier:       
    2017-023590    4/3/17 7:41  Jane Doe 
    2017-023592   4/5/17 23:32  John Doe 
    2017-023594   4/1/17 13:11  John Doe 
    

    おそらくdf.to_csv(...)を使用する方が簡単です。

    一致するレコードがないmain_data ['ITX Case ID']の項目は無視されていますが、必要に応じて含めることができます。

    +0

    これはすべてのコンパクトなコーディングで私のルーキーですが、私は自分のやり方で作業してそれを理解しようとしました。 csvに出力するときには、両方ともスペースなしで1つの行に結合されます。情報を個別に保持するためにデータフレームに新しい列を作成できますか?その特定のタイムスタンプから作成者を取得するだけでなく、ありがとうございました! –

    +0

    私はそれを編集しました。これはあなたが達成しようとしているものと一致していますか? – Alexander

    +0

    私は正しい答えをマークしています。データフレームをcsvに書き込むのがデータを処理するためのより効率的なクリーンな方法でした。私はまだパンダを学んでいますので、マッチングのあなたの解決策は私の頭を少し上回っていますが、私がチャンスを得るときにはドキュメンテーションを通して自分のやり方を工夫したいと考えています。参考までに、コードはpd.to_datetimeでも25分以上3分以下でした。あなたの専門知識のためにありがとう、アンディ。 –

    関連する問題