16 Aug 2017, 15:23

Kaggleをはじめたので対策や攻略法についてのブックマーク

Kaggle

Kaggle モチベーション

はじめの一歩

チュートリアル

攻略法ブックマーク

MOOC

Book

手法

Tools

その他

25 Jul 2017, 06:51

Leap Motion を Pythonから使う方法を調べた

Leap Motion を Pythonから使う方法を調べた。

環境

  • Ubuntu 16.04, 64bit
  • Leap Motion SDK 2.3.1
  • Python 2.7.13

Pythonは 2系でしか動かないようだ。私はAnacondaを利用して、2系の環境を構築した。

必要なファイルを揃える

まずは、前回の記事に従って、Leap Motion SDKをインストールする。

Linux用のtarファイルを解凍すると、LeapSDKというフォルダがあるので、そこに移動。

Leap Motionを Pythonから操作するためには、以下の3ファイルが必要。

  • lib/Leap.py
  • lib/x64/libLeap.so
  • lib/x64/LeapPython.so

(64bitはx64/32bitはx86フォルダ)

作業用ディレクトリを作成して、そこに3ファイルをコピーする。

mkdir -p ~/repo/leap
cp lib/Leap.py ~/repo/leap
cp lib/x64/libLeap.so ~/repo/leap
cp lib/x64/LeapPython.so ~/repo/leap

LeapSDKの中にSample/Sample.pyがあるので、まずはそれを作業用ディレクトリにコピーして動かしてみる。数値がたくさん現れれば成功。

cp samples/Sample.py ~/repo/leap/
cd ~/repo/leap/
python Sample.py

基本スニペット

Leap Motionのプログラムの書き方は、Listener型とPoling型がある。

Listener型は、Leap Motionのフレームワークで Loopがある場合、

Polingは Leap Motion以外のフレームワークで Loopがある場合に使う。

サンプルコードに従って、Listener型の基本スニペットを書く。

import Leap, sys

class SampleListener(Leap.Listener):
    def on_frame(self, controller):
        # Get the most recent frame and report some basic information
        frame = controller.frame()
        print "Frame id: %d, timestamp: %d" % (frame.id, frame.timestamp)

def main():
    # Create a sample listener and controller
    listener = SampleListener()
    controller = Leap.Controller()

    # Have the sample listener receive events from the controller
    controller.add_listener(listener)

    # Keep this process running until Enter is pressed
    print "Press Enter to quit..."
    try:
        sys.stdin.readline()
    except KeyboardInterrupt:
        pass
    finally:
        # Remove the sample listener when done
        controller.remove_listener(listener)


if __name__ == "__main__":
    main()

main関数は変更せずに、on_frame()メソッドの中身だけ修正すれば良さそう。

frameに現在の情報がすべて含まれているので、そこからいろいろ取り出す。

手の座標を取得

まずは、手の座標を取得してみる。

on_frameの中に以下を書き込む。

    hands = frame.hands
    hand = hands[0] # first hand
    print(hand.palm_position)

palm_positionで手のひらの中心の座標が手に入る。実験してみた結果、手の座標が、(x, y, z)のタプルで取得できた。

(41.2968, 119.34, -71.5027)
(40.8835, 122.556, -71.095)
(38.7474, 126.202, -69.3811)
(36.5977, 130.135, -66.6525)
(34.1101, 134.531, -63.37)
(31.7521, 137.867, -59.3138)
(28.9372, 141.859, -54.9556)
(27.5701, 145.658, -50.0342)
(25.3786, 149.093, -45.6736)
(23.8103, 152.436, -40.7532)
(21.8484, 156.879, -36.0352)

ジェスチャーを検出する

ジェスチャーは4種類ある。今回は、Key Tapというジェスチャを試す。

ジェスチャーの検出には、事前の登録が必要。on_connect() でジェスチャーを登録する。

def on_connect(self, controller):
    controller.enable_gesture(Leap.Gesture.TYPE_KEY_TAP);

on_frameに以下を追加。

for gesture in frame.gestures():
   if gesture.type == Leap.Gesture.TYPE_KEY_TAP:
        print "  Key Tap id:", gesture.id

ジェスチャーを以下のようにすると、反応する。

Key Tap id: 1
Key Tap id: 2
Key Tap id: 3
Key Tap id: 4

とりあえず、今日はここまで。

25 Jul 2017, 02:11

Ubuntuに Leap Motion SDKをインストールした作業メモ

机の中に眠っていたLeap Motionを数年ぶりに使ってみようと思う。

Ubuntuに Leap Motion SDKをインストールした作業メモです。

環境

  • Ubuntu 16.04
  • Leap Motion SDK 2.3.1

SetUp

公式サイトからLinux用のSDKをダウンロード

cd Downloads
tar xvzf Leap_Motion_SDK_Linux_2.3.1.tgz
cd LeapDeveloperKit_2.3.1+31549_linux
sudo dpkg -i Leap-2.3.1+31549-x64.deb

エラーが発生した。leap deamonがない。

Failed to start leapd.service: Unit leapd.service not found.
dpkg: パッケージ leap の処理中にエラーが発生しました (--install):
 サブプロセス インストール済みの post-installation スクリプト はエラー終了ステータス 5 を返しました
ureadahead (0.100.0-19) のトリガを処理しています ...
ureadahead will be reprofiled on next reboot
処理中にエラーが発生しました:
 leap

解決策がForumにあった。パッチを当てればいいらしい。(パッチは結局失敗する、後述)

  • Leap Motion SDK fails to install properly on Ubuntu 15.04 – Customer Support – Leap Motion Community

    Download the .tgz file from https://www.leapmotion.com/setup120, extract, and download the patch file to /tmp/patch:
    tar xzf Leap_Motion_Setup_Linux_2.3.1.tgz
    cd Leap_Motion_Installer_Packages_release_public_linux
    wget -O /tmp/patch https://gist.githubusercontent.com/jmwilson/8e6c579eac5fa7fa9f0d/raw/0b597ceb1f8184952bf067267ac4171691949068/patch
    
    Extract the .deb file into a new leap directory and enter it:
    dpkg-deb --raw-extract Leap-2.3.1+31549-x64.deb leap
    cd leap
    
    Patch the contents of the current directory:
    patch -p2 </tmp/patch
    
    Go back to the parent directory and build a new .deb file:
    cd ..
    fakeroot dpkg-deb --build leap (this can take a while...)
    
    Install the patched .deb:
    sudo dpkg --install leap.deb
    

patchを当てても動かなかった。他の人も同様の症状がでているみたい。

解決策がforumにあった。

  • Linux install of SDK fails – Development – Leap Motion Community

    1 - After the install failure, I simply uninstalled with:

    sudo dpkg -r leap

    2 - Now, with no leap installed yet, I followed the post above and just created the file as mentioned there (I used the terminal to write the following command, to use the nano text editor as root user):

    sudo nano /lib/systemd/system/leapd.service

    3 - I pasted that content (reproduced here for easiness): (also please note that on Ubuntu terminal, you paste with CTRL+SHIFT+V instead of just CTRL+V)

    Found by Kevin Cole 2014.11.22 at

    https://github.com/atejeda/leap-fedora-rpm

    #

    Remember to:

    #

    ln -s /lib/systemd/system/leapd.service /etc/systemd/system/leapd.service

    systemctl daemon-reload

    # [Unit] Description=LeapMotion Daemon After=syslog.target [Service] Type=simple ExecStart=/usr/sbin/leapd [Install] WantedBy=multi-user.target

    4 - Saved (CTRL+O then ENTER), and exited (CTRL+X)

    5 - Still using the terminal, executed the two commands from that same post, BUT I included the sudo prefix to run them as root user:

    sudo ln -s /lib/systemd/system/leapd.service /etc/systemd/system/leapd.service sudo systemctl daemon-reload

    6 - All is right now and we can properly install. So, I just installed the original package:as in the official Leap guide:

    sudo dpkg –install Leap-2.3.1+31549-x64.deb

    (please just note that I'm using a x64 Ubuntu, so I installed the 64 bits package)

    7 - Done!!!

これでうまくいった!

確認

LeapControlPanelを起動する。ツールバーにLeap Motionのアイコンがでて、緑色になった。

試しに、Diagnostic Visualizerを起動してみる。手が正しくトラッキングされていることが分かる。

28 Jun 2017, 18:01

AtomでMarkdownを快適に執筆するための環境構築

AtomでMarkdownを快適に執筆するための設定を調べた。

自分はEmacs派なのだけれども、最近EmacsはWordPressの執筆用にしか使わなくなってきた。そこで、WordPressを快適に執筆するための環境を調べたところ、LinuxではAtomが良さそうだったので、試しにAtomでブログを書くことにした。

Emacsを捨てる気はないヨ! ちょっとした浮気だよ。

環境

  • Ubuntu 16.02
  • Atom 1.18.0

atomのインストール

公式サイトにアクセス https://atom.io/

Ubuntuなので、debパッケージをダウンロードし、以下のコマンドでインストール。

sudo dpkg -i atom-amd64.deb

基本設定

日本語化設定

  • メニューバーからHelp->WelComeGuideを選択
  • 「Install a Package」を選択
  • 「Open Installer」を選択
  • フォームに「japanese」と入力し、「Packages」を選択
  • パッケージが表示されるので、「japanese-menu」の「Install」を選択

フォントを設定する

フォントが小さいので大きくする。

  • 編集 -> 環境設定を選択
  • Editorsを選択
  • FontFamily にフォントを入力(ここではRictyを入力)
  • Font Size で適切な大きさを入力(ここでは18を入力)

テーマの設定

Monokaiが好きなので、それに変更する。https://atom.io/themes/monokai

  • SettingsからInstallを選択
  • Monokaiを検索し、インストール
  • Themesを選択し、Syntax ThemesでMonokaiを選択

基本パッケージのインストール

パッケージのインストール方法は、以下でいけます。

  • 編集 -> 環境設定を選択し、設定を開く
  • パッケージを選択
  • フォームでパッケージを検索してインストール

atomic-emacs

AtomでEmacsキーバインドを利用するためのパッケージ。これは必須だ。

highlight-line

現在ラインをハイライト

Markdown

もともとの目的である、Markdownでの執筆を便利にするプラグインを入れる。

markdown-preview

Markdownのプレビュー機能は、デフォルトでインストールされている。 Ctrl+Shift+Mで Markdownプレビューウィンドウをtoggleできる。

Markdownプレビュー画面のGithubスタイル適用

インストールパッケージからMarkdown-Previewを検索し、

Use Github.com Style にチェックを入れる。

markdown-scroll-sync

エディタにあわせて、markdown プレビュー画面を自動スクロール。

markdown-writer

Markdownの入力支援のパッケージ

たとえば、- の次に改行を入力すると、次の – が自動で挿入される。

tool-bar-markdown-writer

便利なツールバーを表示してくれる。Markdownの記法を覚えてないので、これは便利。

markdown-writerとtool-barが必要。

  • markdown-writerをインストール
  • tool-barをインストール
  • tool-bar-markdown-writerをインストール

tool-bar

tool-bar-markdown-writerの使用に必要

WordPressに投稿する方法

  • markdown previewから、右クリックで HTMLを保存を選択。
  • WordPressの投稿画面を開き、投稿画面にペースト。

28 Jun 2017, 13:38

LEGO Mindstorms教育版で作成可能なロボット

LEGO Mindstormsの教育版(#45544)を購入したので、ネットで手に入る設計図を調べた。

結論からいうと、以下のページにまとまっている。

標準セットで作成できるロボット

標準セット(45560)で作成できるロボットは以下の種類

  • Gyro Boy
  • Puppy
  • Color Sorter
  • Robot Arm
  • Robot Educator Model(たくさんあるので省略)

拡張セットで作成できるロボット

拡張セット(45560)で作成できるロボットは以下の種類

  • Elephant
  • Remote Control
  • Spinner Factory
  • Stair Climber
  • Tank Bot
  • Znap

拡張セットは、15000円くらい。

非公式

頑張ったらつくれた。

自分でつくるには・・・

自分で想像力をはためかせて作るには、以下の本が役に立ちそう。

まあ、そんな才能はないのだが。

レゴの設計図を見るたびに、よくこんなこと思いつくなと思う。

追記分

LEGO Design Builder(http://ldd.lego.com/ja-jp/) というソフトウェアがすごそう。

25 Jun 2017, 00:50

ev3dev-lang-python 開発環境(Visual Studio Code)

ev3dev で Python の開発をするには、Visual Studio COde をローカル PC でつかうのがよさそう。

サーバ上でコーディングすると、サーバからのレスポンスが遅くてイライラする。

なので、ローカルで編集したファイルをサーバにアップロードする方式のほうがよさそう。

VS Code なら ftp-sync という拡張機能があり、保存のたびに サーバとローカルのフォルダの同期が走る。

Visual Studio Code の設定メモです。

環境

  • Ubuntu 16.04 LTS
  • Visual Studio Code 1.13.1

Visual Studio Code

VS Code の本体を手に入れる。

deb をダウンロードして、以下でインストール。

$ sudo dpkg -i code_1.13.1-1497464373_amd64.deb

anaconda

anaconda をつかって、専用の環境を用意する。

# ev3 環境を作成
$ conda create -n ev3
$ activate ev3

# python をインストール
$ conda install python

VS Code の ファイル > 基本設定 > 設定を選択。

ユーザ設定ファイル setting.json が作成される。setting.json に python のパスを追記する。

"python.pythonPath": "/home/tsu-nera/anaconda3/envs/ev3/bin/python",

ev3dev-lang-python

ev3dev ライブラリをインストール。

$ git clone https://github.com/rhempel/ev3dev-lang-python.git
$ cd ev3dev-lang-python
$ python setup.py

pylint

pylint をインストールすることで、エラーチェックを有効化。

$ conda install pylint

autocomplete

ev3dev-lang-python の API のコード補完ができない。

PyCharm だとこの辺ができるんだけどな。。。。解決策探し中。

拡張機能

python

Python で開発するための必須機能。

ftp-sync

VS Code のキモの拡張機能。sftp を利用してサーバとフォルダを同期する。

以下のように、ftp-sync.json を設定する。

sftp は port22 に変更することに注意。remotePath は同期したいサーバ上のフォルダ。

{
    "remotePath": "./experimentals",
    "host": "ev3dev.local",
    "username": "robot",
    "password": "maker",
    "port": 22,
    "secure": false,
    "protocol": "sftp",
    "uploadOnSave": true,
    "passive": false,
    "debug": false,
    "privateKeyPath": null,
    "passphrase": null,
    "ignore": [
        "\\.vscode",
        "\\.git",
        "\\.DS_Store"
    ],
    "generatedFiles": {
        "uploadOnSave": false,
        "extensionsToInclude": [],
        "path": ""
    }
}

23 Jun 2017, 23:57

LEGO Mindstorms EV3 を Python から制御するためのメモ

レゴマインドストーム EV3 を Python で制御するためのセットアップ作業メモです。

Environment

  • LEGO MindStorms EV3
  • Ubuntu 16.04(途中 micro SD カードのところは Windows10)
  • ev3dev (2017-06-09)
  • Python 3.4.2

ev3dev

ev3dev の OS 起動

ev3dev とは、Debian ベースの Linux OS.

Python でプログラミングするには、標準で入っている OS ではなく、ev3dev を利用する。 この ev3dev OS を micro SD カードに焼いて、カードから OS を起動してその上で作業する。

いわば これはデュアルブート。 なので、もともとの EV3 の OS を削除することなく、ev3dev OS を動かすことができる。

まずは、OS のイメージをダウンロードする。

ダウンロードしたファイルを解凍する。

micro SD カードに write するために、ツールを使う。自分の PC では Ubuntu で作業しているのだけれども、 カードがどうやっても認識できなかったので、Windows から micro SD カードに OS イメージを焼いた。 Windows では、Win32 Disk Imagerというソフトが利用できる。

SD カードを EV3 本体に差し込んで、起動ボタンを押す。1 分ほどで、立ち上がる。

wifi 接続

wifi 接続には、wifi ドングルが必要。

ssh でリモートログイン

ターミナルを起動して、以下を打ち込む。

ssh robot@ev3dev.local

ユーザ名は、robot, パスワードは maker.ログインが成功すると、以下の出力を得る。

             _____     _
   _____   _|___ /  __| | _____   __
  / _ \ \ / / |_ \ / _` |/ _ \ \ / /
 |  __/\ V / ___) | (_| |  __/\ V /
  \___| \_/ |____/ \__,_|\___| \_/

Debian jessie on LEGO MINDSTORMS EV3!

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Fri Jun 23 10:55:42 2017 from 192.168.3.4
robot@ev3dev:~$ 

wifi 設定を永続化するために、/etc/wpa_supplicant/wpa_supplicant.conf の編集をする。

cd /etc/wpa_supplicant/
sudo touch wpa_supplicant.conf
sudo chmod a+w wpa_supplicant.conf
sudo wpa_passphrase <SSID> <passward> >> wpa_supplicant.conf

ev3dev のアップデート

sudo apt-get update

Python

Python

デフォルトでは、Python 2.x が入っているようだ。python3 で 3.x 系が使える。

robot@ev3dev:~$ python
Python 2.7.9 (default, Aug 13 2016, 17:33:18) 

robot@ev3dev:~$ python3
Python 3.4.2 (default, Oct  8 2014, 14:47:30

ev3dev-lang-python

Python で ev3dev のデバイス、 つまりセンサやモータなどを制御するためには、ev3dev-lang-python というライブラリを使う。

ライブラリを最新にする。

sudo apt-get install --only-upgrade python3-ev3dev

ライブラリのドキュメントは以下。

インタラクティブ

Hello World

まずは、Hello World から。Python インタープリタを起動する。

robot@ev3dev:~$ python3
Python 3.4.2 (default, Oct  8 2014, 14:47:30) 
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

ライブラリ を import する。

import ev3dev.ev3 as ev3

Hello, World と音をだす。

ev3.Sound.speak('Hello World!').wait()

モーター制御

ev3.LargeMotor でモーターのインスタンスを作成する。

run_timed で、時間指定でモーターを回す。

# インスタンス取得
m = ev3.LargeMotor('outA')

# 3 秒間動かす
m.run_timed(time_sp=3000, speed_sp=500)

時間指定なしでモーターを回すには、run_forever()を使う。止めるには、stop()を使う。

m.run_forever(duty_cycle_sp=30,speed_sp=500)
m.stop()

スクリプト

python3 を使うために、行頭に #!/usr/bin/env python3 を書く。run_motor.py を作成。

#!/usr/bin/env python3
import ev3dev.ev3 as ev3
import time

m = ev3.LargeMotor('outA')
m.run_forever(duty_cycle_sp=50, speed_sp=500)
time.sleep(3)
m.stop()

ターミナルから実行。

python3 run_motor.py

EV3 の本体から、スクリプトを選択して実行することもできる。スクリプトを実行可能にする。

chmod +x run_motor.py

画面から、File Browser を選択して、作成したファイルを選択すると実行できる。

開発環境

いろいろ試したけれども、PyCharm に落ち着きそう。

Emacs

ローカル PC(Ubuntu)の Emacs からリモートサーバの ev3dev のファイルをいじるには、 Emacs の Tramp を使う。

Emacs を起動して、C-x C-f を押してから以下を入力

/ssh:robot@ev3dev.local:

パスワードを聞かれるので maker と入力して Enter.

Windows での方法は、今回は未検証だけど、以下でいけるはず。

これで、ローカルで編集するのと同じ操作でリモートのファイルいじることができる。

追記

しばらくこれでやっていたのだけれども、tramp を使うと入力レスポンスが遅い。ときどきフリーズする。

じゃあサーバに emacs を入れてしまおうとインストールした。

sudo apt-get install -y emacs-nox

これでも遅い。

やっぱりローカルで編集して、編集したものをアップロードする方式がよさそう。

PyCharm

最近 PyCharm が Emacs よりもずっといいと思いはじめた。

PyCharm での 開発設定は以下にまとめられている。

ここには、git 経由で編集するやり方が書いてある。編集と確認のたびにソースをコミットする必要がありそう。

なにかうまい方法はないかと考え中。ローカルで編集したものを rsync でサーバと同期するか。

追記 source sync

うまい手をみつけた。プラグインで、source syncronizer というものがある。

ローカルからサーバへの一方向のアップロードのみできる。インストールは、ファイル > 設定 > プラグインを選択。 source sync を検索してインストールする。

インストールしたら、ツール > source sync を選択。プロトコルを SCP で作成(SFTP だとうまくいかなかった)

  • ホスト: ev3dev.local
  • ホストパス: アップロード先ディレクトリ
  • ユーザ名: robot
  • パスワード: maker

ファイル単位でのアップロードだと漏れがありそうなので、 やっぱり git で版数管理して同期するか、もしくは併用するのがいいかも。

anaconda 環境の設定方法

# ev3 環境を作成
$ conda create -n ev3
$ activate ev3

# python をインストール
$ conda install python

# ev3dev-lang-python をインストール
$ git clone https://github.com/rhempel/ev3dev-lang-python.git
$ cd ev3dev-lang-python
$ python setup.py

作成した仮想環境を PyCharm で利用するには、 ファイル > 設定 > プロジェクト > プロジェクト・インターセプタから、 作成した環境の Python へのパスを通す。

  • ~/anaconda3/envs/ev3/bin/python

なぜか候補に作成した環境があらわれなかったので、 歯車マークを選択して、ローカル追加を選択することで、パスを追加した。

Jupyter Notebook

頑張れば Jupyter Notebook をインストールして使えるようだ。以下のページを参考にした。

試してみたけれども、セルの実行に時間がかかりすぎたり、謎の kernel エラーが発生したりしたのでやめた。

Visual Studio Code

拡張機能で、ローカル PC とサーバのファイルを sync するものがある。これは便利。

09 May 2017, 15:53

pybitflyer をつかって Python で ビットコインレートを取得してみた

以前、FX システムトレードをしていたので、その経験を生かし(5 万損したけどね)、 Bitcoin でシステムトレードが出来ないか調べてみた。

Bitcoin API 調査

“bitcoin api” で検索をかけた。また、言語は Python で書きたいので、 Python で使えるかも注目して調べた。

ざっと調べた限りだと、 日本では以下の会社が API を提供しているようだ。

なお、調査には、以下のサイトの情報が役立った。 システムトレードできる会社の名前が列挙されて、比較されている。

python library 調査

BitFlyer に決めた

BitFlyer の API を利用することにした。

理由は、検索で上位に引っかかったから。とりあえずお試しなので、これでいいだろう。

そんな決定で大丈夫か?大丈夫だ、問題ない(ぬわー)

インストール

Anaconda 環境を構築して、そこにインストールした。

conda create -n bitcoin
source activate bitcoin
pip install pybitflyer

BitCoin レートを取得

使い方は簡単。4 行だ。

import pybitflyer

api = pybitflyer.API()
while True:
    print(api.ticker(product_code = "BTC_JPY"))
{'product_code': 'BTC_JPY', 'timestamp': '2017-05-09T14:55:00.413', 'tick_id': 388314, 'best_bid': 208700.0, 'best_ask': 208820.0, 'best_bid_size': 6.95343174, 'best_ask_size': 0.001, 'total_bid_depth': 5013.20612844, 'total_ask_depth': 1350.24206904, 'ltp': 208700.0, 'volume': 135481.11248751, 'volume_by_product': 18380.43374774}
{'product_code': 'BTC_JPY', 'timestamp': '2017-05-09T14:55:01.023', 'tick_id': 388315, 'best_bid': 208700.0, 'best_ask': 208820.0, 'best_bid_size': 6.95343174, 'best_ask_size': 0.001, 'total_bid_depth': 5011.09612844, 'total_ask_depth': 1350.24206904, 'ltp': 208700.0, 'volume': 135481.11348751, 'volume_by_product': 18380.43374774}
{'product_code': 'BTC_JPY', 'timestamp': '2017-05-09T14:55:01.477', 'tick_id': 388318, 'best_bid': 208700.0, 'best_ask': 208820.0, 'best_bid_size': 6.95343174, 'best_ask_size': 0.001, 'total_bid_depth': 5011.21504903, 'total_ask_depth': 1350.24206904, 'ltp': 208700.0, 'volume': 135481.11348751, 'volume_by_product': 18380.43374774}

ドキュメントは以下。

API は、

  • API キーによる認証が不要な HTTP Public API
  • 認証が必要な HTTP Private API

に分けられる。なのでほんとうは、pybitflyer.API()のインスタンス引数に、

  • api_key
  • api_secret

を取得して、設定する必要があるのだが、口座開設してすぐには発行されないので、今はこれで。 API Key, API Secret は、ビットコイン取引所【 bitFlyer Lightning 】 にログインして、 左バーのところにある API を選択して、取得する。

どんな情報が取得できたのか

json ライブラリで見やすくする。

import pybitflyer
import json

api = pybitflyer.API()
while True:
    print(json.dumps(api.ticker(product_code = "BTC_JPY"), 
                     sort_keys=True, indent=4))

取得結果。

{
    "best_ask": 209190.0,
    "best_ask_size": 0.0075,
    "best_bid": 209147.0,
    "best_bid_size": 0.02277838,
    "ltp": 209557.0,
    "product_code": "BTC_JPY",
    "tick_id": 392364,
    "timestamp": "2017-05-09T15:08:51.51",
    "total_ask_depth": 1312.51807976,
    "total_bid_depth": 4998.61968155,
    "volume": 134942.30375862,
    "volume_by_product": 18338.51424803
}

トレード用にデータを間引く

ここでトレードに必要な情報は、FX の経験からいうと、

  • best_bid
  • best_ask

(- product_code)

  • timestamp

データを修正する。

import pybitflyer
import json

api = pybitflyer.API()

class Event(object):
    pass

class TickEvent(Event):
    def __init__(self, instrument, time, bid, ask):
        self.type = 'TICK'
        self.instrument = instrument
        self.time = time
        self.bid = bid
        self.ask = ask

    def show(self):
        print("instrument:" + self.instrument +
              ", time:" + self.time +
              ", bid:" + str(self.bid) +
              ", ask:" + str(self.ask))

while True:
    data = json.dumps(api.ticker(product_code = "BTC_JPY"))
    data_dict = json.loads(data)
    event = TickEvent(data_dict['product_code'], 
                      data_dict['timestamp'],
                      data_dict['best_bid'],
                      data_dict['best_ask'])
    event.show()
instrument:BTC_JPY, time:2017-05-09T15:52:25.537, bid:209164.0, ask:209165.0
instrument:BTC_JPY, time:2017-05-09T15:52:26.413, bid:209164.0, ask:209165.0
instrument:BTC_JPY, time:2017-05-09T15:52:26.853, bid:209164.0, ask:209165.0
instrument:BTC_JPY, time:2017-05-09T15:52:26.697, bid:209164.0, ask:209165.0
instrument:BTC_JPY, time:2017-05-09T15:52:27.257, bid:209164.0, ask:209165.0
instrument:BTC_JPY, time:2017-05-09T15:52:27.977, bid:209164.0, ask:209165.0
instrument:BTC_JPY, time:2017-05-09T15:52:27.977, bid:209164.0, ask:209165.0
instrument:BTC_JPY, time:2017-05-09T15:52:27.977, bid:209164.0, ask:209165.0
instrument:BTC_JPY, time:2017-05-09T15:52:27.977, bid:209164.0, ask:209165.0
instrument:BTC_JPY, time:2017-05-09T15:52:30.457, bid:209164.0, ask:209165.0

これで、FX とおなじデータ形式になったので、FX のコードが再利用できるぞ。

追記 ヒストリカルデータが欲しいな

シストレするためには、バックテストをしたい。そのために、ヒストリカルデータが必要だ。

さがしてみると、coincheck のデータが Bitcoincharts というサイトで Markets API として公開されているようだ。

以下の日本語の記事が詳しい。

なので、Bitflyer は止めて、Coincheck(コインチェック) に変更することにした。

coincheck も python の API がある。ありがたい。

これをつかって、Producer-Consumer Pattern をつかって、値を取得する処理を途中まで書いた。

開発中のリポジトリは以下です。

03 May 2017, 06:20

Jupyter Notebook で書いた ipynb を WordPress の記事にするには jupy2wp が便利

Jupyter Notebook で実行した結果や、matplotlib や seaborn で生成した図を、 そのまま WordPress に表示して、記事にしたいとする。

調べてみると、以下の やり方があるようだ。

  1. gist に アップロードして公開したものを WordPress に 埋め込む。
  2. Jupyter Notebook を html 形式で、ダウンロードする。
  3. .ipynb ファイルを nbconvert で html ファイルにして WordPress に入力する。
  4. jupy2wp を使う。

gist を埋め込む

Jupyter Notebook には、Gist-it という extentions がある。 extentions の有効方法については、以下の README を参照。

これを有効にすると、ツールバーに gist のマークが現れる。 ポチルだけで、gist に ipynb がアップロードされて、公開される。

注意点は、gist-it の設定画面から Github personal access token を入力することだ。 そうしないと、anonymous として gist が公開される。

しかし、この方法は自分は好まない。なぜなら、gist を WordPress に 埋め込んだとき、 コードの高さが固定されてスクロールバーが出てきてしまうからだ。この回避方法がわからなかった。 もし、この問題が回避できれば、gist はいいかもしれない。

どういう仕組みかわからないけれども、図表も表示される。

HTML 形式でダウンロードする

Jupyter Notebook の notebook を開いて、 File > Download as > HTML から html 形式でダウンロードする。

出来た html ファイルを WordPress のテキスト画面に貼り込む

この作戦も、自分は好まない。なぜなら、Jupyter Themes を使っているのだけれども、 Themes が反映された状態で HTML がダウンロードされるからだ。

黒背景を使っているので、真っ黒な画面になった、よくない。

nbconvert をつかう

以下のサイトで紹介されている方法。

1.Jupyter Notebook でコンテンツを作り、Save する 2.nbconvert で html ファイルに変換する

[sourcecode language=”sh” title=”” ]
$ jupyter nbconvert –to html –template basic 出来たファイル.ipynb
[/sourcecode]

3.出来た html ファイルを WordPress のテキスト画面に貼り込む 4.Wordpress の CSS ファイルに最後に示した CSS を追加する。

これはいいかもしれない。しかし、もっといい方法を見つけた。

jupy2wp を使う

jupy2wp というツールを使う。

インストール方法は README 参照。ちょっとコマンドオプションが長いけれども、以下のように使う。

[sourcecode language=”bash” title=”” ]
python -m jupy2wp.jupy2wp –xmlrpc-url http://futurismo.biz/xmlrpc.php –user username –password hogehoge –nb titanic-cnn.ipynb –title “Kaggle: Titanic 問題データ分析” –categories [Python, 統計] –tags keras
[/sourcecode]

こうすると、下書きの状態で、ipynb で表示されていた内容がそのまま記事として投稿される。

さらに、画像は、/upload フォルダ配下に自動でアップロードされて保存される。これはいい。

02 May 2017, 07:05

ダークな黒背景でクールにデータ解析!Jupyter Notebook Themes & Emacs KeyBinding

最近、Emacs よりも Jupyter Notebook の使用率が高いのだけれども(?!)、 今朝 twitter の タイムラインを眺めてたらこんなツイートが流れてきたので、飛びついた。

試してみたら、ものすごくクールだったので、スクショをとってみたのが以下。黒背景、メチャガチャクールだ。

Jupyter Themes

Jupyter Notebook を 黒背景にするには、Jupyter Themes という extentions を使う。

インストールは pip から。

pip install jupyterthemes

これで、jt コマンドが利用出来るようになる。

テーマは以下のテーマがある。私の大好きな monokai がある!!これは、うれしい! 他にも solarized の Light と Dark がある。

$ jt -l
Available Themes: 
   oceans16
   chesterish
   grade3
   solarizedl
   monokai
   onedork
   solarized-light

テーマの適用には、-t <theme> をつけて jt を呼ぶ。

jt -t monokai

フォルダはこんな感じ。

オプションに -N -T をつけると、ツールバーと ノート名を表示できる。

私の最終的な設定は、以下にした。 code のフォントは プログラミングに適していると言われている Ricty で有名な inconsolata。

jt -t monokai -f inconsolata -N -T 

追記

seaborn の縦軸横軸の表示が、背景が黒だとなにもみえなくなった。以下で解決。

custom_style = {'axes.labelcolor': 'white',
                'xtick.color': 'white',
                'ytick.color': 'white'}
sns.set_style("darkgrid", rc=custom_style)

Emacs KeyBindings

こうなったら、Emacs ライクに Jupyter Notebook をしようと思い、 Emacs ライクにキーバインディングをする方法も調べてみた。以下の extentions を入れる。

pip install jupyter-emacskeys

これで、コードを書くときに Emacs keyBindings が使える、と思ったがここで一つ問題が。 Ctrl + n は Emacs では 下に移動に割当たっているのだけれども、 ブラウザでは新しいウィンドウを開くに割り当てられているので、使えない。

これは、Ctrl + n で新しいウィンドウを開くのを無効にする firefox プラグイン、 “Menu Wizard”を入れることで解決できた。

このプラグイン、バグっているのか再起動すると、設定が消えるので、 ブラウザを立ち上げるたびに設定しないといけないのが難点。 Shift-Alt-M で設定画面が開くのでそこで設定する。

さよなら Emacs

これで Jupyter Notebook が markdown ではなく org-mode でかければ最強なのだけれどもそんなマイナーなニーズには対応していない。

とはいえ、データサイエンティストを目指すには Emacs とはおさらばだ!!