MatPlotLib


%matplotlib inline

from scipy.stats import norm
import matplotlib.pyplot as plt
import numpy as np

x = np.arange(-3, 3, 0.001)

plt.plot(x, norm.pdf(x))
plt.show()

#ファイルに保存
plt.plot(x, norm.pdf(x))
plt.plot(x, norm.pdf(x, 1.0, 0.5))
plt.savefig('MyPlot.png', format='png')

#軸の調整
axes = plt.axes()
#軸の範囲
axes.set_xlim([-5, 5])
axes.set_ylim([0, 1.0])
#軸の目盛り
axes.set_xticks([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5])
axes.set_yticks([0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0])
#グリッドの追加
axes.grid()

#ラベル
plt.xlabel('Greebles')
plt.ylabel('Probability')

#凡例 loc=4は右下
plt.legend(['Sneetches', 'Gacks'], loc=4)
#線の種類
#bは青、-はソリッド
#rは赤、:は点線
plt.plot(x, norm.pdf(x), 'b-')
plt.plot(x, norm.pdf(x, 1.0, 0.5), 'r:')


plt.show()

numpy財務計算



現在価値
n年後に受け取るX円の現在価値、割引率r%
X/(1+r%)**n
5年後にもらえる100万円の現在価値、(国債などの利率0.8%)
>>> np.pv(0.008, 5, 0, -100)
96.094236264559825

将来価値
X円を利率r%でn年運用したn年後の将来価値
X*(1+r%)**n
>>> n = np.pv(0.008, 5, 0, -100)
>>> np.fv(0.008, 5, 0, -n)
100.0


正味現在価値
5年にわたって各年100万もらえる投資商品、割引率3%
>>> np.npv(0.03, [0,100,100,100,100,100])
457.97071871945337

内部収益率
初期投資800
各年
100,150,200,250,300,350
の収益
割引率10%
>>> np.npv(0.1, [-800,100,150,200,250,300,350])
119.7346295160028
>>> round(np.irr([-800,100,150,200,250,300,350]),4)
0.1405
判断基準
npv>0
irr>割引率



二項分布

二項分布

  • n回の連続した試行

コインを10回連続で投げる

  • それぞれの試行は互いに排他的

表か裏がでる

  • 表の確率がpならば裏の確率は1-p

表が0.5ならば裏は1-0.5

  • それぞれの試行は独立

1回目の結果は2回目に影響しない

コインを10回連続で投げた場合の表がでる確率


>>> import scipy.misc as sc
>>> def answer(k):
... p=0.5
... n=10
... comb = sc.comb(n,k)
... return comb * (p**k)*((1-p)**(n-k))
...
>>> answer(1)
0.009765625
>>> answer(2)
0.0439453125
>>> answer(3)
0.1171875
>>> answer(4)
0.205078125
>>> answer(5)
0.24609375
>>> answer(6)
0.205078125
>>> answer(7)
0.1171875
>>> answer(8)
0.0439453125
>>> answer(9)
0.009765625
>>> answer(10)
0.0009765625

#平均
>>> n*p
5.0
#標準偏差
>>> math.sqrt(n*(1-p)*p)
1.5811388300841898

#scipy
>>> from scipy.stats import binom
>>> mean, var = binom.stats(n,p)
>>> print(mean)
5.0
>>> print(math.sqrt(var))
1.5811388300841898


#確率質量関数 pmf (Probability mass function)
>>> x = range(n+1)
>>> y = binom.pmf(x,n,p)
>>> y
array([ 0.00097656, 0.00976563, 0.04394531, 0.1171875 , 0.20507813,
0.24609375, 0.20507813, 0.1171875 , 0.04394531, 0.00976563,
0.00097656])

共分散と相関係数

共分散とはxの偏差とyの偏差の積の平均値
一方が増加すると一方も増加するのが正の相関
一方が増加すると一方は減少するのが負の相関
0に近づくほど相関は弱い

x=[3, 8, 9, 7, 4, 5, 8, 10, 9, 7]
y=[4, 6, 8, 4, 5, 4, 7,   9, 7, 6]
xの平均7
yの平均6
xの偏差=[-4,1,2,0,-3,-2,1,3,2]
yの偏差=[-2,0,2,-2,-1,-2,1,3,1]

xの偏差の2乗=[16,1,4,0,9,4,1,9,4]
xの標準偏差=2.19   48/10(xの偏差の2乗の和/10)の平行根

yの偏差の2乗=[4,0,4,4,1,4,1,9,1]
yの標準偏差=1.69  28(yの偏差の2乗の和/10)の平行根

共分散
xの偏差*yの偏差=[8, 0, 4, 0, 3, 4, 1, 9, 2, 0]
xの偏差*yの偏差の和=31
31/10=3.1

相関係数
共分散を標準化した値
共分散/(xの標準偏差*yの標準偏差)=0.84
計算を簡略化すると(10で割っているのを打ち消す)
31/(48の平行根*28の平行根)

pythonで
>>> x = np.array([3, 8, 9, 7, 4, 5, 8, 10, 9, 7])
>>> y = np.array([4, 6, 8, 4, 5, 4, 7, 9, 7, 6])

平均
>>> x.mean()
7.0
>>> y.mean()
6.0

偏差
>>> [i-x.mean() for i in x]
[-4.0, 1.0, 2.0, 0.0, -3.0, -2.0, 1.0, 3.0, 2.0, 0.0]
>>> [i-y.mean() for i in y]
[-2.0, 0.0, 2.0, -2.0, -1.0, -2.0, 1.0, 3.0, 1.0, 0.0]

分散
>>> np.var(x)
4.7999999999999998
>>> np.var(y)
2.7999999999999998

標準偏差
>>> x.std()
2.1908902300206643
>>> y.std()
1.6733200530681511

共分散
>>> np.cov(x,y, bias=True)
array([[ 4.8,  3.1],
       [ 3.1,  2.8]])

相関係数
>>> np.corrcoef(x,y)
array([[ 1.        ,  0.84559432],
       [ 0.84559432,  1.        ]])

numpyメモ

#配列
list = np.array([1,2,3,4])
my_list1 = [1,2,3,4]
my_array1 = np.array(my_list1)

# 配列のサイズを調べる
my_array1.shape

# 配列のデータ型を調べる
my_array1.dtype

#すべての要素が0
np.zeros(5)

# arange関数
>>>np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> np.arange(1,10,2)
array([1, 3, 5, 7, 9])

#平均10、標準偏差5の正規分布
>>> np.random.normal(10.0,5.0, 10)
array([ 10.93299706,  14.88926584,  10.31387511,   9.31244588,
         5.82275012,   7.61138349,   2.87642971,  18.23249893,
        12.77071065,   3.04294258])

#一様分布に従う乱数が生成 下限-10、上限10、10個
 >>> np.random.uniform(-10.0, 10.0, 10)
array([ 7.63868191, -5.60987394,  8.72772981, -9.06028545,  8.22631925,
       -3.93651342, -7.83732211, -2.10760123,  2.39558808,  9.62909359])

#標準正規分布ガウス分布)は、平均0, 標準偏差1の正規分布
>>> np.random.randn(4)
array([ 0.85246024,  0.21607126,  3.11295252,  0.79788004])



postgresql10をcentos7にインストール

# yum install https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm
# yum install postgresql10-devel postgresql10-contrib
# /usr/pgsql-10/bin/postgresql-10-setup initdb

postgres=# create role username with createdb login password '***';
postgres=# create database dbname OWNER username;

elixirでマルチコアCPUプログラミング

プログラミングErlangのマルチコアCPUプログラミングの章にあるpmapのコードをelixirで書いた
https://github.com/iyoo14/map_utilgithub.com

結果
100個のリストの各数値の
フィボナッチ数の計算
は非効率な再帰版の場合は並列の方が早いが
効率のよい末尾再帰の場合は並列の方が遅い

1000個の数値のリストを含んだ100個のリストを作る
各リストの数値の並び替え
は並列の方が遅い

となった。