データサイエンス100本ノックで勉強(2)

前回からデータサイエンス100本ノックで勉強し始めています。

github.com

Docker環境が用意されていて、docker composeコマンドでJupyter NotebookとPostgresqlのコンテナが立ち上がるのでかなり便利です。

前回はlocalhost:8888でJupyter Notebookを動かしていましたが、まずはSQLから勉強していきたいので使い慣れてるDBeaverでコンテナに接続するよう設定しました。

まずDBへの接続情報がまとまっているコードを探すと、docker-compose.ymlで以下の記述がありました。

services:
  db:
    build:
      context: .
      dockerfile: dockerfiles/postgres/Dockerfile
    image: dss-postgres
    container_name: dss-postgres
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres12345
      - PGPASSWORD=postgres12345
      - POSTGRES_DB=dsdojo_db
      - DATABASE_HOST=localhost

上記の情報を使ってDBeaverの接続設定をしました。

f:id:JunpeiNakasone:20220123064532p:plain

f:id:JunpeiNakasone:20220123064710p:plain

無事DBeaverからクエリを実行できました。

なお、用意されているデータに関してはREADMEに以下の説明がありました。

個人情報のように見える項目は全てダミーデータを利用

SQLの勉強する時ってデータの準備が大変だったりする印象があるので、先に本番環境っぽいダミーデータを用意してもらっているのは本当に助かりますね。

次に問題集を開いてみました。
PDFとHTMLが用意されていて、状況に応じて使いやすい方で使えば良さそうなのでまずはHTMLで開きました。

ブラウザで開いてこんな感じになりました。
f:id:JunpeiNakasone:20220123065525p:plain

そして解答もHTMLで用意されているので並んで開くとこんな状態になり
f:id:JunpeiNakasone:20220123065635p:plain

先ほどDBeaverで接続したばかりですが、Jupyter Notebookで動かしたほうがクエリとクエリの結果が見やすく残りそうなのでJupyter Notebookで進めていこうと思います。

S-001: レシート明細テーブル(receipt)から全項目の先頭10件を表示し、どのようなデータを保有しているか目視で確認せよ。

並び順などは指定されていないので特に何も考えず10件のlimitだけつけて以下のクエリになります。

%%sql
select * from receipt limit 10;

f:id:JunpeiNakasone:20220123070155p:plain

S-002: レシート明細のテーブル(receipt)から売上日(sales_ymd)、顧客ID(customer_id)、商品コード(product_cd)、売上金額(amount)の順に列を指定し、10件表示させよ。

selectに取得したいカラムを指定して以下のクエリになります。
f:id:JunpeiNakasone:20220123070522p:plain

S-003: レシート明細のテーブル(receipt)から売上日(sales_ymd)、顧客ID(customer_id)、商品コード(product_cd)、売上金額(amount)の順に列を指定し、10件表示させよ。ただし、sales_ymdはsales_dateに項目名を変更しながら抽出すること。

sales_ymdにのみ別名をつけて以下のクエリになります。
f:id:JunpeiNakasone:20220123071027p:plain


こんな感じでデータサイエンス100本ノックを進めていきたいと思います。

解答もついてることだし、まずは1~2ヶ月ぐらいで一周できるようにわからない問題は解答を写経して進めて、その都度難しい構文などは調べてブログに書くようにします。

PythonのPandasは今すぐ必要な技術ではないのでSQLで一通り勉強した後にやります。