pythonメモ2 データ分析編

ipython

objectname?のようにはてなを最後につけて実行することで、オブジェクトの詳細が見れる。 objectname?? … さらに詳細に見れる またls やcdはそのまま使える

!cp a.txt b/のように、先頭に!を付けると内部でos.system()を読んでくれるので、シェルコマンドを直接実行できる。ただしnotebook中でcdpwdをしたいときは!cdではなく%cdでなくてはならない

files = !ls /usrのようにすると簡単にシステムコマンドのアウトプットをとれる

%edit … エディタを開いて編集

ipython serverのセットアップ

ここを参考にする

マジックコマンド

%quickref%magicですべてのマジックコマンドを表示 %を付けて実行すると、引数を関数の外に書くことができる。例


## 実行時間を計測
%timeit range(1000)

## %%にすると複数行にわたって書ける
%%timeit x = range(10000)
max(x)

%matplitlib inlineを実行して置かないとplotできないので注意

別のフォーマットへの変換

等がある。--post serveを末尾につけると自動でブラウザを開いてくれる RISEと呼ばれるパッケージを入れると、notebookの右上にボタンが出て、リアルタイムプレビューができるようになる

ベイジアン

変分ベイズならBayesPy、MCMCならStanがよさそう 最近はStanでも、共益事前分布の場合は勝手に変分近似してくれるらしい

BayesPy

python3のパッケージ。指数型分布族(ガウス、ガンマ、ディリクレなど)にしか使えないっぽい? もともと変分ベイズ用のパッケージは

等がある。

といったVBの拡張にも対応している

stan

.stanという拡張子でstanコードを書く。ガウス混合分布をフィッティングする例

data {
    int<lower=1> N;
    int<lower=1> k;
    real X[N];
}
parameters {
    simplex[k] theta;
    real mu[k];
}
model {
    real ps[k];
    for (i in 1:k){
        mu[i] ~ normal(0, 1.0e+2);  #事前分布として平均0、標準偏差100の事前分布を用いる。
    }
    for(i in 1:N){
        for(j in 1:k){
            ps[j] <- log(theta[j]) + normal_log(X[i], mu[j], 1.0);
        }
        increment_log_prob(log_sum_exp(ps));
    }
}

Stanコードには4つのブロックがある

numpy

線形のランダムノイズを載せた生成モデルからのデータを作るスクリプト

m_true = -0.954
b = true = 4.294
f_true = 0.534

N = 50
x = np.sort(10*np,.random.rand(N))
yerr = 0.1+0.5*np.random.rand(N)
y += m_true * x+b_true
y += np.abs(f_true * y) * np.random.randn(N)
y += yerr * np.random.randn(N)

スライスの挙動

通常のpythonと違い、代入もできる

ndarr1 = np.array([0, 1, 2, 3, 4, 5])
ndarr1[3:6] = [100., 200., 300.,]
print(ndarr1)
# => [0 1 2 100 200 300]

# スライスではなく数値を入れるとブロードキャストされる

ndarr1[3:5] = 20
print(ndarr1)
[0 1 2 20 20 5]

# スライスしたものを別の変数に入れると参照になり、元の配列の一部とつながる
# よってふくせいしたいときはcopy()メソッドを使用する
ndarr2 = ndarr1[3:5].copy()

scipy

stats

scipy.stats.norm … 正規分布の

matplotlib

pyplot

import numpy as np
import matplotlib.pyplot as plt

x = np.random.normal(size = 100)

plt.hist(x)
plt.title("Histgram")
plt.xlabel("x")
plt.ylabel("frequency")
plt.show()

plot.hist(x, normed = True)とすると縦軸が確率になる。bins=20で横幅調整 2つのヒストグラムを重ねるときは

x =  np.random.normal(10, 5, 100)
y = np.random.normal(20, 5, 100)

plt.hist(x, label = "x", bins = 20, range = (-10, 40),alpha = 0.5, color = "blue")
plt.hist(y, label = "y", bins = 20, range = (-10, 40), alpha = 0.5, color = "red")
plt.legend()
plt.show()

保存したい場合はplt.show()の代わりに、plt.savefig(”ファイル名.png”)を使う。ファイル名に拡張子が入っていると自動で判断して保存してくれる。

使用できる拡張子は emf, eps, jpeg, jpg, pdf, png, ps, raw, rgba, svg, svgz, tif, tiff

sshでログインしているときはエラーが出ないよう、以下のコードを書いておく

import matplotlib
matplotlib.use("Agg")

pandas

luigi

基本は以下の構成

class Task1(luigi.Task):
    param = luigi.Parameter(default=22)

    def requires(self):
        return []   # 一番最初のタスクは空リストを返す。

    def output(self):
        return luigi.LocalTarget('hoge.txt')    # 出力対象となるファイルを指定、S3Target 等もある

    def run(self):  # 出力先ファイルに書き込む
        with self.output().open('w') as f:
            for i in range(1, 11):
                f.write("{}\n".format(i))

if __name__ == "__main__"
    luigi.run()

このようなタスククラスをたくさん定義して走らせる。

luigi.Targetのサブクラスを作る必要は少なく、たいていはLocalTarget, HdfsTarget, s3.S3Target, contrib.ssh.RemoteTarget, contrib.ftp.RemoteTarget, contrib.mysqldb.MySqlTarget等で事足りる。

いずれもopen()メソッドをサポートしている

メソッド

Task.requires()

下記のいずれかを返す

ここでTargetクラスを返せないことに注意。

Tweet This Page
BTC address: 16BQGsTmsKtbMMT2Zwj4qNZnnAncnVCtWo
LTC address: LZuEiJecMZFN48k6jRhoRQZvH8VS1MBuGc