前提
・Python が入っていること。
・Rubyがはいっていること : [Rails]Debian8に Ruby + Rails を導入する。
※Pyenvでの導入が簡単でいいように思います。また、Numpy、Matplotlibなど個別にインスト−する必要がある(Python側)ので、anacondaが便利かもしれません。
データサイエンティストを目指す人のpython環境構築 2016より抜粋
自分のの環境はvagrant上のDebian8です。
$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ pyenv install -l | grep ana
$ pyenv install anaconda3-2.5.0
$ pyenv rehash
$ pyenv global anaconda3-2.5.0
$ echo 'export PATH="$PYENV_ROOT/versions/anaconda3-2.5.0/bin/:$PATH"' >> ~/.bashrc
$ source ~/.bashrc
$ conda update conda
NumPy
$ gem install numpy
require "numpy"
np = Numpy
x = np.array([1,2,3,4,5])
y = np.array([2,4,3,5,6])
puts x + y
z= np.array([[1,2],[3,4]])
puts z.shape
a = np.array([[1,2],[3,4]])
b = np.array([10,20])
puts a * b
n_arr = np.array([[12,43],[14,40],[90,209]])
for i in 0..n_arr.shape[0] - 1
puts n_arr[i][1]
end
c = n_arr.flatten()
puts c
puts c[np.array([0,2,4])]
puts c[c>100]
・numpyの配列に対して、eachは使えない。
・代わりに上記のようにループを適応することはできる。
Matplotlib
gem install matplotlib
require 'numpy'
require 'matplotlib/pyplot'
plt = Matplotlib::Pyplot
np = Numpy
# cos and sin
x = np.arange(0,6,0.1)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x,y1)
plt.plot(x,y2, line_style="--")
plt.xlabel("x")
plt.xlabel("y")
plt.title('sin & cos')
plt.legend()
plt.show()
# 散布図
x = np.random.randn(30)
y = np.sin(x) + np.random.randn(30)
plt.plot(x, y, "ro") # "o"は小さい円(circle marker)
plt.show()
# 棒グラフ
plt.hist(np.random.randn(1000))
plt.show()
・plt.plot(x,y1,label="cos")として、ラベルをつけようとしてもうまくいかない。
Pycallの位置づけ
Data Analysis with Ruby using PyCall by Kenta Murata
Rubyスクリプトで生成したデータをpandasで加工してmatplotlibやseabornで加工する。
Railsだったら以下のような流れだと思う。
①Rails(Ruby)でデータの整形
②PycallからPython側でデータの処理
③Rails側で表示
ハマりどころ
Linux(Ubuntu系)を使っているのですが、find_libpython': PyCall::PythonNotFound (PyCall::PythonNotFound)
がで出て実行できませんでした。
自分の環境のpyenvなpythonであったので下記を参照にして解決した。
Ruby の PyCall を使って pyenv な Python を使えるようにする方法
$ which python
$ ls /opt/pyenv/versions/
# => 2.7.6 3.4.2
以下の例では、3.4.2下に、共有ライブラリを作るようにオプションを指定します。
$ CONFIGURE_OPTS="--enable-shared" pyenv install 3.4.2
いつもいつも忘れてしまうのでruby-buildのconfigureオプションの設定についてメモっておく
CONFIGURE_OPTSは文字通り./configureにoptionを渡すことになる。
これで解決!