LEVEL 8 ・ 自動化 / Lesson 22

毎月の作業を、1つの手順書にまとめる

読み込み・点検・集計・保存を関数に分けて、1つのスクリプトにします。ここから「仕事で使う」です。

目安 25分 ・ インストール不要

このレッスンが終わったら

「毎月の作業を、関数に分けた1つの手順書(スクリプト)にできる。ファイルを替えるだけで、同じ作業が回る」と言える。

STEP 1

できることを見る

ここまでに学んだことを組み合わせると、毎月の作業を、1つの手順書にまとめられます。この手順書を、Pythonでは「スクリプト」と呼びます。

今回は、次の流れを、自動化します。

  1. ① 読み込む売上のCSV
  2. ② 点検するおかしい行を探す
  3. ③ 集計する部署別に合計
  4. ④ 保存するExcelと確認用CSV
毎月の作業が、4つの部品に分かれます。
STEP 2

動かしてみる

まず、全体を動かしてみましょう。(少し長いですが、1行ずつ読むので、安心してください)

毎月の作業を、1つの手順書にするpandas・サンプルファイル付き
Ctrl / ⌘ + Enter でも実行

この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。

結果
▶ 実行を押すと、ここに結果が出ます

4つの行数や集計が、順番に表示されました。この中で、summary.xlsx(集計結果)と、errors.csv(エラー行の一覧)という、2つのファイルも作られています。

STEP 3

1行ずつ読む

全体を、大きな塊で読みます。細かい行を追うのではなく、**関数の「名前」と「材料」と「return」**を見ましょう。

4つの関数を、日本語にする
def load_data(path):ファイルの場所(path)を受け取って、CSVを読み込んで返す
def find_errors(df):表(df)を受け取って、おかしい行だけを返す
def summarize(df):表(df)を受け取って、部署別の合計の表を返す
def main(path):上の3つを順番に使って、全体の作業を行う。結果をファイルに保存して、件数を表示する
main("sales_dirty.csv")最後に、実際の作業を開始する(ここで初めて、全部が動く)

日本語にすると

CSVを読んで、おかしい行を見つけ、それを取り除いて部署別に合計し、結果をExcelと確認用CSVに保存してください。

main は、「全体の流れを書く場所」です。main だけ読めば、何をする手順書かが分かります。細かい処理は、それぞれの関数に任せています。

STEP 4

1か所だけ変える

① 別のファイルで実行する。 最後の行の "sales_dirty.csv" を、"orders.csv"(入力ミスのないデータ)に変えます。同じ手順書が、別のデータにも使えます。

別のファイルで実行するpandas・サンプルファイル付き
Ctrl / ⌘ + Enter でも実行

この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。

結果
▶ 実行を押すと、ここに結果が出ます

今度は「エラー行: 0 行」と表示され、12行すべてが集計されました。ファイルを替えるだけで、毎月の作業が回ります。

② 点検のルールを変える。 find_errors の中に、「金額が10万円を超える行も、確認対象にする」という条件を足してみましょう。| (df["金額"] > 100000) を1行足すだけです。

点検のルールを足してみようpandas・サンプルファイル付き
Ctrl / ⌘ + Enter でも実行

この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。

結果
▶ 実行を押すと、ここに結果が出ます

ルールを変えたいときに、直す場所が1か所だけで済む。これが、関数に分ける一番の利点です。

STEP 5

自分で書く

お題 find_errors の結果の行数を数える関数 count_errors(df) を作ってください。そして、sales_dirty.csv と orders.csv について、それぞれ表示します。(4 と 0)

お題:エラー行を数える関数pandas・サンプルファイル付き
Ctrl / ⌘ + Enter でも実行

この欄では、サンプルファイルが使えます。実行のたびに、ファイルは最初の状態に戻ります。

結果
▶ 実行を押すと、ここに結果が出ます
ヒントを見る

def count_errors(df): の次の行に、スペース4つで、return len(find_errors(df)) と書きます。

答えの例を見る
import pandas as pd


def find_errors(df):
  return df[
      df["金額"].isna()
      | (df["金額"] < 0)
      | df["担当"].isna()
      | df["部署"].isna()
  ]


def count_errors(df):
  return len(find_errors(df))


print(count_errors(pd.read_csv("sales_dirty.csv")))
print(count_errors(pd.read_csv("orders.csv")))
STEP 6

仕事ならどう使う?