連載
» 2013年07月16日 18時03分 公開

ログを分析するには? XMLデータを分析するには? pandasでデータを分析できる状態にするITエンジニアのためのデータサイエンティスト養成講座(4)(2/3 ページ)

[中林紀彦,日本アイ・ビー・エム]

形式を整えた時系列データ同士を結合する:pandas.merge

 期間をそろえたデータセット同士を結合するのがmerge関数です。ここではIn [18]In [19]で生成した2つのDataFrameを結合しています(In [20])。

 このケースでは2つのデータのインデックスをキーにして結合していますが、列をキーに指定して結合することもできます。また、リレーショナルデータベースのように、howオプションで'left'、'right'、'outer'、'inner'など結合方法を指定することもできます。

In [17]: # 2つのデータセット(DataFrame)の結合
In [18]: df_left = pd.DataFrame(df.actual.values, index=idx, columns=['actual'])
In [19]: df_right = pd.DataFrame(np.random.randn(len(idx)), index=idx, columns=['rand'])
In [20]: pd.merge(df_left, df_right, left_index=True, right_index=True).head(10)
Out[20]:
                     actual      rand
2013-01-01 00:00:00    2873  0.434061
2013-01-01 01:00:00    2716  1.215734
2013-01-01 02:00:00    2592 -0.054606
2013-01-01 03:00:00    2482 -0.165443
2013-01-01 04:00:00    2412  0.987701
2013-01-01 05:00:00    2405 -0.359786
2013-01-01 06:00:00    2499 -0.352796
2013-01-01 07:00:00    2646 -0.798894
2013-01-01 08:00:00    2778 -0.914047
2013-01-01 09:00:00    2773  0.973519

ランダムサンプリング:random.randint

 続いてデータをランダムにサンプリングして抽出する方法を紹介します。ここでは、pythonのrandom関数を使い、データ数の範囲内でランダムに100個の整数を発生させ(In [22])、データセットから100個のデータを抽出しています(In [24])。

In [21]: # サンプリング
In [22]: samples = np.random.randint(0, len(df), size=100)
In [23]: samples
Out[23]:
array([1305, 3811, 1906,  885,  983, 2114,  102, 3713, 1718, 2995, 1837,
        219, 2605, 3709, 1490, 3706,  130, 1788, 1347, 3327,  132, 1851,
        134, 3774, 3476, 3593, 1327, 1164, 2151, 2093, 1144, 3832, 2784,
        924, 2244, 2557, 2335,  359, 4036, 1780, 1016, 3752, 1371, 1680,
         75, 2647,   96,  784, 3876,  938,  378,  591, 1744,  748, 4079,
       3839, 2862,  901,  842, 1997,  697, 2442,  126,  733, 2552, 2042,
       3026, 3685,  383, 3453,  215,  393, 1198, 3338, 1141, 1852, 1441,
       1738, 4183, 1838,  128, 1980,  632,  141, 1012, 3000, 2615, 2498,
       3623,  713, 2683, 3862,  417, 2912, 3264, 1278, 1510, 3809,  753,
       3830])
In [24]: df.take(samples)
Out[24]:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 100 entries, 1305 to 3830
Data columns (total 3 columns):
date      100  non-null values
time      100  non-null values
actual    100  non-null values
dtypes: int64(1), object(2)
In [25]: df.take(samples).head(10)
Out[25]:
           date   time  actual
1305  2013/2/24   9:00    3442
3811   2013/6/8  19:00    3229
1906  2013/3/21  10:00    3382
885    2013/2/6  21:00    4096
983   2013/2/10  23:00    3281
2114  2013/3/30   2:00    2520
102    2013/1/5   6:00    2974
3713   2013/6/4  17:00    3461
1718  2013/3/13  14:00    3295
2995   2013/5/5  19:00    2866

データセットのリネーム:pandas.DataFrame.rename

 データセットの列名を変更することも可能です。pythonのrename関数を使って大文字や小文字にそろえたり(In [27]In [28])名称を変更する(In [29])こともできます。

In [26]: # 列名の変更
In [27]: df.rename(columns=str.upper)
Out[27]:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 4200 entries, 0 to 4199
Data columns (total 3 columns):
DATE      4200  non-null values
TIME      4200  non-null values
ACTUAL    4200  non-null values
dtypes: int64(1), object(2)
In [28]: df.rename(columns=str.lower)
Out[28]:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 4200 entries, 0 to 4199
Data columns (total 3 columns):
date      4200  non-null values
time      4200  non-null values
actual    4200  non-null values
dtypes: int64(1), object(2)
In [29]: df.rename(columns={'date' : 'd'})
Out[29]:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 4200 entries, 0 to 4199
Data columns (total 3 columns):
d         4200  non-null values
time      4200  non-null values
actual    4200  non-null values
dtypes: int64(1), object(2)

 ここまではCSVなどの形式で、整形済みのデータを扱うことを中心に説明してきましたが、OSのシステムログやWebのアクセスログなどは明確な区切り文字がなかったり、文字列を分解してテータを取り出す必要があります。次ページでは、形式が明確でないデータを分析できる状態にする方法を紹介していきます。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。