FXシステムのダウンロード (2017/04/13)

ここで言う「FXシステム」とは私が作成した「forex_system.py」ファイルのことである。

以下のコマンドを実行して「forex_system.py」ファイルを「~/py」フォルダーにダウンロードする。

$ wget -P ~/py https://raw.githubusercontent.com/fxst24/fxst24/master/forex_system/forex_system.py

lognorm()関数の引数指定 (2017/04/12)

SciPyのlognorm()関数は引数の指定が分かりにくい。

例えば、LibreOffice Calcで適当なセルに「=LOGNORMDIST(4,3.5,1.2,1)」と入力すると「0.0390835557」と返される。

「4」は調べたい数値(対数にする必要はなく、そのままでよい)、「3.5」はデータを対数に変換した後の平均、「1.2」はデータを対数に変換した後の標準偏差、「1」は戻り値として累積分布を指定、という意味である。書式はExcelと同じである(Excelの場合は「LOGNORM.DIST」()関数)。

これと同じことをSciPyでやるには

import numpy as np
from scipy.stats import lognorm
lognorm.cdf(x=4, s=1.2, loc=0, scale=np.exp(3.5))

のようにする。

0.039083555706800471

つまり、「x」には調べたい数値、「s」にはデータを対数に変換した後の標準偏差、「loc」には0、「scale」にはデータを対数に変換した後の平均を指数に変換(ややこしい)した数値を指定するのである。

SciPyのnorm()関数では

norm.cdf(x=1.0, loc=0, scale=1)

とした場合、xは同じだが、「loc」は平均、「scale」は標準偏差を意味する。ここに注意しないと間違える。

Twitter botの作成② (2017/04/11)

サンプルプログラムの作成

Twitter APIには「REST API」、「Streaming API」、「Sample API」などがある

。REST APIは過去のツイートを検索できる機能もあって、よく使われていると思う。だが、検索にかかるのはほんの一部なので、検索結果を元に統計分析を行うのには適していない。

Streaming APIはリアルタイムですべてのツイートが流れてくる。だが、日本語での検索がうまくいかないようだ。

そこで今回はSample APIを使ってみる。

Sample APIはツイート全体の1%しか利用できない。だが、その1%が無作為に選ばれているのであれば(どのように選ばれているかは知らないが)、それなりに全体を代表していると言えるだろう。1%といってもデータは大量で、REST APIとは比較にならない。

以下のコードを「test_bot.py」ファイルとして「~/py」フォルダーに保存する。

「# キー、アクセストークンを設定する。」のブロックは「Twitter botの作成①」でメモしたものに書き換える。

# coding: utf-8

import sys
import time
import twitter
from datetime import datetime

# キー、アクセストークンを設定する。
#consumer_key = "*************************"
#consumer_secret = "**************************************************"
#access_token_key = "**********-***************************************"
#access_token_secret = "*********************************************"

if __name__ == "__main__":
    api = twitter.Api(
        consumer_key=consumer_key, consumer_secret=consumer_secret,
        access_token_key=access_token_key,
        access_token_secret=access_token_secret)
    argvs = sys.argv
    query = argvs[1]
    count = 0
    i = 0
    while True:
        # 回線不通の場合を処理する。
        try:
            for line in api.GetStreamSample():
                # 空のデータが流れてきた場合を処理する。
                try:
                    now = datetime.now()
                    count = count + line["text"].count(query)
                    interval = now.minute % 1 == 0 and now.second == 0
                    if i == 0 and interval:
                        print(
                            now.strftime("%Y-%m-%d %H:%M:%S"), query, " = ",
                            count, "回")
                        count = 0
                        i = 1
                    if interval == False:
                        i = 0
                except:
                    # 何もしたくないのでパスする。
                    pass
        except:
            print("回線不通です。")
            time.sleep(60)

使い方

記事を書いている時点で話題になっているのは浅田真央選手の引退だろうか。そこで「浅田真央」というキーワードが使われた回数を5分ほど数えてみた。

以下のコマンドを実行してTwitter botで「浅田真央」を検索する。

%run ~/py/test_bot.py 浅田真央


2017-04-11 23:04:00 浅田真央  =  3 回
2017-04-11 23:05:00 浅田真央  =  3 回
2017-04-11 23:06:00 浅田真央  =  5 回
2017-04-11 23:07:00 浅田真央  =  1 回
2017-04-11 23:08:00 浅田真央  =  1 回

「浅田真央」というキーワードは5分間で13回使われた。これが全体の1%だとすると、単純計算で1300回。1日に換算すると35万回を超える。かなりの人が浅田真央選手の引退に関心を持っているように見える。

参考リンク

python-twitterのドキュメント

https://python-twitter.readthedocs.org/en/latest/

Twitter botの作成① (2017/04/11)

アプリ作成者としての登録

Twitterでbotを使用するには先ずアプリ作成者として登録する必要がある。

①Twitterのアカウントを作成する。

アカウント作成の手順はあえて書く必要もないと思うので省略する。Twitterをやっている人なら、そのアカウントを使ってもいい。だが、もしそのアカウントに携帯電話番号を登録していない場合は登録する必要がある。

②以下のアドレスをクリックする。

https://apps.twitter.com/

③右上隅の「Sign in」をクリックする。

④「Twitterにログイン」でIDとパスワードを入力し、「保存する」にチェックを入れ、「ログイン」をクリックする。

⑤「Create New App」ボタンをクリックする。

⑥「Application Details」で「Name」にアプリの名前、「Description」にアプリの説明、「Website」にウェブサイトのアドレスを入力する。

Webアプリを作るのでなければ、ウェブサイトは実在しないアドレスでも構わないようだ。

⑦「Developer Agreement」で「Yes, I have read and agree to the Twitter Developer Agreement.」にチェックを入れる。

⑧「Create your Twitter application」ボタンをクリックする。

キーとアクセストークンの取得

上に続けて実行する。

①「Keys and Access Tokens」タブをクリックする。

②「Consumer Key (API Key)」と「Consumer Secret (API Secret)」をメモする。

③「Create my access token」をクリックする。(※)

④「Your Access Token」で「Access Token」と「Access Token Secret」をメモする。(※)

※ 私が取得したときはこのようであったが、以来、新しいアプリは作っていないので未確認。

python-twitterのインストール

python-twitterはPythonでTwitterのAPIを動かすライブラリである。他にも多くのライブラリがあって、どれがよいか分からない。とりあえず、更新頻度が高く、活発そうなのでこれにした。

以前、通常バージョンはPython3では正常に動かなかったので(今はどうか確認していない)、開発バージョンをインストールする。

$ pip install --upgrade git+git://github.com/bear/python-twitter.git

ファイル名が一部不明な場合のリネーム (2017/04/08)

ファイル名が一部不明な場合にリネームするコードをPythonで書いてみる。

例えば「text@@@@.txt」というファイルがあるとする。これを「text.txt」にリネームしたい。だが、ファイル名が「text」から始まっているのは知っているが、「@@@@」が何か分からない場合、どうするか。

ワイルドカードを使って、「text*.txt」としてもエラーになる。「*.txt」ならエラーにはならないが、それでは拡張子がtxtのすべてのファイルが対象になってしまう。簡単そうで、意外と難しい(私だけ?)。

あれこれ試行錯誤した結果、あまりすっきりはしないが、一応の方法を見つけた。例として、作業ディレクトリに「text1234.txt」ファイルがあるとして、これを「text.txt」にリネームする。だが、「1234」の部分が正確にはどうであるかは分かっていない。

import glob
import os
new_name = 'text.txt'
for old_name in glob.glob('text*.txt'):
    os.rename(old_name, new_name)


「text1234.txt」ファイルが「text.txt」ファイルにリネームされる。「なんだ、「text*.txt」でもできるじゃないか」と思われるかもしれない。だが、これはglobを噛ませているからできるのである。

単にos.rename('text*.txt', new_name)とやるとエラーになる。