Life is Like a Boat

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

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

2月の景気ウォッチャー調査メモ

2月8日に景気ウォッチャー調査が内閣府から発表されました。

先行きがプラスに転じるというのが個人的には予想外だったのですが、今回の調査内容で気にしていたのはインバウンド消費です。

ご存知の通り、今年から中国EC法が施行されました。事前に予想されていたのは転売目的の個人・小規模バイヤーが規制されることで、百貨店や小売店などでの購入が少なくなるというものでした。

百貨店の現場の声を景気ウォッチャー調査のコメントから拾ってみると、インバウンド消費に関しては影響が出ているようです。

百貨店 企画担当 近畿 2019-02-08
暖冬によるセールの不振の影響は、今月に限定されるため、来月以降は改善に向かう見通しである。ただし、インバウンド売上は今月と同様に代理購買者による売上減少がかなり見込まれるため、今月と同じような売上の不振が続きそうである。

こちらも近畿の百貨店。大幅な前年割れとのコメント。

百貨店 販売推進担当 近畿 2019-02-08
大幅な増加が続いていたインバウンド売上は、中国での電子商取引法の施行などで大幅な前年割れとなっている。国内需要は前年並みで、衣料品の品ぞろえは前年よりも豊富にあるものの、セール時期になっても動きは鈍く、前年比で微減となっている。特選ブランドや高額な時計は引き続き好調に推移しているが、インバウンドを含む店全体の売上は、前年の水準に届かない見込みである。

東京を含む南関東の百貨店からです。化粧品などの購買へ影響が出ているようです。

百貨店 営業担当 南関東 2019-02-08
朝早くから多くの客の開店待ちがあった初商以降、天候の影響もあり来店客数は増加しているが、例年人気の福袋は実用性の高い食品中心で、株価や為替の影響か、宝飾関連の高額福袋や絵画、工芸品などが苦戦している。また、中国電子取引法の規制強化により、代理購入者でも営業許可証の取得が必要となり、化粧品などの購買に影響し、インバウンド効果が鈍化している(東京都)。

化粧品と言えば、先週資生堂が過去最高の決算発表をしました。 https://www.mag2.com/p/money/636259

書き起こしからポイントを抜き出すと

  • 中国電子取引法の影響が大きく出ていることは事実みたい。
  • 1月の1ヶ月間で、プレステージ(資生堂の中国ブランド)の店頭売上は40パーセント以上伸びた。マーケットの伸びよりも、高い。
  • この数字を見る限りにおいては、減速感はない

これらを総合して今後2-3ヶ月の方針を考えると、インバウンド消費で売上をあげていた百貨店のような小売セクター は見送り、中国での販売網(天猫などに出品している)を有する化粧品セクターは押し目買いの機会を伺うという感じかなと思います。

相場の過熱感を把握する

昨年から全体の過熱感をなんとなく把握しておくのにどの指標がいいかなと色々模索しています。

米株でいうとCNNのFear & Greed Index。知名度高い騰落レシオで、有名どころではストックブレーンさんのここにアクセスしている人も多いと思います。 nikkei225jp.com money.cnn.com

証券会社が提供している騰落レシオの数字は1部採用銘柄の騰落レシオであって、もっと詳しく、例えば時価総額別でみたり、日本の株式市場に上場している全銘柄をカバーしているデータはなかなかないのが現状です。なので個人的には手元にあるKabu+のデータを分割調整し、これを使い回して計算しています。

もう一つ見ているのが25日移動平均を上回っている銘柄の割合です。

詳しくバックテストなど計算していないのですが、去年1月以降だけをみるとこの割合が10%以下で買い、65%以上から売りであれば大体利益出せた感じがします笑。

f:id:nerimplo:20190204105908p:plain

直近で言うと特に昨年の12月25日。時価総額上位10%で25日移動平均線を上回っている銘柄はわずか0.27%でした。

振り返ればなんとでも言えるわけですが、12/25には本当に隠の極でした。ここで買えた人にとってはある意味サンタのプレゼントだったかもしれません。

nerimplo.hatenablog.com

中国からのインバウンド消費

景気ウォッチャー調査のコメントをよく見ていると、昨年秋ごろからバイヤーの購入についての下記のようなコメントが見受けられます。

来年に中国で施行される予定の税金対策により、バイヤーによる購入が減少する可能性がある。また、順調なのは化粧品などの限られた商材であり、アパレルは苦戦している。特に、大手アパレルメーカーの決算が悪化する可能性が高く、ショップやブランドの改廃、商品の生産減少、投資の抑制などにつながるため、景気は悪化する。(百貨店 売場主任 近畿 2018-12-10 )

このコメントは12月分なので調査自体は11月中旬〜12月上旬にかけて行われたと推測されます。

中国で施行される〜の下りは中国電子商取引法の事です。

中国電子商取引法は来年1月に施行。代理購入者業界に大打撃 | チャイトピ!

リンク先の記事にも言及されていますが、バイヤーの購入がどれだけ減るか注目です。

数値は観光庁が訪日外国人の消費支出統計を取っているので、ここで確認できると思います。

訪日外国人消費動向調査 | 統計情報 | 統計情報・白書 | 観光庁

こちらは速報性で劣るので、小売の月次を見る方がいいかもしれません。ドンキHDが月次の売上速報を翌月10日前後に出してます。

https://www.release.tdnet.info/inbs/140120190110458390.pdf

小売企業レベルでみると、バイヤー購入減少で減るかもしれない売上分はどうなるかというと、もし需要が変わらなければ越境ECの売上増などに現れてくるのではないでしょうか。

インバウンド消費 x 小売株で投資しているなら対象企業が天猫などでモールを出しているか、チェックするポイントだと思います。