MakeOverMonday_2019w35
Intro
- 先週Tableauユーザー会に参加したのでTableau熱が若干高まっている
- Make Over Mondayを久々に見たらなんとか戦えそうなテーマだった
Input
お題 data.world
改善点 -- このチャートの何が良い?何が悪い? -- もっとわかりやすくするために何ができる?
Output
- 作ったもの
- 意識したところ -- 元グラフの良いところ:時系列を横軸においているところ。色分けをしていて端末ごとの売上差がわかりやすいところ -- 元グラフの良くないところ:割合の話をしているのに図は売上なので、売上ベースだと増えてはいて、伝えたいメッセージが伝わっていない -- 改善したところ:全体に対する割合を元にグラフを作成した。また、シェアの変動がわかりやすいようにテキストでサマリを入れた
ロシアの大都市を図示した
今度ロシアに行くのでふと気になり図示してみた。ロシアの大都市はほとんど西側に寄っているらしい。広い国なのでビジュアライズしがいがあって面白い
Cloud Source RepositoriesとGoogle Compute Engine
概要
Cloud Source Repositoriesに登録したリポジトリの内容を Google Compute Engineで動かしているインスタンスに反映できなかったので解決方法をメモ
エラー文言
PERMISSION_DENIED: Request had insufficient authentication scopes.
解決方法
- Google Compute EngineのAPI設定を変更(Cloud Source Respositoriesから読み取りできるようにする)
- IAMから、Google Compute EngineのサービスアカウントにCloud Sourve Repositoriesへのアクセス権限を付与する
メモ
Cloud Source Repositoriesを使ってみた
概要
- GCP勉強中。今回はCloud Source Repositoriesを触った
前提
- 基本的にこちらの記事に則って手を動かしています
- 記事が書かれた頃に存在していた「Developers」が今はなくなっており、「Cloud Source Repositories」に変わっていたのでメモ
作業手順
- 既存の内容を外からコピー
$ git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git $ cp -rf appengine/standard/flask/hello_world hello_world $ cd hello_world $ git init . $ git add . $ git commit -m “Initial Commit”
ここまで記事のまま
- 「Developers」の代わりにCloud Shell Repositoriesのリファレンスをもとに作業
cd [REPO_DIRECTORY] git config --global credential.'https://source.developers.google.com'.helper gcloud.sh gcloud source repos create [CLOUD_SOURCE_REPOSITORY_NAME] git remote add google \ https://source.developers.google.com/p/[PROJECT_ID]/r/[CLOUD_SOURCE_REPOSITORY_NAME]
あたりの作業を進める
- GCPとローカルが行き来できるようになったので、手元のGitをPush
git push --all google
- ブラウザ上、GCPホーム画面左側のメニューにある「Source Repositories」を選択
- GitっぽいアイコンのSource Repositoriesタブが新しく開き、その中でSourceが確認できる
メモ
- 途中からリファレンスに頼ってしまったけど、ブラウザからある程度操作ができたのかも??
gcloud command not found との戦い
概要
- いろいろありGCPについて学習欲が湧いています
- GCPをgcloudコマンドで動かそうとしたのに「gcloud command not found」エラーにぶつかった
- シェルを再起動したらコマンドで動くようになった
前提
- MacOSでGoogle Cloud SDKをインストールした
gcloud -v
と話しかけても無視されたsource ~/.bash_profile
でファイルの中身を見てみたら、書き換え自体はなされていた
解決方法
- シェルの書き換えが反映されていないとパスが通らないらしい
- 詳しくはこちら
$ exec -l $SHELL
のおまじないをターミナルに祈るとちゃんとgcloudコマンドが通るようになりました- 自分の初心者感を体感しました…道のりはまだ長い
Heatmap Calendars - workoutwednesday2017w3
最近Tableau以外の業務にかまけていたらTableau筋が衰えてきたので、せっかくの三連休はWorkoutWednesdayで腕ならしです…
お題
- Weekday(平日)のカレンダー
再現
学んだこと
- X軸とY軸の座標を置かなくても、indexを使えばある程度配置がうまくいくこと(条件はありそう)
- 当月最初の曜日をもとに、月内各日の週数を算出する方法
工夫したこと
- 各月の配置をCASE文で12行書いていたところを、割り算の商で1行で書き表したところ。処理が長いほど記述時のミスが起こるなと最近業務で気づいたので取り込んでみた
苦戦したこと
- 曜日のラベルが期待したのと同じところに配置されない…公式QAによるとラベルの位置移動はTableauの機能として実装されていないらしい。実装されてほしい、せめてルールを知りたい。まだうまく配置できていない
- 月のラベルのフォント変更。書式設定でどこのなんのパーツをいじっているのか未だに分からない…ダッシュボード上で編集すると迷子になりがちだからシート内でいじったほうがいいんだろうな…
今後の展望
- 今週のMakeOverMondayは久々に投稿したいのでこのテンプレを活かす。
BigQueryで実績値と予測値をまとめたテーブルを作成した
Tableauではないけれど業務的にデータを触ったので備忘。 初学者なので、内容に不備があればご指摘いただけますと幸いです。
概要
- BQ上に存在するデータと存在しないデータを組み合わせたテーブルを作成した
- 月初〜データが存在する最大日→実績値、データの最大日+1日〜月末日→予測値、となるテーブル。縦持ち。
- アウトプットイメージ
日付 | 売上 | 予実 |
---|---|---|
1/1 | 3 | 実績値 |
… | … | … |
1/8 | 10 | 実績値 |
1/9 | 8 | 予測値 |
… | … | … |
1/31 | 3 | 実績値 |
使った技術
- UDF関数
- 当月末日算出用日付関数
- 配列の作成
- 配列を行にバラす
- 結果
それぞれ詳細
1.UDF関数
- 予測値算出用関数を2x+yとする
-- 関数を作成 CREATE TEMPORARY FUNCTION uriage(x INT64, y INT64) RETURNS INT64 LANGUAGE js AS """ return 2x+y; """; -- 代入する値 WITH numbers AS (SELECT 1 AS x, 5 as y UNION ALL SELECT 2 AS x, 10 as y UNION ALL SELECT 3 as x, 15 as y) -- 関数、値をもとにクエリ実行 SELECT x, y, uriage(x, y) as product FROM numbers;
- 'numbers'には配列も入れることができるので、後ほど配列を入れる
- 参考URL -- 公式レファレンス
2. 当月末日算出用日付関数
- 当月の月数 + 1ヶ月 - 1日
- 一旦「日付」だけほしかったので整形
-- 当日(日付のみ) SELECT FORMAT_DATE("%d", TODAY()) -- 当月末日(日付のみ) SELECT FORMAT_DATE("%d", DATE_ADD(DATE_ADD(DATE(TIMESTAMP_TRUNC(CURRENT_TIMESTAMP(), MONTH), "Asia/Tokyo") , INTERVAL 1 MONTH), INTERVAL -1 DAY))
3. 配列の作成
- 2.で取得した「当月末の日付」と、「当日日付」を使って配列を作成
SELECT GENERATE_ARRAY(SELECT FORMAT_DATE("%d", TODAY()), SELECT FORMAT_DATE("%d", DATE_ADD(DATE_ADD(DATE(TIMESTAMP_TRUNC(CURRENT_TIMESTAMP(), MONTH), "Asia/Tokyo") , INTERVAL 1 MONTH), INTERVAL -1 DAY)), 1) AS dates;
4. 配列を行にバラす(フラット化?というらしい)
SELECT * FROM UNNEST GENERATE_ARRAY(SELECT FORMAT_DATE("%d", TODAY()), SELECT FORMAT_DATE("%d", DATE_ADD(DATE_ADD(DATE(TIMESTAMP_TRUNC(CURRENT_TIMESTAMP(), MONTH), "Asia/Tokyo") , INTERVAL 1 MONTH), INTERVAL -1 DAY)), 1) AS dates;
- 配列らへん参考URL -- BQ公式レファレンス
5. 結果
- 今まで作ったいろいろなパーツを集結&ユニオン
-- 関数を作成 CREATE TEMPORARY FUNCTION multiplyInputs(x INT64, y INT64) RETURNS INT64 LANGUAGE js AS """ return 2x+y; """; -- 代入する値 WITH date_list AS (SELECT *, 1 AS y FROM UNNEST GENERATE_ARRAY(SELECT FORMAT_DATE("%d", TODAY()), SELECT FORMAT_DATE("%d", DATE_ADD(DATE_ADD(DATE(TIMESTAMP_TRUNC(CURRENT_TIMESTAMP(), MONTH), "Asia/Tokyo") , INTERVAL 1 MONTH), INTERVAL -1 DAY)), 1) AS dates;) -- 関数、値をもとにクエリ実行 --- まずは実数値ゾーン SELECT date, sum(uriage), '実数値' AS indicator FROM hoge.fuga GROUP BY date --- 以下、予測値部分 UNION ALL SELECT dates, uriage(dates, y), '予測値' AS indicator FROM date_list;
躓いたところ
- 本当は今回作成したテーブルをTableauの「カスタムクエリ」に記載したかったが、UDF関数の'create'の時点でエラーが出た。使えなさそう…
- UDF関数を使用してクエリ実行したあと、viewとして保存しようと思ったができなかった。やむなくテーブルとして保存。
- テーブルとしてデータを保存するのであれば、毎日洗い変えられるデータに合わせてテーブルを日時更新する必要あり…
- そもそもBQ内でfor文(ループ処理)を使えないのか?配列を使うのってなんだかセンスがないような
- 配列も、日付の部分をバラすのではなく日付の形そのままで使う技術があるはず
- などなど、まだ良いやり方がありそうなので模索したい所存…