Life is Like a Boat

忘備録や経済、投資、プログラミングに関するメモやtipsなど

Nuxt.jsのGoogle Analyticsモジュールを使ってEventのトラッキングをする

ここ最近、Netlify + Nuxt.jsの組み合わせでサイトやフォームを作っています。

サイトを訪れたユーザのアクションを計測したいのですが、Nuxt.jsのGoogle Analyticsモジュールを使うとかなり簡単にできるます。以下その忘備録です。

nuxt.config.js

  modules: [
    '@nuxtjs/axios',
    '@nuxtjs/bulma',
    ['@nuxtjs/google-analytics',
      {id: 'UA-YOUR_GA_TRACKING_ID'}
    ]
  ],

任意のコンポーネントからは this.$ga でアクセスできます。

this.$ga.event('Videos', 'play', 'Fall Campaign', 1)

developers.google.com

例えばあるボタンを押したというユーザのアクションをGoogle Analytics側でイベントとして計測したい場合、@clickで呼ばれるfunction内にthis.$gaを記述してあげるといいはずです。

GA側ではこんな風に表示されます。 f:id:nerimplo:20190508104353p:plain

Nuxt.jsビギナーズガイド―Vue.js ベースのフレームワークによるシングルページアプリケーション開発

Nuxt.jsビギナーズガイド―Vue.js ベースのフレームワークによるシングルページアプリケーション開発

Vue.js & Nuxt.js超入門

Vue.js & Nuxt.js超入門

バフェット・コードのAPI機能を使ってデータをPandasのDataframe化する

年初にCAMPFIREでバフェット・コードがファンドレイズしてまして、有料機能がお得に使えるので一口申し込みました。

以下、その有料機能の目玉の一つであるAPI機能を使ってデータを取得、PandasでDataframe化するまでの記録です。

手順としては、

  • バフェットコードのマイページ画面からAPIキーを取得。

f:id:nerimplo:20190326174520p:plain

  • API仕様書を読みながらURLパラメータをセット

仕様書はこちらです。https://docs.buffett-code.com/

例えば、1333マルハニチロの2017Q1から2018Q4のデータが欲しい場合、curlだとこんな感じになります。

curl "https://api.buffett-code.com/api/v1/quarter?tickers=1333&from=2017Q1&to=2018Q4" \
     -H 'x-api-key: YOUR_API_KEY'
  • Pythonのrequestsモジュールを使いリクエストして戻ってきたJSONをPandasのDataframe化

が大体の流れです。

作業に使ったJupyter Notebookをgistで共有してます。詳しくはこちら。

25日移動平均線を上回る銘柄の比率 3月22日現在

株価が25日移動平均を上回っている企業の割合です。極な局面を判断するのに使えるかなと思っている指標です。 3月に入って急落した後、直近だと5割超えて推移しています。

f:id:nerimplo:20190323132354p:plain

ついでに、自分としては勝率のいい時価総額上位6分位の企業群のうち、25日線からの剥離率上位10銘柄。

f:id:nerimplo:20190323134616p:plain

DjangoでOR検索したい時

Djangoを使ったWebアプリでOR検索したいシーンがあると思います。

例えば店の紹介文からアイスクリーム屋かケーキ屋、たこ焼き屋、etc...を検索したい時、SQLだとこんな感じでWHERE句を作ると思います。

WHERE (description LIKE %アイスクリーム% OR description LIKE %ケーキ% OR description LIKE %たこ焼き%))

DjangoではQ objectを使うやり方で、下記のようになります。

cafeList = Cafe.objects.filter(Q(description__contains = "アイスクリーム") or Q(description__contains = "ケーキ") or Q(description__contains = "たこ焼き"))

Q objectを連結させていくイメージなのですが、Q objectの数が動的に変わる場合はどうするのでしょうか。先日参加したDjangoのもくもく会でakiyokoさんに教えてもらったのが、下記のようなやり方です。

検索フォームから"アイスクリーム ケーキ たこ焼き "

keywords = ["アイスクリーム", "ケーキ", "たこ焼き"]
for keyword in keywords:
   # 'or' the Q objects together
   q_objects |= Q(description__contains=keyword)

パイプとイコールサインを組み合わせるシンタックスって初めてみたんですが、こうするそうです!

python - How to dynamically compose an OR query filter in Django? - Stack Overflow

Django学習にオススメの書↓

現場で使える Django の教科書《基礎編》

現場で使える Django の教科書《基礎編》

現場で使える Django の教科書《実践編》

現場で使える Django の教科書《実践編》

APSchedulerを使ってcronやHeroku Schedulerにサヨナラする

例えば、定期的にデータをどこから引っ張ってきてDBに落としたい時にVPSではcron、HerokuではHeroku Schedulerを使っていたのですが、APSchedulerが良いとなんども聞いたので、@kabkansaiさんのブログを参考にHeroku Appで使ってみました。

www.stockdog.work

BlockingSchedulerが一番シンプルな使い方ができるクラスだと公式にありました。ですので今回は、これを元にいろんなケースを考えてみました。

月曜から金曜までの11:50にjob.run()を実行する

from apscheduler.schedulers.blocking import BlockingScheduler
import job

if __name__ == '__main__':
    scheduler = BlockingScheduler({'apscheduler.timezone': 'Asia/Tokyo'})
    scheduler.add_job(job.run, 'cron', day_of_week='mon-fri', hour='11', minute='50')
    scheduler.start()

毎日9時、11時、16時、17時に実行する

scheduler.add_job(job.run, 'cron', hour=‘9,11,16,17’)

毎月最終日曜日の0:00に実行する

scheduler.add_job(job.run, 'cron', day='last sun')

月曜から金曜の15:10から21:10まで1時間おきに実行する

scheduler.add_job(job.run, 'cron', day_of_week='mon-fri', hour='15-21', minute='10')

6月から8月、11月から12月の第2金曜日の0時半、1時半、2時半、3時半に実行する

scheduler.add_job(job.run, 'cron', month='6-8,11-12', day='2nd fri', hour='0-3', minute='30')

これ複雑すぎますよね!公式に書いてあった例を少し変えたものです。

私はcronのsyntaxを覚える気が昔から全くなくてですね笑、これだとわかりやすいですよね!

Django + Bulma + Heroku Postgresで景気ウォッチャー調査のコメントを検索する

政府統計の問題が国会を賑わせていますが、毎月勤労統計のダウンロード可能なデータのフォーマットは本当にひどかったですよ。少なくとも去年の夏頃見た時は。

f:id:nerimplo:20190217170830p:plain

このさらに下には余白の行と別のテーブルヘッダーがついてページ2, ページ3というふうに続いていくのですが、どうやったらこんな出力できるのか、逆に知りたいくらいです。

こちら側としては、やりたい事は分析や洞察を得たり、傾向を掴むことなのにその前段階の処理でどうして時間使わないといけないのか。我々の税金が政府統計の収集の原資になっているのにそれが広く加工可能な状態で提供されていないなんて、どの口でデータ・ドリブン経済なんて今年の世界経済フォーラムで言うとるんや、と悪態をつきたくなりますわ笑

閑話休題。このブログでも何度か紹介しているのですが、景気ウォッチャー調査は

全国のそれぞれの地域の景気に関連の深い動きを観察できる立場にある人々の協力を得て、地域ごとの景気動向を的確かつ迅速に把握する目的で作られた統計 (内閣府より)

です。

地域の景気に関連の深い動きを観察できる立場にある人々は例えば 会計士、企業経営者、タクシー運転手、小売店店主や営業部門で働いている人々です。「良くなっている」~「悪くなっている」の5段階の評価とその理由が公表されます。

理由のコメントを読んでいると実に興味深く製造業であれば受注が急減した、夏まで好調だったのにガラッと変わったとか、インバウンド消費が減った等自分の知らない業界ではこんな事が起きているのだなと把握できるわけです。もちろん調査対象となった人の主観が入っているコメントなのでその辺も差し引いて考える必要はあると思います。

f:id:nerimplo:20190217172734p:plain

こうした定性的な情報を手軽に検索したいなと思ってDjangoで作ってみたのが「見える景気ウォッチャー調査」です。 https://mieru-econ-watcher.herokuapp.com/

「見える」と言いつつ今の所コメントを検索して「読む」だけなんですが、グラフやテーブルを加えてインフォグラフィックス的な部分も加えていきたいなと思います。データセットは2010年以降分があり、順次追加する予定です。

Django + Bulma + Heroku Postgresの組み合わせです。

こんな機能欲しいなど要望があればぜひ連絡ください!

VPS上にあるMongoDBからデータを抽出する

f:id:nerimplo:20190216140152j:plain Sakura VPSをかれこれ5年くらい使っています。いまのプランはメモリ1GでSSD30Gまであるのですが、ダウンロードやデータ数が膨らみduコマンドで使用量を調べると90%を超えるようになっていました。誰がこんなクソコード書いたんだよと思うくらいレガシー笑のコードもあります。vi使って直接バグ直したこともあったのでもう変更履歴とかわかんない、そんな使用状況です。

様々な要因を考慮してVPSで管理する必要なくなってきているので、今年から移行できるものをHeroku Postgresに移そうとしているところです。そのうちの一つがMongoDBです。

MongoDBはNoSQLに分類されるものの一つで、なぜ使っていたかというと当初は後からいろんなデータの項目が増えるだろうと想定していました。5年くらいデータ貯めてきて結局、項目増えなかったなというのが現実でして、実際のところリレーショナルDBで十分でした。

なので、今回の移行作業はMongoDB->CSV,JSON -> Postgresに投入(SQLAlchemey)という流れです。

同じような移行作業に直面している人がいるかわかりませんが、以下、MongoDBのドキュメントをCSV,JSONをエクスポートするまでの作業メモです。

SSHポートフォワーディング

VPS上のMongoDBにローカルPCからアクセスしたいので、そのための導線を作ります。

Terminalから ssh -L [Localのポート]:[VPSのIP]:[VPS上のMongoDBのポート] [VPSにSSHするユーザ名]@[VPSのIP] -p [SSHポート]

します。SSHポートフォワーディングというやつです。

MongoDB Compass

MongoDBはMongoDB CompassというUIからDBの操作ができるアプリを提供しています。IPOした会社だけあって使いやすさを考えてますわ。

これをダウンロードして接続先を設定します。Portの部分が32123となっていますが、Terminalで指定した[Localのポート]と同じで空いているポートならなんでもOKです。

f:id:nerimplo:20190216121344p:plain

Compass側の設定はこれだけです。簡単すぎてわろたレベル。

接続すると

f:id:nerimplo:20190216121609p:plain

が出てきます。あとはDB選んで操作したいコレクションを選んでUIからサクサク作業できます。JSONやCSVでのExportが可能です。アドホックなクエリも実行できますよ!

MongoDB: The Definitive Guide: Powerful and Scalable Data Storage

MongoDB: The Definitive Guide: Powerful and Scalable Data Storage