10

Apache ログ ファイルを分析していて、それを pandas データフレームにインポートしました。

'65.55.52.118 - - [30/May/2013:06:58:52 -0600] "GET /detailedAddVen.php?refId=7954&uId=2802 HTTP/1.1" 200 4514 "-" "Mozilla/5.0 (互換性あり; bingbot /2.0; + http://www.bing.com/bingbot.htm )"'

私のデータフレーム:

ここに画像の説明を入力

これを、IP、エージェント、および時間差に基づいてセッションにグループ化したい (時間が 30 分を超える場合は、新しいセッションにする必要があります)。

データフレームを IP とエージェントでグループ化するのは簡単ですが、この時間差を確認するにはどうすればよいでしょうか?問題が解決されることを願っています。

sessions = df.groupby(['IP', 'Agent']).size()

更新: df.index は次のようになります。

<class 'pandas.tseries.index.DatetimeIndex'>
[2013-05-30 06:00:41, ..., 2013-05-30 22:29:14]
Length: 31975, Freq: None, Timezone: None
4

2 に答える 2

14

shiftaと aを使用してこれを行いますcumsum(これは、時間の代わりに数字を使用した簡単な例ですが、まったく同じように機能します)。

In [11]: s = pd.Series([1., 1.1, 1.2, 2.7, 3.2, 3.8, 3.9])

In [12]: (s - s.shift(1) > 0.5).fillna(0).cumsum(skipna=False)  # *
Out[12]:
0    0
1    0
2    0
3    1
4    1
5    2
6    2
dtype: int64

* skipna=False の必要性はバグのようです。

次に、これをgroupbyapplyで使用できます。

In [21]: df = pd.DataFrame([[1.1, 1.7, 2.5, 2.6, 2.7, 3.4], list('AAABBB')]).T

In [22]: df.columns = ['time', 'ip']

In [23]: df
Out[23]:
  time ip
0  1.1  A
1  1.7  A
2  2.5  A
3  2.6  B
4  2.7  B
5  3.4  B

In [24]: g = df.groupby('ip')

In [25]: df['session_number'] = g['time'].apply(lambda s: (s - s.shift(1) > 0.5).fillna(0).cumsum(skipna=False))

In [26]: df
Out[26]:
  time ip  session_number
0  1.1  A               0
1  1.7  A               1
2  2.5  A               2
3  2.6  B               0
4  2.7  B               0
5  3.4  B               1

'ip'これで、グループ化および'session_number'(および各セッションの分析)ができるようになりました。

于 2013-07-09T12:39:21.263 に答える