原題は "Python for Data Analysis"。
データファイルや関連する素材は下記の GitHub リポジトリに置かれている。
https://github.com/wesm/pydata-book/
本書は、私には難しい。
よく使われるモジュールには慣習的な命名規則があるという。
import numpy as np import matplotlib.pyplot as plt import pandas as pd import seaborn as sns import statsmodels as sm
このようにはっきり書かれた書籍はなかった。ありがたい。以下、この書評でも、 上記命名規則に従ってモジュールが命名されているとする。
Datetime フォーマット一覧が 表2-5 にある。抜粋すると次の通り。
タイプ | 定義 |
---|---|
%Y | 年(4桁表記) |
%y | 年(2桁表記) |
%m | 月(2桁表記)[01,12] |
%d | 日(2桁表記)[01,12] |
%F | %Y-%m-%d のショートカット(別名)。例:2012-4-18 |
%D | %m/%d/%y のショートカット(別名)。例:04/18/12 |
これを見てみると、%F の例がおかしいような気がする。正しくは 2012-04-18 ではないだろうか。 実験した。なお、特機なき限り実験は WSL (Windows Subsystem for Linux) 20.04 の ipython 7.16.1 を使っている。
In [2]: from datetime import datetime In [3]: dt = datetime(2012, 4, 18) In [4]: dt.strftime('%F') Out[4]: '2012-04-18'
やはり、2012-04-18 が正しい。
3.2.6.2 に itertools モジュールがある。組み合わせや順列、直積などが扱える標準ライブラリだ。 現代的な言語は、こういったものがモジュールとして提供されていて、 ジェネレータとして使いやすくなっていることを実感した。
p.132 では、ある種の統計量に対して argmax を用いる方法が紹介されている。 本文では、次のように述べられている。
一点だけ、argmax を用いる方法が常に最適ではないことに注意してください。 argmax を呼び出すと配列要素の全スキャンが発生します。 今回の例では、配列の要素の最大値が True であると事前にわかっていました。 このため True が見つかった時点で処理を中断でき、全スキャンの必要はありませんでした。
では、この場合、どのようにすればよかったのだろうか。Numpy の関数でこの場面で適切な関数がないか、 見てみたが、私にはわからなかった。argmax は次のように使われている。
In [257]: (np.abs(walk) >= 10).argmax() Out[257]: 37
これは NumPy での文法である。これが素の Python ならば、index というメソッドがあって、 引数に合致するインデックスを返すのだが、 NumPy の index メソッドはそのようなことをしない。
p.138 の例を試してみた。ディクショナリを pandas に渡すと、作成されるシリーズのインデックスは、 ソートされたディクショナリのキーの順になるのは確認した。 この順番を変えようと思って、本書の通り、 ディクショナリのキーをシリーズの中で並べたい順番に並べて渡したが、その順番にならなかった。
In [12]: sdata={'Ohio':35000, 'Texas':71000,'Oregon':16000,'Utah':5000} In [13]: states={'Califolnia', 'Ohio', 'Oregon', 'Texas'} In [14]: obj4 = pd.Series(sdata, index=states) In [15]: obj4 Out[15]: Texas 71000.0 Ohio 35000.0 Oregon 16000.0 Califolnia NaN dtype: float64
6.1 はテキスト形式のデータの読み書きである。XML の読み書きも当然含まれているのだが、 日本の官公庁は XML でのデータ提供をしているのだろうかと思って e-stat (https://www.e-stat.go.jp) を見てみたら、どうやら XML でのダウンロードはサポートされていない(以前はされていたようだ)。 ダウンロード形式は csv または xlsx (マイクロソフトの Excel のフォーマット)に限られているようなのだ。 がっかりした。
それでも他に統計がないか見てみると、 財務省貿易統計報道発表資料(https://www.customs.go.jp/toukei/shinbun/happyou.htm) は、データが XML として蓄積されている。これらの XML は WEB でクリックすると見える。 上記資料の一覧は西暦表示されているのに、個別のデータはすべて元号表記であった。 元号表記すると、時系列データとしてデータを加工する手間が必要なので、生産性が落ちるだろう。 政治思想として元号表記が必要という人は一定数いるだろうが、 この元号表記のために日本の生産性が落ちていることについてどのような見解を持っているのだろうか。
p.199 以降「列指向の形式」という言い回しが頻出する。この列指向とはどういうことかと思ったが、 データフレームの列をひとまとめにして扱いやすい、という意味と理解しておく。
p.200 では、HDF5 形式が述べられている。頭の片隅に置いておく。
p.348 に誤植がある。下から 1/4 ほど、「timedelata や、timedelta を何倍かしたもの」 とあるが、正しくは、「timedelta や、timedelta を何倍かしたもの」 だろう。
p.348 を自分の環境で試してみた。結果が少し異なる。
In [5]: delta = datetime(2011,1,7) - datetime(2008,6,24,8,15) In [6]: delta Out[6]: datetime.timedelta(days=926, seconds=56700)
本書では下記の通り。
Out[15]: datetime.timedelta(926, 56700)
p.351 の pd.isnull(idx) の結果表示が本書とは異なる。
In [36]: pd.isnull(idx) Out[36]: array([False, False, True])
本書では下記の通り。
Out[38]: array([False, False, True], dtype=bool)
11.5.2 は四半期の頻度という項である。pp.373-375 にわたって記載がある。pandas では、
p = pd.Period('2012Q4', freq='Q-JAN')
のようにパラメータ freq に会計年度の末月を指定することで、具体的に指す月を指定することができる。
p.374 の「図 11-2 異なる四半期頻度」を見る。この図は、freq の文字列と2012年の各月との対応を示している。
freq に 'Q-DEC' を指定した場合、'2012Q4' が指すのは 2012 年の 10 月、11 月、12 月である。
一方、freq に 'Q-FEB' を指定した場合、'2012Q4' が指すのは、2012 年の 1 月と 2 月である。では、
2012 年の 3 月はどうなっているかというと、これは期間 '2013Q1' を意味している。
これは注意しないといけない。
というのも、日本の多くの会社では、会計年度を当年 4 月から翌年 3 月としていること、 かつ、この会計年度で 2012年度第 4 四半期といったとき、期間が 2013 年 1 月 1 日から 2013 年 3 月 31 日を指すからだ。 一方、以下に示すように pandas では、'2012Q4' は期間が 2012 年 1 月 1 日から 2012 年 3 月 31 日までとなっている。
In [4]: p=pd.Period('2012Q4', freq='Q-MAR') In [5]: p Out[5]: Period('2012Q4', 'Q-MAR') In [6]: p.asfreq('D', 'start') Out[6]: Period('2012-01-01', 'D') In [7]: p.asfreq('D', 'end') Out[7]: Period('2012-03-31', 'D')
書名 | Python によるデータ分析入門 第2版 |
著者 | Wec McKinney |
訳者 | 瀬戸山 雅人、 小林 儀匡、滝口 開資 |
発行日 | 2018 年 7 月 24 日 初版第1刷 |
発行所 | オライリー・ジャパン |
発売元 | オーム社 |
定価 | 3800 円(税別) |
サイズ | 版 |
ISBN | 978-4-87311-845-1 |
その他 | 越谷市立図書館で借りて読む |
まりんきょ学問所 > コンピュータの部屋 > コンピュータの本 > Python > Wec McKinney : Python によるデータ分析入門