月曜の資料は、だれが作るのか
あるコンビニチェーンでは、毎週月曜の朝に売上会議があります。資料には、全店の先週の売上がそろっています。
でも、だれも夜中に数字を打ちこんではいません。レジのデータが、決まった道を通って、毎晩自動で本部に届いているのです。この道を作り、守るのが、データエンジニアの仕事です。
このレッスンのゴール
メモ
データが元のシステムからレポートまで、どう流れるかを説明することができる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| データパイプライン | データを元からレポートまで運ぶ仕組みです。 | |
| 抽出 | 元のシステムからデータを取り出すことです。 | |
| 変換 | データを直して、形をそろえることです。 | |
| ロード | 直したデータを保存先に入れることです。 | |
| ETL | 抽出、変換、ロードの三つの頭文字です。 | Extract, Transform, Load |
学生が入力するセルは、このプレビューでは空白です。
データは三つの段階を通ります
まず抽出です。各店舗のレジから、その日の売上ファイルを取り出します。
次に変換です。空の値を外し、文字を数に変え、店名の形をそろえます。
最後にロードです。直したデータを、本部のデータベースに入れます。会議の資料は、このデータベースから作ります。
三つの段階をPythonで書きます
小さなパイプラインなら、Pythonで書けます。
下のコードは、レジから届いた文字を行に分け、空の売上を外し、リストに入れます。
段階ごとに件数を表示している点に注目してください。件数が途中で減れば、どこで何行が外れたかがすぐに分かります。
抽出、変換、ロードを動かす
# 夜にレジから届くファイルの中身です。
export_text = """store,sales
梅田店,84000
難波店,
梅田店,12500
天王寺店,91500"""
# 1. 抽出: 文字を行に分けます。1行目は列の名前なので飛ばします。
rows = []
for line in export_text.split("\n")[1:]:
parts = line.split(",")
rows.append({"store": parts[0], "sales": parts[1]})
print("抽出した行:", len(rows))
# 2. 変換: 売上が空の行を外し、文字を数に変えます。
clean = []
for row in rows:
if row["sales"] != "":
clean.append({"store": row["store"], "sales": int(row["sales"])})
print("変換した行:", len(clean))
# 3. ロード: ここではリストに入れます。会社ではデータベースの表です。
sales_table = []
for row in clean:
sales_table.append(row)
print("ロードした行:", sales_table)
# 「京橋店,70000」の行を足して、件数がどう変わるか見ましょう。
よくある間違い
注意
変換が終われば、元のファイルは要らないと考える人が多いです。でも、変換にまちがいが見つかることはよくあります。元のデータを残しておけば、直した変換でもう一度流せます。
やってみましょう: 店舗ごとの合計
会議の資料には、店舗ごとの売上の合計が必要です。一つの店から、レジごとに何行も届くことがあります。店名ごとに売上を足した辞書を返す関数を書いてください。