ここでは、pythonを使ってデータを取り扱う方法をまとめます。
使用するパッケージは、以下の3つです。
パッケージを使用するには、import文やfrom文を使ってインポートする必要があります。
|
自然な流れとして、「なぜExcelではなく、pythonを使うのか」という疑問が湧いてくるでしょう。
何でもできそうなExcelにも弱点があります。その大きなものは、カラム数の制限です。 大量のデータを処理するには、Excelのカラム数では不十分なのです。
pandasパッケージでは、様々なタイプのデータを取り扱うことができます。主に以下の3つのデータの取り扱い方を説明します。
最初にCSVファイルを読み込む例を示します。読み込みファイルは、ローカルのファイル、ネットワークで公開されているファイルの両方を指定することができます。
CSVのファイル読み込みには、read_csv関数を使用します。この関数の戻り値は、pandasのデータフレームです。
<class 'pandas.core.frame.DataFrame'> <class 'pandas.core.frame.DataFrame'> |
読み込んだデータがどのような物なのかその素性をしるために、info、describe関数を使用します。
info関数では、dには100個のレコードが入っており、x, y, fの3つのカラムからできており、xが整数、yは実数、fにはオブジェクトが入っており、欠損値(null)はないことが分かります。
<class 'pandas.core.frame.DataFrame'> Int64Index: 100 entries, 0 to 99 Data columns (total 3 columns): y 100 non-null int64 x 100 non-null float64 f 100 non-null object dtypes: float64(1), int64(1), object(1) memory usage: 3.1+ KB <class 'pandas.core.frame.DataFrame'> Int64Index: 100 entries, 0 to 99 Data columns (total 3 columns): y 100 non-null int64 x 100 non-null float64 f 100 non-null object dtypes: float64(1), int64(1), object(1) memory usage: 3.1+ KB |
このデータは、「データ解析のための統計モデリング入門」から引用しており、x, y, fは、以下の様な意味を持っています。
describe関数では、各カラム毎に個数、平均、標準偏差、最小値、25%、50%、75%の値、最大値が表示されます。
y x count 100.000000 100.000000 mean 7.830000 10.089100 std 2.624881 1.008049 min 2.000000 7.190000 25% 6.000000 9.427500 50% 8.000000 10.155000 75% 10.000000 10.685000 max 15.000000 12.400000 y x count 100.000000 100.000000 mean 7.830000 10.089100 std 2.624881 1.008049 min 2.000000 7.190000 25% 6.000000 9.427500 50% 8.000000 10.155000 75% 10.000000 10.685000 max 15.000000 12.400000 |
実際にdにどのような値が入っているか調べるには、最初のn個を表示するhead、最後のn個を表示するtailが便利です。
/usr/local/sage-6.7/local/lib/python2.7/site-packages/pandas-0.15.2-py2.\ 7-linux-x86_64.egg/pandas/core/index.py:687: FutureWarning: slice indexers when using iloc should be integers and not floating point "and not floating point",FutureWarning) y x f 0 6 8.31 C 1 6 9.44 C 2 6 9.50 C /usr/local/sage-6.7/local/lib/python2.7/site-packages/pandas-0.15.2-py2.7-linux-x86_64.egg/pandas/core/index.py:687: FutureWarning: slice indexers when using iloc should be integers and not floating point "and not floating point",FutureWarning) y x f 0 6 8.31 C 1 6 9.44 C 2 6 9.50 C |
pandasのデータフレームから特定のカラムや行を取り出す方法を以下に示します。
カラムの指定方法は、2通りあります。
データフレーム.カラム名
データフレーム['カラム名']
0 6 1 6 2 6 3 12 4 10 Name: y, dtype: int64 0 6 1 6 2 6 3 12 4 10 Name: y, dtype: int64 0 6 1 6 2 6 3 12 4 10 Name: y, dtype: int64 0 6 1 6 2 6 3 12 4 10 Name: y, dtype: int64 |
特定の行を取り出す場合には、ixを使って以下の様に指定します。
データフレーム.ix[行番号]
y 6 x 8.31 f C Name: 0, dtype: object y 6 x 8.31 f C Name: 0, dtype: object |
データを可視化して、データの分布をみてみましょう。データの可視化には、ggplotパッケージを使用します。ggplotは、Rのggplot2と同様の機能をpythonで使えるようにしたもので、今も開発が進んでいます。
ggplotでの図化は、ggplot関数に表示したい図を足し込んでいきます。
以下の例では、ggplotで、データフレームとx軸要素、y軸要素を指定し、geom_point関数で散布図を指定し、print関数で表示すると図化されます。
<ggplot: (8767854380393)> <ggplot: (8767854380393)> |
ggsave関数を使って表示された図をファイルに保存します。(sageではggsaveしないと表示されません)
Saving 11.0 x 8.0 in image. Saving 11.0 x 8.0 in image. |
fのタイプ(C, T)別にグラフを分けて表示するもの、facet_wrap関数を足すだけでできてしまいます。
<ggplot: (8767854380397)> <ggplot: (8767854380397)> |
Saving 11.0 x 8.0 in image. Saving 11.0 x 8.0 in image. |
一番よく使うのは、プロットするときにf毎に色分けする方法です。
ggplotでは、aesのcolor属性に色別に使うカラム名を指定することで、カラム毎の色分けプロットができます。
<ggplot: (8767854296293)> <ggplot: (8767854296293)> |
Saving 11.0 x 8.0 in image. Saving 11.0 x 8.0 in image. |
データフレームを使うとデータの加工がとても簡単にできます。 以下の様な処理も一行でできてしまいます。
データの絞り込みは、以下の形式で実行します。
データフレーム[絞り込み条件]
例として、施肥のあるものd.fがTの物だけを取り出すには、以下の様にd[d.f == 'T']とするだけです。
y x f 50 14 10.14 T 51 6 9.05 T 52 7 9.89 T 53 9 8.76 T 54 6 12.04 T y x f 50 14 10.14 T 51 6 9.05 T 52 7 9.89 T 53 9 8.76 T 54 6 12.04 T |
y x f 0 6 8.31 C 1 6 9.44 C 2 6 9.50 C 3 12 9.07 C 4 10 10.16 C y x f 0 6 8.31 C 1 6 9.44 C 2 6 9.50 C 3 12 9.07 C 4 10 10.16 C |
groupbyを使った集計の例として、種子数y毎の度数を計算してみましょう。
size関数を使うと、groupbyで指定されたレコードの数が返されます。
y 2 1 3 2 4 3 5 4 6 10 7 1 8 5 9 8 10 9 11 4 12 3 dtype: int64 y 2 1 3 2 4 3 5 4 6 10 7 1 8 5 9 8 10 9 11 4 12 3 dtype: int64 |
集計結果をggplotのヒストグラムと比較してみましょう。
ヒストグラムの追加は、geom_histogram関数で行い、binwidth=1と指定することで、yを幅=1で集計します。fill='grey'で塗りつぶしの色をグレイに指定しています。
<ggplot: (8767853573597)> <ggplot: (8767853573597)> |
Saving 11.0 x 8.0 in image. Saving 11.0 x 8.0 in image. |
集計関数の例として、y毎の平均を出してみます。これも一行で計算できます。
x y 2 9.430000 3 8.730000 4 9.273333 5 8.282500 6 9.945000 7 9.450000 8 10.596000 9 10.088750 10 9.745556 11 10.012500 12 10.730000 x y 2 9.430000 3 8.730000 4 9.273333 5 8.282500 6 9.945000 7 9.450000 8 10.596000 9 10.088750 10 9.745556 11 10.012500 12 10.730000 |
pandasのデータフレームでは、データを他の形式で書き出すことができます。
例として、d_C_meanのデータフレームをExcel形式のファイルに出力してみます。
Excelでは、Excelのブック形式のファイルに複数のシートを保存することができ、データフレームはシート単位に保存されます。
最初にExcelWriterを作成し、このwriterを使ってd_C_meanを"mean"というシート名で保存します。
|
sageでは、作成されたExcelファイルtest.xlsがDATAフォルダーに保存され、dataメニューから作成されたtest.xlsをダウンロードできます。
ダウンロードしたtest.xlsを開くと、以下の様に表示されます。
sageには、sqliteというデータベースが入っていますが、日付の扱いが特殊なので、ここではMySQLを使ってpandasのデータベース連携機能を説明します。
このWindows版sageには、MySQLを別途インストールしてあり、sagedbデータベース, sageユーザもセットしてあります。
MySQLをpythonから使うには、以下のインポート文が必要です。
|
データベースを使うためには、データベースに接続する必要があります。また、最後には接続conのクローズも必要です。
0L 0L |
先に、CSVファイルから読み込んだデータフレームdをテーブルt_dに挿入してみます。
|
準備ができたので、テーブルt_dから種子数y毎の頻度をSQLを使って計算してみます。
SQL文は、以下のようにします。
SELECT y, count(y) AS cnt_y FROM t_d GROUP BY y;
注意する点は、count(y)などの集計されたカラムに必ず名前を付けておくことです。ここでは、cnt_yとしました。 このようにすることで、結果として返されたデータフレームresult_1で集計値を簡単に参照することができます。
y cnt_y 0 2 1 1 3 3 2 4 5 3 5 9 4 6 20 0 1 1 3 2 5 3 9 4 20 Name: cnt_y, dtype: int64 y cnt_y 0 2 1 1 3 3 2 4 5 3 5 9 4 6 20 0 1 1 3 2 5 3 9 4 20 Name: cnt_y, dtype: int64 |
|
|