猫になりたい

IT企業のデータ分析屋。pyてょnは3.6を使ってマスコレルウィンストングリーン。

Google datalabを使ってみる

最近Google datalabが流行っているらしいので、試しに環境を立ててデータをpandasに読み込んでみるところまでやってみました。 以下はその手順のメモです。

1. Datalabを使えるようにする

まずは以下のクイックスタートを参考にDatalabのインスタンスを作成します。
Quickstart  |  Google Cloud Datalab Documentation  |  Google Cloud Platform

注意事項

  1. 上リンクの作業を行う際にVMインスタンスを作成する必要はありません。
    なぜなら上記クイックスタートで叩く
datalab create instance-name

でDatalab用のインスタンスが作成されるからです。
2. また、

gcloud config set compute/zone zone

でゾーンを設定する際は以下のゾーンごとの価格を確認しておきましょう。 Google Compute Engine の料金  |  Compute Engine ドキュメント  |  Google Cloud Platform

クイックスタートのCloud Datalab インスタンスを作成して接続するまで実行したら、 JupyterそっくりGoogle Cloud Datalabの画面が表示されていると思います。そしたらここまでの手順は成功です。

2. Datalabを使ってPandasのdataframeにcsvを読み込む

次にローカルマシンにあるデータをdatalabで使えるようにします。 色々探した所データをGoogle Cloud Storageにアップロードし、それをDatalabから読み込みに行くのが良さそうなのでそうします。

Google Cloud Storageにデータをアップロードする

Google Cloud Storageにアクセスします。

デフォルトで作成されているプロジェクトを使っているなら、既にデフォルトプロジェクト同じ名前のバケットが作られているはずなので、バケットの名前をクリックします。バケットが無ければ適当な名前をつけてバケットを作成して、バケットの名前をクリックします。すると以下の様な画面が出るのでファイルをアップロードボタンか、ドラッグアンドドロップでデータをアップロードします。 f:id:shikiponn:20171104213348p:plain

アップロードしたファイルが下の画像の様に表示されていれば成功です。 f:id:shikiponn:20171104214919p:plain

Datalabにcsvを読み込む

後は以下のようにStorage APIを使ってデータを読み込むだけです!

import google.datalab.storage as storage
import pandas as pd
from io import BytesIO

# Cloud Strage内のtrain.csvを変数dataに読み込む
%%gcs read --object gs://your-project-name/train.csv --variable data

# Cloud Storageから読み込んだデータをpandas dataframeに格納する。
df = pd.read_csv(BytesIO(data))

ちなみにdataframeをCloud Strageに書き出す場合は以下のようにします。

# 変数dfをCloud Storage内のtrain2.csvに書き出す
%storage write --variable df --object gs://your-project-name/train2.csv

お疲れ様でしたヾ(@⌒ー⌒@)ノ

参考

Dockerでデータ分析環境を整えた

2017/07/29 bzip2, vim, emacsが漏れていたのを追記

Docker内のUbuntu 16.04 LTSに分析環境を整えた時のメモ
最低限の環境だけ入れる

docker run ubuntu
しただけの環境で以下を実行する。

# 必要なパッケージとjulia, Rをインストール
# iRkernelはひとまず入れないでおく
apt-get update && apt-get install -y wget bzip2 git julia vim emacs sudo apt-file apt-transport-https
apt-file update; apt-get install -y software-properties-common
echo "deb https://cran.ism.ac.jp/bin/linux/ubuntu xenial/" >> /etc/apt/sources.list
apt-get update && apt-get install -y r-base

# anaconda3-4.4.0をインストール
wget https://repo.continuum.io/archive/Anaconda3-4.4.0-Linux-x86_64.sh
bash Anaconda3-4.4.0-Linux-x86_64.sh;

# zshを使いたい場合は以下もやる
# zshをインストール
apt-get install -y zsh; 

# oh-my-zshをインストール
sh -c "$(wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"
apt-get install -y tmux tig

Ubuntu 16.04 LTSにRをインストールする

UbuntuにRの最新版を入れるのにつまづいたのでまとめた。

やったこと

Docker内のUbuntu 16.04 LTSにRをインストー
普通のUbuntuでも同じはず

概要

UbuntuにRを入れる時に

apt-get install r-base

とすると以下の様に古いバージョンがインストールされてしまう。

root@~:/#
R version 3.2.3 (2015-12-10) -- "Wooden Christmas-Tree"
Copyright (C) 2015 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under the terms of the
GNU General Public License versions 2 or 3.
For more information about these matters see
http://www.gnu.org/licenses/.

How To Install R on Ubuntu 16.04 | DigitalOceanや、
UbuntuでRのパッケージがインストールできなくてハマった – webfun.tech beta
を参考にしてやっても、どうしても古いバージョンがインストールされてしまう。

解決法

最終的に以下の様にすることで解決した。

#必要なパッケージのインストール
apt-get update && apt-get install -y apt-file apt-transport-https
apt-file update
apt-get install -y software-properties-common
#aptのソースリストファイルにリポジトリを追加
#ミラーを統計数理研究所に設定
echo "deb https://cran.ism.ac.jp/bin/linux/ubuntu xenial/" >> /etc/apt/sources.list
#インストール
apt-get update && apt-get install -y --allow-unauthenticated r-base;

インストールされたバージョンの確認

root@~:/# R --version
R version 3.4.1 (2017-06-30) -- "Single Candle"
Copyright (C) 2017 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under the terms of the
GNU General Public License versions 2 or 3.
For more information about these matters see
http://www.gnu.org/licenses/.

できた。
公開鍵を設定すればオプションの

--allow-unauthenticated

は要らないかもしれない。(未確認)

pythonで関数の実行時間を計測する

pyhtonで関数の実行時間を計測したい時今までは
qiita.com
に書いてある方法で実行したい部分を挟んであげていたんですが 毎回3行挿入するのは面倒だし読みにくいので任意の関数の実行時間を計測するモジュールを作成しました。

誰かが似たようなことやってそうだけど調べてはいません。

コードは以下のgithubに上げてあります
github.com
まずtimethis.pyをインポートしたら

@timethis
def counter():
    c = 0
    for i in range(10000000):
        c+=1
    print(c)
    
counter()

とするか

def counter():
    c = 0
    for i in range(10000000):
        c+=1
    print(c)
    
counter = timethis(counter)
counter()

としてあげれば以下のような出力が得られます。

output 出力

--start wrapper --
10000000
elapsed_time:elapsed_time:0.915 [sec] --end--

Jupyterのmatplotlib inlineのメモリリークバグ

先日jupyterでmatplotlibに画像を吐き出させ続けていたところ1000枚ぐらい吐き出したあたりで突然jupyterのkernelが落ちました。嫌な予感がしてメモリの使用量を追ってみると処理を繰り返すに連れメモリの使用量が増加していき画像1000枚処理したあたりでメモリを4GB喰っていました。その時は仮想環境でメモリを4GBしか設定していなかったのでそこでkernelが落ちたということだったのですが、きちんとplt.close()を毎回ループの中で行っているのにも関わらずこれだけメモリを喰うのはおかしくないかと思い調べてみました。

調べても殆どはちゃんとplt.close()呼べよみたいな記事しか見つからなくて困っていたのですがのですが最終的に
%matpolotlib inline
メモリリークバグがあるとの記事に行き当たりました。
Memory leak with %matplotlib inline · Issue #7270 · ipython/ipython · GitHub
これはplot.show()するしないに関わらず発生するようです。私はループの中で

plt = make_plot(df)# dataframeを処理してplotを返す自作関数
plt.savefig(・)
plt.close()

してる最中にこのバグに遭遇しました。

うん千枚の画像をnotebook内に表示する必要は一切無いですし自身も画像を保存したいだけでしたので%matpolotlib inlineコメントアウトすることで解決しました。 めでたしめでたし。

How to read csv and excel file on pandas dataframe from website

Motivation

Trying to use the Japanese Goverment statistics through an api I found it is useless due to the format and datasets which are provided. Instead I decided to read a csv and xls file directly from a website and load them on a pnadas dataframe. Below are the codes.

Example

csv file

The sample url for csv is below
"http://www.e-stat.go.jp/SG1/estat/Csvdl.do?sinfid=000012460662"
which is the url of a csv which contains a population in each prefecture of Japan. You can get a related csv files from 統計表一覧 政府統計の総合窓口 GL08020103 .(There seems no English websites unfortunately.)

Using the read_csv function below you will be abel to read a csv file on a pandas dataframe.

import pandas as pd

url = "http://www.e-stat.go.jp/SG1/estat/Csvdl.do?sinfid=000012460662"

#Read csv function
def read_csv(url):
    print(url)
    res = urllib.request.urlopen(url)
    res=res.read().decode('shift-jis')
    df = pd.read_csv(StringIO( res) )
    return df

#Run
read_csv(url)

Result f:id:shikiponn:20160619004604p:plain

Excel file(xls )

Next, from 統計表一覧 政府統計の総合窓口 GL08020103
I will get Population and Household data.

Similarly to the read_csv function we can make read_xls function as below.

url = "http://www.e-stat.go.jp/SG1/estat/GL08020103.do?_xlsDownload_&fileId=000003562952&releaseCount=1"

#Read xls function
def read_xls(url):
    print(url)
    res = urllib.request.urlopen(url)
    f = pd.ExcelFile(res)
    df = f.parse()
    return df

#Run
read_xls(url)

Result f:id:shikiponn:20160619190234p:plain

PythonでFizzBuzz

暇つぶしにPythonFizzBuzzを作ってみた。

FizzBuzzとはWikipedia先生によるとアメリカの言葉遊びの一種で

プレイヤーは円状に座る。最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの次の数字を発言していく。ただし、3で割り切れる場合は「Fizz」(Bizz Buzzの場合は「Bizz」)、5で割り切れる場合は「Buzz」、両者で割り切れる場合(すなわち15で割り切れる場合)は「Fizz Buzz」(Bizz Buzzの場合は「Bizz Buzz」)を数の代わりに発言しなければならない。発言を間違えた者や、ためらった者は脱落となる。

というものらしい。
飲み会の時の山手線ゲームみたいなやつ(もしくは3の倍数のときだけ阿呆になるあれ)という認識でいいのかな?兎も角コードは以下の通り

#今回は1~30の範囲まで
for i in range(1, 30):
    if i%3 == 0 and  i%5 != 0:
        print(i, "fizz")
    if i%5 == 0 and  i%3 != 0:
        print(i,"buzz")
    if i%5 == 0 and i%3 == 0:
        print(i,"fizz buzz")

結果

3 fizz
5 buzz
6 fizz
9 fizz
10 buzz
12 fizz
15 fizz buzz
18 fizz
20 buzz
21 fizz
24 fizz
25 buzz
27 fizz

ちゃんと出来ている。 Javaとかでは標準出力から値を入力させるらしいけどpythonなのでそこは省略。