前提
Pandasでログデータの分析のためのデータ加工をしています。
ログデータは元データ(添付左側)のように時間、IN/OUT、USER単位の行で格納されており、
基本的にはINと対になるOUTがあるはずですが、まれに対になるものがない状態となっています。
実現したいこと
- 加工後データ(添付右側)のように、INと対になるOUTのデータを同じ行で持ち、列同士の計算で滞在時間(列:diff)を出したいです。
- 1行ごとにループして総当たりをかければ実現できるのですが、データ量が膨大で全行ループでの処理は現実問題実現不可です。
- Pythonでループ処理以外(Pnadas,Numpy等)の計算が早い方法で実現したいと思っています。<br>
→最悪ループ処理でもよいのですが極力計算コストが少なくなる処理(コード)にしたいです。
- 加工後データ(添付右側)のように黄色ハッチング部分は処理の中で変数として渡せるようにしておきたいです。
元データ
No | datetime | in_out | user | service |
---|---|---|---|---|
1 | 2023/1/1 16:33:19 | IN | A | α |
2 | 2023/1/1 16:33:05 | IN | A | α |
3 | 2023/1/1 16:24:43 | IN | A | α |
4 | 2023/1/1 16:23:42 | IN | A | α |
5 | 2023/1/1 16:22:59 | IN | A | α |
6 | 2023/1/1 15:48:54 | IN | A | α |
8 | 2023/1/1 17:17:36 | OUT | A | α |
9 | 2023/1/1 16:31:21 | OUT | A | α |
10 | 2023/1/1 16:00:28 | OUT | A | α |
同一userにおけるINとOUTの対応関係(ルール)がよく分かりません。
以下、元データを日付順に並び替えて左端に行番号列を追加して例にて
11 2023-02-03 15:40:00 IN B
12 2023-02-04 16:00:00 IN B
16 2023-02-04 17:20:00 OUT B
において、16のOUTに対応するのが12ではなく11である理由
13 2023-02-05 16:20:00 IN B
15 2023-02-07 17:00:00 OUT B
17 2023-02-10 18:00:00 OUT B
において、13のINに対応するのが15ではなく17である理由
とくに2つ目、13のINに対応するのは15であるのが自然な気がしますが。
>とくに2つ目、13のINに対応するのは15であるのが自然な気がしますが。
サンプルデータの誤りでした。更新したうえで情報の追記をしました。
>同一userにおけるINとOUTの対応関係(ルール)がよく分かりません。
明確はルールは存在せず、もっともらしさで自分で定義する必要があります。
考えられる定義としてはIN,OUTのuser,service,時間の誤差が最小になるレコードで取得しもっともらしいIN-OUTのペアを作るということです。
この時、ループしてすべての組み合わせとの最小時間を利用するという方法が考えられますが、総当たりで時間がかかりすぎるためより良い方法はないかということで本投稿をしております。
