社内向け市況通知サービスを作りました
目的
ウーオのバイヤーチームは、毎朝7時頃に中央市場のお客さんから注文を取っています。
また、バイヤーチームは注文取りのための情報収集をインターネットや電話で行っていました。
その話を聞いたときに、データ面でバイヤーチームを支援できないか考えました。
そこで、ウーオバイヤーが手間をかけずに、より注文をもらいやすくするためのデータを収集して、機械学習を使ったアプローチができるような仕組みを実装しようと考えました。
ステートメント
ウーオでは、サービスやプロダクト作成時に作るべきものの方向性を定めるためにミッションステートメントを作るようにしています。
具体的には、下記のような項目を埋めていきます。
ターゲット
一言で言うと
サービス価値
キラー要素
機能的ゴール
感情的ゴール
KPI
諦めること
今回のステートメントは、このようになりました。
概要
バイヤーチームが当日の相場を予想するのに前日の市況を確認しますが、各サイトを閲覧する手間を省くために、社内Slackに毎日定時に通知します。
また、データの蓄積を目的として、通知とは別にデータ収集用のプログラムを走らせ、スプレッドシートに保存します。
実装
Heroku上で定時にプログラムを走らせます。
プログラムは前日分の市況が閲覧できるページをSlackに通知するものと、スクレイピングを行い、取得したデータをスプレッドシートに保存するものがあります。
スクレイピングにはSeleniumとBeautifulSoup4を使用しました。
Incoming Webhook
Slackへの通知にはSlackのIncoming Webhookを使いました。
Selenium
SeleniumはWebブラウザの操作を自動化するためのライブラリで、ページ遷移やフレームページ遷移を行います。
ローカルの開発環境では、ブラウザやドライバの設定の煩わしさを減らすためにSeleniumが公開している、Dockerイメージ (https://github.com/SeleniumHQ/docker-selenium) を使っていました。Herokuでの本番環境ではHeroku上にブラウザとドライブを設定する必要があります。
BeautifulSoup4
BeautifulSuop4はHTMLやXMLファイルを解析するためのライブラリで、ページ内のテーブルをPandasのDataFrame型に変換する操作を行います。
Google SpreadsheetのCRUD
PythonのPandasとスプレッドシート間でのやりとりになります。
Googleが提供するgoogle api clientを使いました。
事前にclient_idとclient_secret, refresh_tokenを取得しておく必要があります。
Heroku
Herokuはアプリのデプロイ、稼働、監視を行うためのクラウドプラットフォームで、Schedulerを設けてスクリプトを定期的に実行するために使いました。
また、前述の通りスクレイピングをするためにHeroku上にブラウザとドライブをインストールする必要があるので、heroku-buildpack-google-chromeとbuildpack-chromedriverをそれぞれビルドパックに加え、デプロイ時にインストールされるように設定しておきます。
結果
Slackへの通知結果はこのようになります。
スプレッドシートへの保存はこのようになります。
このようにしてバイヤーチームからフィードバックも得られています。
これから
蓄積したデータベースをもとにモデルを学習し、予測結果をSlackで通知できるようなサービスに広げていけると良いです。
やはり、機械学習を実際のアプリケーションに用いる場合はどういうデータをどのように使うかが鍵になるのでバイヤーの方々にヒヤリングしつつ、扱うデータについて検討する必要がありそうです。