結合で複数テーブルを読み込む

pandasで効率よくデータを取り込む

Amany Mahfouz

Instructor

キー

  • データベースのレコードには一意の識別子(キー)がある

unique_key 列が強調された 311 通報データ。ユニークキーは数値。

pandasで効率よくデータを取り込む

キー

  • データベースのレコードには一意の識別子(キー)がある

course_code 列が強調された講義カタログデータ。コードは科目略称と数字で構成。

pandasで効率よくデータを取り込む

キー

  • データベースのレコードには一意の識別子(キー)がある

instructor_id 列が強調された講義カタログデータ。値は 9 桁の整数。

pandasで効率よくデータを取り込む

キー

教授テーブル。id 列が強調。講義カタログの instructor_id と同じ 9 桁の整数。

pandasで効率よくデータを取り込む

キー

教授名の列が結合された講義カタログデータ

pandasで効率よくデータを取り込む

テーブルの結合

日付列が強調された天気データ

created_date 列が強調された 311 通報データ

pandasで効率よくデータを取り込む

テーブルの結合

SELECT *
  FROM hpd311calls
pandasで効率よくデータを取り込む

テーブルの結合

SELECT *
  FROM hpd311calls
       JOIN weather 
       ON hpd311calls.created_date = weather.date;
  • 複数テーブルではドット記法(table.column)を使う
  • デフォルトの結合は両テーブルにあるキーのみ返す
  • 結合キーは同じデータ型にする。一致しないと結合できない
pandasで効率よくデータを取り込む

結合とフィルタリング

/* 暖房/給湯の通報のみ取得し、天気を結合 */
SELECT *
  FROM hpd311calls
       JOIN weather 
       ON hpd311calls.created_date = weather.date
 WHERE hpd311calls.complaint_type = 'HEAT/HOT WATER';
pandasで効率よくデータを取り込む

結合と集計

/* 区別の通報件数を取得 */
SELECT hpd311calls.borough, 
         COUNT(*)
  FROM hpd311calls
 GROUP BY hpd311calls.borough;
pandasで効率よくデータを取り込む

結合と集計

/* 区別の通報件数を取得し、人口と住宅数を結合 */
SELECT hpd311calls.borough, 
       COUNT(*), 
       boro_census.total_population,
       boro_census.housing_units
  FROM hpd311calls
 GROUP BY hpd311calls.borough
pandasで効率よくデータを取り込む

結合と集計

/* 区別の通報件数を取得し、人口と住宅数を結合 */
SELECT hpd311calls.borough, 
       COUNT(*), 
       boro_census.total_population,
       boro_census.housing_units
  FROM hpd311calls
       JOIN boro_census 
       ON hpd311calls.borough = boro_census.borough
 GROUP BY hpd311calls.borough;
pandasで効率よくデータを取り込む
query = """SELECT hpd311calls.borough, 
                    COUNT(*), 
                    boro_census.total_population,
                    boro_census.housing_units
             FROM hpd311calls
                  JOIN boro_census 
                  ON hpd311calls.borough = boro_census.borough
            GROUP BY hpd311calls.borough;"""

call_counts = pd.read_sql(query, engine)
print(call_counts)
         borough  COUNT(*)  total_population  housing_units
0          BRONX     29874           1455846         524488
1       BROOKLYN     31722           2635121        1028383
2      MANHATTAN     20196           1653877         872645
3         QUEENS     11384           2339280         850422
4  STATEN ISLAND      1322            475948         179179
pandasで効率よくデータを取り込む

復習

  • SQL のキーワード順
    • SELECT
    • FROM
    • JOIN
    • WHERE
    • GROUP BY
pandasで効率よくデータを取り込む

練習してみましょう!

pandasで効率よくデータを取り込む

Preparing Video For Download...