FitbitのAPIを使う(1)API登録
FitbitのデータをDBに保存する方法について書いておきます。今回はAPI登録について
Fitbit の APIを管理するサイトにアクセス(必要に応じてログイン)
www.fitbit.com
右上のアプリを登録より、以下のように入力して登録
Application Name *:好きなアプリケーション名
Description *:アプリケーションについて
Application Website *:自分のサイト?
Organization *:personalとか?
Organization Website *:自分のサイト
Terms Of Service Url *:自分のサイト
Privacy Policy Url *:自分のサイト
OAuth 2.0 Application Type *:Personal
Callback URL *:http://127.0.0.1:8080/
Default Access Type *: Read & Write
登録するとclientIDなどが出てくる。ここにある情報は必要になるので、覚えておく。
OAuth 2.0 tutorial pageをクリックする
- We've generated the authorization URL for you, all you need to do is just click on link below:
の下のリンクをクリックする
取得許可するデータを選択
次のようになればOK。このとき、出てきたurlをコピーしておく。
ひとつ前のサイトにコピーした張り付ける
この時表示されたtokenをコピーしておく(これがないとデータ取れない)
自作のマークシートを読み取りたいときに使うソフトウエアFormScanner
自作のマークシートを読み取り、csv化したいときに使うFormScannerについて書いておきます。
自作のマークシートを使いたいひと、無料のソフトウエアが良い人向けです。
FormScannerについて
私がこのソフトウエアを使うときに参考にさせてもらったサイト「FormScanner」の使い方に書いてありますように、
FormScanner概要
FormScannerはフリーのOMR(光学式マーク読取)ソフトウェアです。
オリジナルのマークシートによって、アンケートの集計やマークシートを用いた試験の採点ができます。
フリーソフトですので、もちろん無料で利用可能です。
また、ソフトウェアが現在進行形で開発され続けている点も強みであります。
ただし、日本語版は無く、また公式サイトのマニュアルも非常にざっくりしているため、本サイトを通じて日本に向けてFormScannerを紹介したいと思います。
本当に日本語版がなく、使いこなせるようになるまで時間がかかりました。以下、簡単な使い方を記しておきます。
FormScannerのダウンロード
FormScannerは、以下のリンクよりダウンロードしてexeファイルを実行すればOKです。
この時、javaがパソコンに入っている必要がありますので注意してください
FormScanner - Browse /1.1.3 at SourceForge.net
実行すると言語を聞かれます。Englishにしましょう
Next
同意してNext
アイコンをデスクトップに置くかどうか、は好きにしてください
これで完了です。Finishを押すと再起動がかかります。
もしも、アプリケーションを実行したときにJavaがないというエラーが出てきたら、
手順に従って無料JavaソフトウェアをダウンロードからJavaをダウンロードして、Pathを通してください。
FormScannerの使い方
FormScannerでは大きく分けて2つの作業があります
①読み取りテンプレートを作成する
②読み取りを行いcsv化する
でもその前に、
⓪マークシートを作成する、スキャンする
が必要です。1つ1つ手順を追って説明します。
⓪マークシートを作成する、スキャンする
読み取るためのマークシートを作成します。サンプルとして、下記のリンクにあるものを編集して使いました。
Forms - FormScanner
基本的には四隅に大きなマーク(サンプルだと円)が必要になります。
これがないと、読み取る際の目標点が見つからずマークシートを読み取ることができません。
私の場合は、以下のようなマークシートを作成しました。
そしてスキャンを行います。この時注意が必要なのですが、、、
必ず白黒スキャンしてください!グレースケール・カラースキャンをするときちんと読み取れないことがあります。
また、必ず画像ファイルにしてください(PDFなどの場合は、変換するなどの対応をしてください)
①読み取りテンプレートを作成する
読み取り用のテンプレートを作成していきます。
テンプレートを作成するときは、templateー>create…を選択します
読み取りを行う画像を選択します。
読み取るフィールド要素を聞いてきます。+で追加します。
今回は横方向に要素が並んでいるので~columnを選択します。
(縦方向の場合は~row)
要素名は何でもいいです。今回は何となくnumber。
マークシートの数は7つ、選択肢は10個あるので数を入力しておきます。
また複数選択を許容しないので、Igonre multiple choiceにチェックを付けます
(バグなのか、↑を一番最後に押さないと、confirmが押せません)
すると、マーカーに合わせて緑色の枠が出ていると思います。
きちんと自分のマーカーにあって出ていればOKです
そしてはじめと最後の要素をクリックします。今回でいうと、左上のマーク位置と、右下のマーク位置です。
左上のマーク位置↓
もしも、赤いマーカーが大きすぎるor小さすぎる場合にはoptionのマーカーサイズより変更できます。
両方クリックすると、座標が表示されます。問題なければ続けます。
そうでなければキャンセルすればもう一度クリックしなおすことができます。
今回、それぞれのマークは0~9の数字なので現在A,B,C…となっている部分を変更していきます。
これで問題なければテンプレートを保存します
日の出入りと気象データのスクレイピング
研究で気象データと日の出入りデータを使いたかったので、スクレイピングしてみました。
python(BeautifulSoup)を利用して、
気象庁|過去の気象データ検索と各地のこよみ (日の出入り、月の出入り、南中時、月齢) - 国立天文台暦計算室のデータをスクレイピングする
気象データ
気象庁|過去の気象データ検索
今までスクレイピングしたことがなかったので、以下のサイトをとても参考にしてプログラムを作成しました。
【最新】GoogleColaboratoryでもできる!気象庁の過去気象データをスクレイピングしてみた。 - Qiita
上のサイトでは複数の地点を一度にスクレイピングしていますが、私は一つの拠点でのスクレイピングをしました。
私のプログラムはここから→WeatherScraping · GitHub
日の出入りデータ
各地のこよみ (日の出入り、月の出入り、南中時、月齢) - 国立天文台暦計算室
上での経験を応用して、静岡県の日の出入りデータをスクレイピングするプログラムを作成しました。
また、ついでにDBへのuploadもしています。
プログラムはここから→WeatherScraping · GitHub
cakephp find でsql のcount使う方法と注意点
ひとつ前に書いたブログの内容、
sqlのcount使う方法と注意点 - My Note
は、実はCakePHPのfindで実装したかったときにはまった罠でした。
今回は、cakephpのfindでsqlのcount使う方法と注意点を書いていきます。
CakePHPでsql のcount使う場合、次のようなプログラムを書きます。
SELECT `device_id`,count(if(`gender_id`=0,1,null)) as count0,count(if(`gender_id`=1,1,null)) as count1 FROM `tables` group by `device_id` order by `device_id`
↓
$this->Table->virtualFields['count0'] = 0; $this->Table->virtualFields['count1'] = 0; $tables = $this->Table->find('all', array( 'fields'=> array('Table.device_id', 'count(if(gender_id=0,1,null)) as Table__count0', 'count(if(gender_id=1,1,null)) as Table__count1'), // エイリアスにする 'group' => array('Table.device_id'), // GROUP BYのフィールド 'order' => array('Table.device_id'), 'recursive' => -1, // int ));
なぜ、virtualFieldsを利用するかというと使用しないとTableのdevice_idと同じ配列に入れないためです。
集計をするためには同じ配列に入っていたほうが良いので、virtualFieldsを利用しました。
sqlのcount使う方法と注意点
sqlでcount()を使用するときに、罠にはまってしまったので、書いておきます。
複数の条件でのcount()の使い方
→if文を利用する。条件に合致しなかったときはnullにする必要がある
たとえば、以下のようなテーブル(tables)があるとします。
一つの要素でのカウント
device_idごとの数を数える場合は、次のようなSQLを実行します。
カウントした値を入れる要素はcountとする(count(`device_id`) as count )
device_id順に並べる(order by `device_id`)
これは問題なくできました。
SELECT `device_id`,count(`device_id`) as count FROM `tables` group by `device_id` order by `device_id`
複数要素でのカウント
では、device_idごとにgender_idがそれぞれ0と1のものの値をカウントしてみましょう。
そこで以下のように実行してみると、、、
SELECT `device_id`,count(`gender_id`=0) as count0,count(`gender_id`=1) as count1 FROM `tables` group by `device_id` order by `device_id`
count(`gender_id`=0) as count0,count(`gender_id`=1) as count1としているのに、結果が同じになってしまいました。
どうやらif文を使う必要があるようなので、使ってみます。
SELECT `device_id`,count(if(`gender_id`=0,1,0)) as count0,count(if(`gender_id`=1,1,0)) as count1 FROM `tables` group by `device_id` order by `device_id`
それでも同じ結果になってしまいました。どうやら、if文で条件文に合致しなくても0としてしまうと、数としてカウントしてしまうみたいです。
そこで、0ではなくnullにしてみます。
SELECT `device_id`,count(if(`gender_id`=0,1,null)) as count0,count(if(`gender_id`=1,1,null)) as count1 FROM `tables` group by `device_id` order by `device_id`
できました!よかった!!!!
pythonでmySQLに接続する
備忘録です。自分のメモです。
mySQL接続
#database接続 import mysql.connector dbh = mysql.connector.connect( host='ホスト名', port='3306', db='データベース名', user='ユーザ名', password='パスワード', charset='utf8' ) cur = dbh.cursor()
データ取得:select文
#data取得 cur.execute("SELECT `id`,`comment` FROM `テーブル名`") for row in cur.fetchall(): print(row[0])
cur.executeの後にselect文を書きます。データは cur.fetchall()に入っているので、一つ一つ取り出す場合はfor文を用います。
一番初めの要素(今回でいうとid)を表示する場合は、row[0]。
データアップデート:update文
sql = "UPDATE `テーブル名` SET `要素名`=%s,`要素名`=%s,`要素名`=%s WHERE `id`=%s" val = (labelnum, result[1][0], str(modified), int(row[0])) try : cur.execute(sql, val) except : print('Duplicate entry for key PRIMARY') dbh.commit()
fastTextで文章分類(python)
文章を分類したくなったので、fastTextを用いて分類することにしました。
データ
今回は元々収集していたtweetデータを用いて分類していきます。今回私は、3つのカテゴリに分割しました。
ラベル1:人が呟いたもの
ラベル2:人が呟いたけれど何かのアプリケーション、botを介している?
ラベル3:企業が宣伝でtweet
以下のようなcsvファイルを作成します。今回私が学習に利用するデータは全部で200件です。ファイル名はtrain_data.csvとします。
形式は以下のような感じです。
ラベル(__label__*),tweetの文章 *には数字が入ります。
__label__1,江戸時代の五街道における宿場で東海道五十三次の中間点となる27番目の宿場は袋井宿ですが中山道六十九次の中間点となる35番目の宿場はどこでしょう? __label__2,"湖西.浜松.磐田.袋井.森,掛川,菊川,御前崎,牧之原,吉田,川根,島田,藤枝,焼津,静岡,富士,富士宮,沼津,三島,清水,長泉,裾野,御殿場,小山,伊豆,伊豆の国,熱海,伊東,函南,河津,西伊豆,南伊豆,松崎,下田... #静岡" __label__3,駐車場並列2台付!オール洋室に変更済み! 袋井市 堀越のアパート 家賃42000円 https://t.co/QR5L8fcAih #fukuroi #袋井 の #賃貸 物件 https://t.co/nr9HoXqsTW https://t.co/DMUrBFoOtx
環境設定
fastTextのインストール
git clone https://github.com/facebookresearch/fastText.git
cd fastText make
pip install cython pip install fasttext
文章分類プログラム(python)
学習用データ作成
学習用データの文章を分かち書きしていきます。流れはcsv読み込み→分かち書き→txt保存です。
csvデータを一気に読み込み、一文ずつ分かち書きを行い保存しています。
#csv読み込み→分かち書き→txt保存 import sys import MeCab import csv #csv読み込み csv_file = open("train_data.csv", "r", errors="", newline="" ) csv_data = csv.reader(csv_file, delimiter=",", doublequote=True, lineterminator="\r\n", quotechar='"', skipinitialspace=True) mecab = MeCab.Tagger ("-Owakati") #分かち書き設定 list_row = [] #分かち書き結果を保存 path_w = 'train_data.txt' #分かち書き済み学習用データ保存ファイル名 for row in csv_data: text = mecab.parse (row[1]) list_row.append((row[0]+' '+text).rstrip("\n")) f = open(path_w, 'w') for x in list_row: f.write(str(x) + "\n") f.close()
すると以下のようなtxtファイルが出力されます。わかりにくいですが、きちんと分かち書きされています。
__label__1 江戸 時代 の 五 街道 における 宿場 で 東海道 五 十 三 次 の 中間 点 と なる 27 番目 の 宿場 は 袋井 宿 です が 中山道 六 十 九 次 の 中間 点 と なる 35 番目 の 宿場 は どこ でしょ う ? __label__2 湖西 . 浜松 . 磐田 . 袋井 . 森 , 掛川 , 菊川 , 御前崎 , 牧之原 , 吉田 , 川根 , 島田 , 藤枝 , 焼津 , 静岡 , 富士 , 富士宮 , 沼津 , 三 島 , 清水 , 長泉 , 裾野 , 御殿場 , 小山 , 伊豆 , 伊豆 の 国 , 熱海 , 伊東 , 函南 , 河津 , 西伊豆 , 南伊豆 , 松崎 , 下田 ... # 静岡 __label__3 駐車 場 並列 2 台 付 ! オール 洋室 に 変更 済み ! 袋井 市 堀越 の アパート 家賃 42000 円 https :// t . co / QR 5 L 8 fcAih # fukuroi # 袋井 の # 賃貸 物件 https :// t . co / nr 9 HoXqsTW https :// t . co / DMUrBFoOtx
学習
fastTextを用いて学習していきます。学習するには以下のコードを実行するだけです。学習回数(epoch, loss...)などは自分で最適だと思う値にしてください。
すると、model.binと言う名前のモデルが作成されます。
#fastTextで学習 import fasttext as ft model = ft.train_supervised("train_data.txt", label_prefix='__label__',epoch=1000, loss="hs") model.save_model("model.bin")
分類
分類するには以下のコードを実行するだけ!
model.predict('*******ここに文章を入れます***** ')
例えば
もし、ラベル名と精度を出力したければ、以下のようにすれば良いです。
result = model.predict('フッピー 可愛い') print(result[0][0] + ':' + str(result[1][0]))
この時、result[0][0] にラベル、result[1][0]に精度が入っています。
参考資料
New release of python module · fastText
このブログを見てやろうと思った
機械学習で大量のテキストをカテゴリ別に分類してみよう! - WonderPlanet Tech Blog
そのほか
pythonでfasttextを使って文書分類してみた - Qiita
fasttextを用いた言語判定 - Out-of-the-box
fastextでテキスト分類したい - Qiita
csv読み込み書き込み
pythonでのcsvファイルの読み込み - Qiita
Pythonでファイルの読み込み、書き込み(作成・追記) | note.nkmk.me
pythonでlistをファイルに保存し、読み込む方法(numpyも同様!) - 技術メモ集