本記事の内容
- Pythonの基本
- 事前準備
- pipコマンド
- Jupyter Notebook
- ライブラリによる分析の実践
1. Pythonの基本
基本的な内容は以下ご参照
https://qiita.com/1429takahiro/items/710a877b1afb1626334f
2. 事前準備
検証用環境として、OSSのanacondaを利用
https://anaconda.org/
前提環境
(base) [takahiro@ITakahiro ~]$ python
Python 3.7.6 (default, Jan 8 2020, 13:42:34)
[Clang 4.0.1 (tags/RELEASE_401/final)] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
venv環境の作成
- venvとはPythonの仮想環境を作成する仕組みで、Pythonをインストールすると標準で利用できる。
- Pythonでは一つの環境に一つのバージョンのパッケージしかインストールできない為、複数のバージョンを使い分けることはできない。
- その為、複数のプロジェクトに参加している場合等、各プロジェクト毎に仮想環境を作成し、各プロジェクトで必要となるバージョンをパッケージを指定してインストールできる。
- これによって複数のバージョンのパッケージを使い分けできる。
venv環境の作成
# venv環境の作成(名前:venv-test)
[takahiro@localhost python]$ python -m venv venv-test
[takahiro@localhost python]$ ls -ltr
total 0
drwxr-xr-x 6 takahiro staff 192 8 1 14:10 venv-test
# [環境名/bin/activate]コマンドを実行すると仮想環境が有効化される
[takahiro@localhost python]$ source venv-test/bin/activate
(venv-test) [takahiro@localhost python]$ python -V
Python 3.7.6
# 作成した仮想環境のPythonが使われていることを確認
(venv-test) [takahiro@localhost python]$ which python
/Users/takahiro/python/venv-test/bin/python
# 仮想環境を抜ける(無効化する)
(venv-test) [takahiro@localhost python]$ deactivate
[takahiro@localhost python]$
# 元のanacondaのPythonを使っていることを確認
[takahiro@localhost python]$ which python
/Users/takahiro/opt/anaconda3/bin/python
# 仮想環境が不要になった場合はディレクトリを削除
[takahiro@localhost python]$ rm -rf ./venv-test
[takahiro@localhost python]$
3. pipコマンド
- pipコマンドはPythonにサードパーティ製のパッケージをインストールする為のコマンド
- 依存関係のあるパッケージも自動的にインストールする(Linuxのyum同等)
- 通常以下サイトよりダウンロードして利用するがanacondaはデフォルトでインストール済
The Python Package Index (PyPI)
https://pypi.org/
pip動作確認
# pipテスト用の仮想環境を作成
[takahiro@localhost python]$ python -m venv pip-test
[takahiro@localhost python]$ source ./pip-test/bin/activate
(pip-test) [takahiro@localhost python]$
# pipコマンドのバージョンの確認
(pip-test) [takahiro@localhost python]$ pip -V
pip 19.2.3 from /Users/takahiro/python/pip-test/lib/python3.7/site-packages/pip (python 3.7)
# pipコマンドのバージョンの最新化
(pip-test) [takahiro@localhost python]$ pip install --upgrade pip
Collecting pip
Using cached https://files.pythonhosted.org/packages/36/74/38c2410d688ac7b48afa07d413674afc1f903c1c1f854de51dc8eb2367a5/pip-20.2-py2.py3-none-any.whl
Installing collected packages: pip
Found existing installation: pip 19.2.3
Uninstalling pip-19.2.3:
Successfully uninstalled pip-19.2.3
Successfully installed pip-20.2
(pip-test) [takahiro@localhost python]$ pip -V
pip 20.2 from /Users/takahiro/python/pip-test/lib/python3.7/site-packages/pip (python 3.7)
# numpyパッケージのインストール
(pip-test) [takahiro@localhost python]$ pip install numpy
Collecting numpy
Using cached numpy-1.19.1-cp37-cp37m-macosx_10_9_x86_64.whl (15.3 MB)
Installing collected packages: numpy
Successfully installed numpy-1.19.1
# インストールされたnumpyパッケージがimportできるか確認
(pip-test) [takahiro@localhost python]$ python
Python 3.7.6 (default, Jan 8 2020, 13:42:34)
[Clang 4.0.1 (tags/RELEASE_401/final)] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> exit()
# numpyパッケージのアンインストール
(pip-test) [takahiro@localhost python]$ pip uninstall numpy
Found existing installation: numpy 1.19.1
Uninstalling numpy-1.19.1:
Would remove:
/Users/takahiro/python/pip-test/bin/f2py
/Users/takahiro/python/pip-test/bin/f2py3
/Users/takahiro/python/pip-test/bin/f2py3.7
/Users/takahiro/python/pip-test/lib/python3.7/site-packages/numpy-1.19.1.dist-info/*
/Users/takahiro/python/pip-test/lib/python3.7/site-packages/numpy/*
Proceed (y/n)? y
Successfully uninstalled numpy-1.19.1
(pip-test) [takahiro@localhost python]$
# numpyパッケージのアンインストール後にimportできないことを確認
(pip-test) [takahiro@localhost python]$ python
Python 3.7.6 (default, Jan 8 2020, 13:42:34)
[Clang 4.0.1 (tags/RELEASE_401/final)] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'numpy'
>>>
pipコマンドチートシート
pipコマンドチートシート
# パッケージのインストール
(pip-test) [takahiro@localhost python]$ pip install numpy
# パッケージのアンインストール
(pip-test) [takahiro@localhost python]$ pip uninstall numpy
# パッケージのバージョンを指定したインストール
(pip-test) [takahiro@localhost python]$ pip install numpy==1.14.1
# 「requirements.txt」を利用したパッケージのインストール
(pip-test) [takahiro@localhost python]$ pip install -r requirements.txt
# パッケージの最新版へのアップデート
(pip-test) [takahiro@localhost python]$ pip install -U numpy
# パッケージ一覧の取得
(pip-test) [takahiro@localhost python]$ pip list
# 新いバージョンの存在するパッケージ一覧の取得
(pip-test) [takahiro@localhost python]$ pip list -o
- 複数の環境でパッケージとバージョンを統一する方法
- 基準となる環境で「pip freeze(*)」コマンドの結果を「requirements.txt」に書き出す
- 「requirements.txt」を共有する
- バージョンを合わせたい別の環境で「requirements.txt」を使ってパッケージをインストールする
(*)pip freezeコマンド:インストールされているパッケージの一覧を出力するコマンド
動作確認
# 「numpy」「pandas」パッケージをインストール
(pip-test) [takahiro@localhost python]$ pip install numpy pandas
Requirement already satisfied: numpy in ./pip-test/lib/python3.7/site-packages (1.19.1)
Collecting pandas
Downloading pandas-1.1.0-cp37-cp37m-macosx_10_9_x86_64.whl (10.4 MB)
|████████████████████████████████| 10.4 MB 2.7 MB/s
Collecting python-dateutil>=2.7.3
Using cached python_dateutil-2.8.1-py2.py3-none-any.whl (227 kB)
Collecting pytz>=2017.2
Using cached pytz-2020.1-py2.py3-none-any.whl (510 kB)
Collecting six>=1.5
Using cached six-1.15.0-py2.py3-none-any.whl (10 kB)
Installing collected packages: six, python-dateutil, pytz, pandas
Successfully installed pandas-1.1.0 python-dateutil-2.8.1 pytz-2020.1 six-1.15.0
# 「pip freeze」コマンドの結果を「requirements.txt」に保存
(pip-test) [takahiro@localhost python]$ pip freeze > requirements.txt
# 「requirements.txt」の内容の確認(これは、requirementsフォーマット呼ばれている)
(pip-test) [takahiro@localhost python]$ cat requirements.txt
numpy==1.19.1
pandas==1.1.0
python-dateutil==2.8.1
pytz==2020.1
six==1.15.0
# 別の仮想環境を利用する為一旦deactivate
(pip-test) [takahiro@localhost python]$ deactivate
[takahiro@localhost python]$
# 新い仮想環境「pip-test2」の作成とインストール前のパッケージの確認
[takahiro@localhost python]$ python -m venv pip-test2
[takahiro@localhost python]$ source ./pip-test2/bin/activate
(pip-test2) [takahiro@localhost python]$ pip freeze
(pip-test2) [takahiro@localhost python]$
# 「requirements.txt」を利用したパッケージのインストール
(pip-test2) [takahiro@localhost python]$ pip install -r requirements.txt
Collecting numpy==1.19.1 (from -r requirements.txt (line 1))
Using cached
〜中略〜
(pip-test2) [takahiro@localhost python]$
# インストール後のパッケージの確認(前の環境と同じパッケージが同じバージョンでインストールされている)
(pip-test2) [takahiro@localhost python]$ pip freeze
numpy==1.19.1
pandas==1.1.0
python-dateutil==2.8.1
pytz==2020.1
six==1.15.0
4. Jupyter Notebook
- Jupyter NotebookはOSSのデータ分析、可視化、機械学習等に広く利用されているツール
- Webアプリとして提供され、Webブラウザ上で各種プログラムの実行と、結果の参照、ドキュメントの作成が行える
JupyterNotebook環境の準備
# Jupyter Notebook用の仮想環境の作成
[takahiro@localhost python]$ python -m venv pydata
[takahiro@localhost python]$ source pydata/bin/activate
(pydata) [takahiro@localhost python]$
# Jupyter Notebookのインストール
(pydata) [takahiro@localhost python]$ pip install jupyter
Collecting jupyter
Downloading https://files.pythonhosted.org/packages/83/df/0f5dd132200728a86190397e1ea87cd76244e42d39ec5e88efd25b2abd7e/jupyter-1.0.0-py2.py3-none-any.whl
Collecting jupyter-console (from jupyter)
〜中略〜
(pydata) [takahiro@localhost python]$
JupyterNotebookの起動
(pydata) [takahiro@localhost python]$ jupyter notebook
[I 15:25:37.359 NotebookApp] Writing notebook server cookie secret to /Users/takahiro/Library/Jupyter/runtime/notebook_cookie_secret
[I 15:25:38.553 NotebookApp] JupyterLab extension loaded from /Users/takahiro/opt/anaconda3/lib/python3.7/site-packages/jupyterlab
[I 15:25:38.553 NotebookApp] JupyterLab application directory is /Users/takahiro/opt/anaconda3/share/jupyter/lab
[I 15:25:38.557 NotebookApp] Serving notebooks from local directory: /Users/takahiro/python
[I 15:25:38.557 NotebookApp] The Jupyter Notebook is running at:
[I 15:25:38.557 NotebookApp] http://localhost:8888/?token=d1d0e18691ec77c68d7b0145b7be608f62d29a2aa372111e
[I 15:25:38.557 NotebookApp] or http://127.0.0.1:8888/?token=d1d0e18691ec77c68d7b0145b7be608f62d29a2aa372111e
[I 15:25:38.557 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 15:25:38.564 NotebookApp]
To access the notebook, open this file in a browser:
file:///Users/takahiro/Library/Jupyter/runtime/nbserver-89223-open.html
Or copy and paste one of these URLs:
http://localhost:8888/?token=d1d0e18691ec77c68d7b0145b7be608f62d29a2aa372111e
or http://127.0.0.1:8888/?token=d1d0e18691ec77c68d7b0145b7be608f62d29a2aa372111e
以下のURLでWebブラウザでJupyter Notebookが起動する
http://localhost:8888/tree
[New] -> [Python3]
以下の通りPythonのプログラムが実行可能
[Shift] + [Enter] でプログラム実行
5. ライブラリによる分析の実践
事前準備
必要なパッケージのインストール
# 必要なパッケージのインストール
(pydata) [takahiro@localhost python]$ pip install numpy scipy pandas matplotlib scikit-learn
# pandasが各種データを入出力する為に使用するパッケージをインストール
(pydata) [takahiro@localhost python]$ pip install xlrd openpyxl lxml
NumPy
- NumPyはPythonのサードパーティ製パッケージで、配列や行列を効率よく扱える
- NumPyには配列用の型である「ndarray」と、行列用の型である「matrix」がある
- 配列や行列の要素のデータ型は一種類に揃える必要がある
- 「int16」「float32」等、NumPy由来の専用の数値型を指定する
1次元配列の扱い
2次元配列の扱い
次元の変形
- reshape -> reshape(a, b):a × b行列の配列に変換
- ravel - > x.ravel():多次元のリストを1次元にして返す(参照を返す -> 元の配列が変わる)
- flatten -> x.flatten():多次元のリストを1次元にして返す(コピーを返す -> 元の配列は変わらない)
データ型
- x.dtype -> データ型の確認
- np.array([a, b], dtype=np.int16) -> データ型を宣言した配列の作成
- x.astype(np.float16) -> データ型の変換
インデックスとスライス
- 評価方法はPythonのインデックスとスライシングの通り
- データの再代入も可能(a[2] = 4 など)
数列を返す関数(arange)
- np.arange(n) -> 0〜n-1までのn個の整数を配列として生成
- np.arange(n, p) -> n〜p-1までの配列を生成
- np.arange(n, p, q) -> n〜p-1までqの間隔で配列を生成
乱数
- np.random.random((n, p)) -> 行と列のタプルを渡すと0以上、1未満の範囲の乱数の2次元配列を生成する
- np.random.seed(n) -> 本来乱数は毎回異なる値が生成されるが、シード値を固定すると結果が固定される
- np.random.rand(n, p) -> 生成される乱数はnp.random.randomと同様だが、np.random.randは二つの引数で形状を渡す。
- np.random.randint(n, p) -> n以上、p未満の整数の中から一つの整数を出力
- np.random.randint(n, p, (x, y)) -> n以上、p未満の整数の中から一つの整数をx行y列形式で生成する
- np.random.uniform(a, b, size=(c, d)) -> a以上、b未満のランダムな小数値を、c行d列形式で生成する
- 上記のa,bのデフォルト値は、a=0.0 , b=1.0となる
- np.random.randは一様乱数(範囲からランダムに値を抽出)に従い生成される
- np.random.randnは標準正規分布に従い、平均0、分散1の分布で出力される
同じ要素の配列の作成
- np.zoros(n) -> n個の要素数の0.0が入った配列を生成
- np.zeros((n, p)) -> n行p列の2次元配列を生成
- np.ones(n) -> n個の要素数の1.0が入った配列を生成
- np.ones((n, p)) -> n行p列の2次元配列を生成
単位行列
- np.eye(n) -> nの対角要素を持った単位行列の作成
- 単位行列 -> 要素Nに対し、右から掛けても左からかけてもNとなる行列
指定値で埋める
- np.full(n, p) -> pの数値で、n個の要素の配列を生成
- np.full((n, p), q) -> qの数値で、n行p列の配列を生成
- np.nan -> Not a Numberの短縮型、数値ではないことを宣言しているが、データ型としては、floatに分類
- NumPyのndarrayは、同じデータ型のみ格納でき、Noneや空文字では、計算不可能となってしまう為、np.nanを特殊な定数として利用する
指定範囲で均等割データを作る
- linspace(a, b, c) -> a〜bまでを等間隔に区切ったcつの要素の配列を生成
要素間の差分
- np.diff(n) -> 配列nの要素間の差分を配列として返す
連結
- np.concatenate(a, b) -> aとbを結合した配列を生成
- np.concatenate([a, b], axis=0) -> aとbを行方向に結合(axis=0)
- np.concatenate([a, b], axis=1) -> aとbを列方向に結合(axis=1)
- np.vstack([a, b]) -> aとbを行方向に結合
- np.hstack([a, b]) -> aとbを列方向に結合
分割
- np.hsplit(a, [n]) -> 配列aを列の途中(一つ目の配列をn列)で分割
- np.vsplit(a, [n]) -> 配列aを行の途中(一つ目の配列をn行)で分割
転置
- 転置 -> 2次元配列の行と列を入れ替えること
- a.T -> 配列aを転置(行と列を入れ替える)
次元追加
- a[np.newaxis, :] -> 配列aを2次元配列にする(行方向を指定するスライシングに、np.newaxisを指定)
- a[:, np.newaxis] -> 配列aの行を追加する(列方向を指定するスライシングに、np.newaxisを指定)
- []によるインデックスの中でnp.newaxisを使うとその位置にサイズが1の新たな次元が追加される
グリッドデータの生成
- meshgrid関数は、2次元上の点に対応する等高線やヒートマップ等を描く時に使用する
- x座標、y座標の配列から、それらを組み合わせてできる全ての点の座標データを生成する
- np.meshgrid(m, n) -> mとnを行方向と列方向に方眼状(グリッド)のデータを生成する
- 第一戻り値であるxxに、第一引数のmを行方向に、第二引数nの配列の長さ分コピーされる
- 第二戻り値であるyyに、第二引数のnを列方向に、第一引数mの配列の長さ分コピーされる
NumPyの各機能
必要となる配列の準備
データ準備
import numpy as np
a = np.arange(3)
b = np.arange(-3, 3).reshape((2, 3))
c = np.arange(1, 7).reshape((2, 3))
d = np.arange(6).reshape((3, 2))
e = np.linspace(-1, 1, 10)
print("a:", a)
print("b:", b)
print("c:", c)
print("d:", d)
print("e:", e)
ユニバーサルファンクション
- ユニバーサルファンクションは、NumPyの協力なツールの一つ。
- 配列要素内のデータを一括で変換してくれる。
ブロードキャスト
- ユニバーサルファンクションと同様に配列の内部データに直接演算が行えるツール。
ドット積
判定・論理値
関数とメソッド
pandas
- pandasは、Pythonでのデータ分析のツールとして活用され、データの入手や加工等の処理に使われる。
- pandasは、NumPyを基盤に「シリーズ(Series)」と「データフレーム(DataFrame)」というデータ型を提供。
Seriesとは
- Seriesは一次元データ。
DataFreameとは
- DataFrameは二次元データ。
15行目以降は省略 |
データの抽出
データの読み込み・書き込み
CSVの読み込み
Excelの読み込み
WebサイトのHTMLから表を取得
- WebサイトのHTML内のtable要素から直接、DataFrameに取り込むことが可能。
- 日本語版Wikipediaの「トップレベルドメイン一覧」から「国別コードトップレベルドメイン」の表を抜き出し。
データの書き込み:CSV
write_data.csv
[takahiro@localhost output]$ head -20 write_data.csv
,Name,Entity,Explanation,Notes,IDN,DNSSEC,SLD,IPv6
0,.ac,アセンション島,,広く学術的なサイト(大学など)のために用いられる。アセンション島はイギリス領であるが、イギリスの公式の学術的なサイトのためのドメイン .ac.uk とは別である。,Yes,Yes,Yes,Yes
1,.ad,アンドラ,,アンドラにおける商標または市民権が必要となる[6][7]。,,Yes,Yes,
2,.ae,アラブ首長国連邦,,,,No,Yes,
3,.af,アフガニスタン,,,,Yes,Yes,
4,.ag,アンティグア・バーブーダ,,AGがドイツの株式会社(Aktiengesellschaft)の略称であることから、非公式にドイツの企業で用いられる。,,Yes,Yes,
5,.ai,アンギラ,,,,No,Yes,
6,.al,アルバニア,,かつては市民権が必要だったが、今は必要ない。,,No,Yes,
7,.am,アルメニア,,非公式にAMラジオ局やWebラジオ局で使用されている。,No,Yes,Yes,Yes
8,.an,オランダ領アンティル,,現地に在住・存在している必要がある。オランダ領アンティルは2010年10月10日に解体された。,,No,Yes,
9,.ao,アンゴラ,,,,No,不明,
10,.aq,南極,Antarctique,南極条約により南緯60度以南と定義されている。南極条約の調印国である政府組織と、南極大陸に実際に存在している団体が利用できる。,,No,Yes,
11,.ar,アルゼンチン,,,スペイン語[cctld 1],Yes,No,Yes
12,.as,アメリカ領サモア,,非公式にスペインのアストゥリアス州関連のサイトも使用している。,Yes,No,Yes,
13,.at,オーストリア,,,,Yes,Yes,
14,.au,オーストラリア,,登録はオーストラリア人に限られ、最低2年間は登録を維持しなければならない[8]。アシュモア・カルティエ諸島と珊瑚海諸島を含む。,,Yes,No,
15,.aw,アルバ,"Aruba, West Indies",アルバの企業・団体・市民に限る。,,Yes,Yes,
16,.ax,オーランド諸島,,オーランドの企業・団体・市民に限る。,,No,Yes,
17,.az,アゼルバイジャン,,,,No,Yes,
18,.ba,ボスニア・ヘルツェゴビナ,,,,No,Yes,
[takahiro@localhost output]$
データの書き込み:Excel
参考文献