Pandasでタイムスタンプでグループ化


🌃 背景


データの処理中に、必ずグループ別の操作が発生します.典型的なグループは操作が非常に簡単です.各グループに対して平均値を求め、中心値を求め、最大値を求め、最大値を求めます.しかし、タイムスタンプが存在し、各グループのタイムスタンプが異なり、単純な演算ではなく特定のタイムウィンドウ(例えばRolling Mean)のAggregationに遭遇すると、問題は複雑になる.

🤔 実例研究


こんなことがあったと思う
  • 4人のユーザがランダムに特定のページ
  • をクリック
  • クリックしたタイムスタンプは秒単位で
  • を記録する.
  • ユーザーのページクリックに関する新しい機能を作成するには、各クリックポイントの最近30秒のクリック数の合計
  • を統計したい.
    要するに、ユーザーごとに30秒のクリックスクロール数を作成する必要があります.Pandasはrolling()メソッドをサポートし、グループ別のデータフレームもサポートする.ただし、ドキュメントにはタイムスタンプのRolling Aggregationについて詳しくは記載されていません.

    ソリューション


    まずおもちゃのデータを作ります.
    import pandas as pd
    import numpy as np
    from datetime import datetime, timedelta
    
    SIZE = 100000
    
    users = np.random.choice(["A", "B", "C", "D"], size=SIZE, replace=True)
    time_base = datetime.strptime("2021-07-01 00:00:00", "%Y-%m-%d %H:%M:%S")
    ts_list = [time_base + timedelta(seconds=x) for x in range(SIZE)]
    ts_list = np.random.choice(ts_list, size=SIZE, replace=True)
    clicks = np.ones(SIZE)
    
    df = pd.DataFrame({"user": users, "timestamp": ts_list, "click": clicks})
    df = df.sort_values("timestamp").reset_index(drop=True)
    次のデータが得られます.

    タイムスタンプをスクロール集約するには、データフレームのインデックスをタイムスタンプに変更する必要があります.
    df = df.set_index("timestamp")
    rolling()メソッドを使用してインデックスのデータを置換するには、ウィンドウサイズを30秒に設定する必要があります.最終コードは次のとおりです.
    df.groupby(["user"]).rolling("30S", min_period=1).sum().reset_index()
    "30S"をウィンドウサイズに合わせて変更し、1日、1ヶ月などに変更できます.このFrequencesStringはPandas公式ドキュメントで確認できます