Pandasでタイムスタンプでグループ化
🌃 背景
データの処理中に、必ずグループ別の操作が発生します.典型的なグループは操作が非常に簡単です.各グループに対して平均値を求め、中心値を求め、最大値を求め、最大値を求めます.しかし、タイムスタンプが存在し、各グループのタイムスタンプが異なり、単純な演算ではなく特定のタイムウィンドウ(例えばRolling Mean)のAggregationに遭遇すると、問題は複雑になる.
🤔 実例研究
こんなことがあったと思う
要するに、ユーザーごとに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公式ドキュメントで確認できますReference
この問題について(Pandasでタイムスタンプでグループ化), 我々は、より多くの情報をここで見つけました https://velog.io/@otzslayer/Pandas에서-일자-단위-Aggregationテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol