STEP 42:Jupyter Notebookでのレポート自動化

🤖 STEP 42: Jupyter Notebookでのレポート自動化

レポート作成を自動化して、定期的な分析を楽にしよう!

📋 このステップで学ぶこと

  • レポート自動化の必要性と効果
  • papermillによるノートブックのプログラム実行
  • パラメータ化ノートブックの作成方法
  • nbconvertでのHTML/PDF出力
  • スケジュール実行(cron, Task Scheduler)
  • 自動メール送信の実装

🤖 1. レポート自動化とは

なぜ自動化が必要なのか

ビジネスの現場では、毎日・毎週・毎月、同じフォーマットのレポートを作成することがよくあります。これを手動で行うと、多くの問題が発生します。

レポート自動化とは、データの取得からグラフ作成、レポート出力、配信までをプログラムで自動的に実行する仕組みです。一度設定すれば、人間が介在せずにレポートが完成します。

❌ 手動レポートの問題点
問題 具体例 ビジネスへの影響
時間がかかる 毎週2時間の作業を繰り返す 年間100時間以上の工数損失
ミスが発生しやすい コピペミス、計算ミス、フォーマットミス 誤った意思決定につながる
最新データへの対応が遅い データ更新のたびに手作業で再作成 リアルタイムな判断ができない
属人化 担当者が休むとレポート作成不可 業務継続性のリスク
スケールしない 10店舗分のレポートを1つずつ作成 事業拡大に対応できない
✓ 自動化のメリット
メリット 具体的な効果 数値例
時間短縮 手作業2時間 → 自動で数分 年間100時間の削減
ミス削減 自動化されたプロセスは常に同じ結果 ヒューマンエラー0%
リアルタイム対応 最新データで自動更新 タイムラグ数秒〜数分
標準化 誰が実行しても同じ品質 引き継ぎコスト大幅削減
スケーラビリティ 100個のレポートも同時作成可能 作業時間は店舗数に依存しない

自動化できるレポートの例

どのようなレポートが自動化に向いているか、具体例を見てみましょう。

【自動化に向いているレポート】 ┌─────────────────────────────────────────────────────────────┐ │ 1. 日次売上レポート │ ├─────────────────────────────────────────────────────────────┤ │ ・毎朝8時に自動生成 │ │ ・前日の売上、来客数、客単価をグラフ化 │ │ ・店長にメールで自動送信 │ └─────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────┐ │ 2. 週次KPIダッシュボード │ ├─────────────────────────────────────────────────────────────┤ │ ・毎週月曜日の朝に自動更新 │ │ ・主要KPI(売上、利益、顧客数等)を可視化 │ │ ・経営会議用にPDFで出力 │ └─────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────┐ │ 3. 月次財務レポート │ ├─────────────────────────────────────────────────────────────┤ │ ・月初の第1営業日に自動作成 │ │ ・前月の収支、予算対比、前年同月比を分析 │ │ ・CFO、経理部門に自動配信 │ └─────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────┐ │ 4. 広告パフォーマンスレポート │ ├─────────────────────────────────────────────────────────────┤ │ ・キャンペーン終了翌日に自動集計 │ │ ・インプレッション、クリック率、コンバージョンを分析 │ │ ・マーケティング部門にSlack通知 │ └─────────────────────────────────────────────────────────────┘
🔧 自動化に必要なツール
ツール 役割 このステップで学ぶこと
papermill Jupyter Notebookをプログラムから実行 セクション2で詳しく解説
nbconvert NotebookをHTML/PDFに変換 セクション3で詳しく解説
cron / Task Scheduler スケジュールに従って定期実行 セクション4で詳しく解説
smtplib Pythonからメールを送信 セクション5で詳しく解説

📓 2. papermillの基礎

papermillとは何か

papermillは、Netflixが開発したオープンソースツールで、Jupyter Notebookをコマンドラインやプログラムから実行できます。

通常、Jupyter Notebookはブラウザ上で1セルずつ実行しますが、papermillを使うと自動的にすべてのセルを実行し、結果を新しいNotebookとして保存できます。

【papermillの仕組み】 ┌─────────────────────────────────────────────────────────────┐ │ 通常のJupyter Notebook │ ├─────────────────────────────────────────────────────────────┤ │ ユーザー → ブラウザで開く → 手動でセルを実行 → 結果確認 │ │ │ │ 問題点: 毎回手動で実行する必要がある │ └─────────────────────────────────────────────────────────────┘ ↓ papermillで解決 ┌─────────────────────────────────────────────────────────────┐ │ papermillを使った場合 │ ├─────────────────────────────────────────────────────────────┤ │ プログラム → papermill → 全セル自動実行 → 結果を保存 │ │ │ │ メリット: 人間が介在せずに自動実行できる │ └─────────────────────────────────────────────────────────────┘

papermillのインストール

まず、papermillをインストールします。Google ColabやローカルのPython環境で実行できます。

# papermillをインストール pip install papermill

基本的な使い方(コマンドライン)

papermillは、コマンドラインから直接実行できます。

# コマンドラインでの基本的な実行 # input.ipynb を実行し、結果を output.ipynb に保存 papermill input.ipynb output.ipynb

基本的な使い方(Pythonスクリプト)

Pythonスクリプトからpapermillを呼び出すこともできます。この方法が自動化には便利です。

# Pythonスクリプトからpapermillを使う import papermill as pm # execute_notebook関数でNotebookを実行 pm.execute_notebook( ‘input.ipynb’, # 入力: 実行するNotebook ‘output.ipynb’ # 出力: 結果を保存するNotebook ) print(“✓ Notebook実行完了”)
💡 execute_notebook関数の引数
引数 説明
input_path 実行するNotebookのパス ‘report_template.ipynb’
output_path 結果を保存するNotebookのパス ‘reports/output.ipynb’
parameters Notebookに渡すパラメータ(辞書形式) {‘date’: ‘2024-12-01’}
kernel_name 使用するカーネル名 ‘python3’

パラメータ化ノートブックの作成

papermillの最も強力な機能は、パラメータを渡してNotebookを実行できることです。これにより、日付や条件を変えて同じNotebookを繰り返し実行できます。

パラメータ化するには、Notebookに「parameters」タグを付けたセルを作成します。

【パラメータセルの作り方】 Jupyter Notebookで以下の手順を行います: 1. パラメータを定義するセルを作成 2. セルを選択した状態で、上部メニューから 「View」→「Cell Toolbar」→「Tags」を選択 3. セルの上部に表示された入力欄に「parameters」と入力 4. Enterキーを押してタグを追加 これで、このセルがパラメータセルとして認識されます。

パラメータ化されたテンプレートNotebookの例

以下は、日次売上レポートを自動生成するためのテンプレートNotebookの例です。

📝 テンプレートNotebook(report_template.ipynb)の構成
【セル1: パラメータセル】(タグ: parameters) # このセルにparametersタグを付ける # papermillはこれらの値を外部から上書きできる target_date = ‘2024-12-01’ # 対象日(デフォルト値) report_title = ‘売上レポート’ # レポートタイトル threshold = 100 # 売上の閾値
# セル2: ライブラリのインポート import pandas as pd import matplotlib.pyplot as plt import seaborn as sns from datetime import datetime # 日本語フォント設定 plt.rcParams[‘font.sans-serif’] = [‘DejaVu Sans’] print(f”【{report_title}】”) print(f”対象日: {target_date}”) print(f”レポート生成日時: {datetime.now().strftime(‘%Y-%m-%d %H:%M:%S’)}”)
# セル3: データの読み込みとフィルタリング # CSVファイルからデータを読み込む df = pd.read_csv(‘sales_data.csv’) # 対象日のデータだけをフィルタリング df_filtered = df[df[‘date’] == target_date] print(f”対象データ件数: {len(df_filtered)}件”)
# セル4: 集計とグラフ作成 # 売上の合計を計算 total_sales = df_filtered[‘sales’].sum() # グラフを作成 fig, ax = plt.subplots(figsize=(10, 6)) df_filtered.groupby(‘category’)[‘sales’].sum().plot(kind=’bar’, ax=ax) ax.set_title(f'{target_date} カテゴリ別売上’, fontsize=16) ax.set_ylabel(‘売上(円)’) plt.tight_layout() plt.show() print(f”\n【結果】”) print(f”総売上: {total_sales:,}円”) print(f”閾値({threshold})を超えた: {‘はい’ if total_sales > threshold else ‘いいえ’}”)

papermillでパラメータを渡して実行

作成したテンプレートNotebookに、異なるパラメータを渡して実行してみましょう。

# パラメータを渡してNotebookを実行 import papermill as pm # 2024年12月1日のレポートを作成 pm.execute_notebook( ‘report_template.ipynb’, # テンプレートNotebook ‘reports/report_2024-12-01.ipynb’, # 出力先 parameters={ ‘target_date’: ‘2024-12-01’, # 日付を指定 ‘report_title’: ’12月1日売上レポート’, ‘threshold’: 150 } ) print(“✓ 12月1日のレポート作成完了”)

複数日のレポートを一括作成

ループを使えば、複数日のレポートを一括で作成できます。

# 複数日のレポートを一括作成 import papermill as pm # 作成する日付のリスト dates = [‘2024-12-01’, ‘2024-12-02’, ‘2024-12-03’, ‘2024-12-04’, ‘2024-12-05′] # 各日付に対してレポートを作成 for date in dates: output_file = f’reports/report_{date}.ipynb’ pm.execute_notebook( ‘report_template.ipynb’, output_file, parameters={‘target_date’: date} ) print(f”✓ レポート作成完了: {date}”) print(“\n全レポート作成完了!”)

📄 3. nbconvertでのHTML/PDF出力

nbconvertとは何か

nbconvertは、Jupyter NotebookをHTML、PDF、Markdown等の形式に変換するツールです。papermillで実行したNotebookを、共有しやすい形式に変換できます。

【nbconvertの変換フロー】 ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ Jupyter │ │ nbconvert │ │ HTML/PDF │ │ Notebook │ ──→ │ で変換 │ ──→ │ ファイル │ │ (.ipynb) │ │ │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ 【対応する出力形式】 ・HTML: ブラウザで表示可能、メール添付に最適 ・PDF: 印刷用、正式な報告書に最適 ・Markdown: ドキュメント作成用 ・LaTeX: 学術論文用 ・Python Script: コードだけを抽出

nbconvertのインストール

nbconvertは通常Jupyter Notebookと一緒にインストールされますが、念のため確認しましょう。

# nbconvertをインストール(Jupyter Notebookに含まれている場合が多い) pip install nbconvert

コマンドラインでの変換

nbconvertはコマンドラインから直接実行できます。

# HTML形式に変換 jupyter nbconvert –to html report.ipynb # コードセルを非表示にしてHTMLに変換(結果だけ見せたい場合) jupyter nbconvert –to html –no-input report.ipynb # PDF形式に変換(LaTeXが必要) jupyter nbconvert –to pdf report.ipynb

Pythonスクリプトからの変換

自動化のためには、Pythonスクリプトから変換を実行します。subprocessモジュールを使います。

# Pythonスクリプトからnbconvertを実行 import subprocess # HTML形式に変換 subprocess.run([ ‘jupyter’, ‘nbconvert’, # nbconvertコマンド ‘–to’, ‘html’, # HTML形式に変換 ‘–no-input’, # コードセルを非表示 ‘report.ipynb’ # 変換するNotebook ]) print(“✓ HTML変換完了”)

papermill + nbconvert の組み合わせ

papermillでNotebookを実行し、nbconvertでHTMLに変換する一連の流れを関数化してみましょう。

# papermill + nbconvert を組み合わせた関数 import papermill as pm import subprocess from datetime import datetime import os def create_html_report(target_date, output_dir=’reports’): “”” 指定した日付のHTMLレポートを作成する関数 引数: target_date: レポート対象日(例: ‘2024-12-01’) output_dir: 出力先ディレクトリ “”” # 出力ディレクトリが存在しない場合は作成 if not os.path.exists(output_dir): os.makedirs(output_dir) # Step 1: papermillでNotebookを実行 notebook_file = f'{output_dir}/report_{target_date}.ipynb’ print(f”Step 1: Notebook実行中…”) pm.execute_notebook( ‘report_template.ipynb’, # テンプレート notebook_file, # 出力先 parameters={‘target_date’: target_date} ) print(f”✓ Notebook実行完了: {notebook_file}”) # Step 2: nbconvertでHTMLに変換 print(f”Step 2: HTML変換中…”) subprocess.run([ ‘jupyter’, ‘nbconvert’, ‘–to’, ‘html’, ‘–no-input’, # コードを非表示 notebook_file ]) html_file = notebook_file.replace(‘.ipynb’, ‘.html’) print(f”✓ HTML変換完了: {html_file}”) return html_file # 使用例: 今日のレポートを作成 today = datetime.now().strftime(‘%Y-%m-%d’) html_path = create_html_report(today) print(f”\nレポート作成完了: {html_path}”)
💡 –no-input オプションについて

--no-inputオプションを使うと、HTMLファイルからコードセルが非表示になり、結果(グラフや表)だけが表示されます。ビジネス向けのレポートでは、コードを見せる必要がないことが多いため、このオプションが便利です。

⏰ 4. スケジュール実行

自動実行の仕組み

レポート作成スクリプトを、決まった時間に自動で実行するには、OSのスケジューラを使います。

【スケジュール実行の全体像】 ┌─────────────────────────────────────────────────────────────┐ │ OS のスケジューラ(cron / Task Scheduler) │ │ │ │ 毎朝8:00 │ │ ↓ │ │ Pythonスクリプトを起動 │ │ ↓ │ │ papermill でNotebook実行 │ │ ↓ │ │ nbconvert でHTML変換 │ │ ↓ │ │ smtplib でメール送信 │ └─────────────────────────────────────────────────────────────┘ 【OS別のスケジューラ】 ・Linux / Mac: cron(クーロン) ・Windows: Task Scheduler(タスクスケジューラ)

cronでの自動実行(Linux / Mac)

cronは、Linux/Macに標準搭載されているスケジューラです。設定ファイル(crontab)に実行スケジュールを記述します。

【cronの書式】 ┌─────────── 分(0-59) │ ┌───────── 時(0-23) │ │ ┌─────── 日(1-31) │ │ │ ┌───── 月(1-12) │ │ │ │ ┌─── 曜日(0-7、0と7は日曜日) │ │ │ │ │ * * * * * コマンド 【例】 0 8 * * * → 毎日午前8時に実行 0 9 * * 1 → 毎週月曜日の午前9時に実行 0 10 1 * * → 毎月1日の午前10時に実行 */30 * * * * → 30分ごとに実行 0 8,18 * * * → 毎日午前8時と午後6時に実行
# crontabを編集するコマンド crontab -e # 以下の行を追加(毎日午前8時に実行) 0 8 * * * cd /home/user/reports && /usr/bin/python3 create_report.py >> /home/user/reports/log.txt 2>&1
💡 cronの設定ポイント
ポイント 説明
絶対パスを使う cronは環境変数が異なるため、絶対パスが安全 /usr/bin/python3
cdでディレクトリ移動 スクリプトの実行ディレクトリを明示 cd /home/user/reports &&
ログ出力 エラー調査のためにログを残す >> log.txt 2>&1

Task Schedulerでの自動実行(Windows)

Windowsでは、タスクスケジューラを使って定期実行を設定します。

【Task Schedulerの設定手順】 1. 「タスクスケジューラ」を検索して起動 2. 右側の「基本タスクの作成」をクリック 3. 名前と説明を入力 ・名前: 「日次レポート作成」 ・説明: 「毎朝8時に売上レポートを自動作成」 4. トリガーを設定 ・「毎日」を選択 ・開始時刻: 8:00:00 5. 操作を設定 ・「プログラムの開始」を選択 ・プログラム/スクリプト: C:\Python39\python.exe ・引数の追加: C:\reports\create_report.py ・開始: C:\reports 6. 「完了」をクリックして保存

自動実行用のPythonスクリプト例

cronやTask Schedulerから呼び出すPythonスクリプトの完全な例を示します。

# create_report.py # このスクリプトをcronやTask Schedulerから呼び出す import papermill as pm import subprocess import os from datetime import datetime, timedelta def main(): “””メイン処理””” # 設定 template_notebook = ‘report_template.ipynb’ output_dir = ‘reports’ # 昨日の日付を取得(日次レポートは前日分を作成) yesterday = (datetime.now() – timedelta(days=1)).strftime(‘%Y-%m-%d’) print(f”=” * 50) print(f”日次レポート作成開始”) print(f”対象日: {yesterday}”) print(f”実行日時: {datetime.now().strftime(‘%Y-%m-%d %H:%M:%S’)}”) print(f”=” * 50) try: # Step 1: Notebook実行 notebook_file = f'{output_dir}/report_{yesterday}.ipynb’ pm.execute_notebook( template_notebook, notebook_file, parameters={‘target_date’: yesterday} ) print(f”✓ Step 1: Notebook実行完了”) # Step 2: HTML変換 subprocess.run([ ‘jupyter’, ‘nbconvert’, ‘–to’, ‘html’, ‘–no-input’, notebook_file ], check=True) print(f”✓ Step 2: HTML変換完了”) html_file = notebook_file.replace(‘.ipynb’, ‘.html’) print(f”\n✓ レポート作成完了: {html_file}”) except Exception as e: print(f”✗ エラーが発生しました: {e}”) raise if __name__ == ‘__main__’: main()

📧 5. 自動メール送信

smtplibとは何か

smtplibは、Pythonでメールを送信するための標準ライブラリです。SMTP(Simple Mail Transfer Protocol)を使って、GmailやOutlookなどのメールサーバーからメールを送信できます。

【メール送信の仕組み】 ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ Python │ │ SMTPサーバー │ │ 受信者 │ │ スクリプト │ ──→ │(Gmail等) │ ──→ │ メールボックス│ └──────────────┘ └──────────────┘ └──────────────┘ 【Gmailを使う場合の注意点】 ・2段階認証を有効にする必要がある ・「アプリパスワード」を生成して使用する ・通常のGmailパスワードは使えない

Gmailのアプリパスワード設定

Gmailを使ってメールを送信するには、アプリパスワードを設定する必要があります。

【Gmailアプリパスワードの設定手順】 1. Googleアカウントにログイン → https://myaccount.google.com/ 2. 左メニューから「セキュリティ」を選択 3. 「2段階認証プロセス」を有効にする ・まだ有効でない場合は、先に有効化する 4. 2段階認証の設定ページ下部にある 「アプリパスワード」をクリック 5. アプリを選択 ・「メール」を選択 ・デバイスを選択(「Windowsパソコン」など) 6. 「生成」をクリック 7. 16桁のパスワードが表示される ・このパスワードをコピーして保存 ・スペースは無視してOK 注意: このパスワードは一度しか表示されないので、 必ず安全な場所に保存してください。

基本的なメール送信

smtplibを使った基本的なメール送信の方法を説明します。

# 基本的なメール送信 import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart def send_simple_email(subject, body, to_email): “”” シンプルなテキストメールを送信する関数 引数: subject: 件名 body: 本文 to_email: 送信先メールアドレス “”” # 送信者の設定(★ここを自分の情報に変更) from_email = ‘your_email@gmail.com’ app_password = ‘xxxx xxxx xxxx xxxx’ # アプリパスワード # メールメッセージを作成 msg = MIMEMultipart() msg[‘From’] = from_email # 送信者 msg[‘To’] = to_email # 受信者 msg[‘Subject’] = subject # 件名 # 本文を追加(UTF-8エンコード) msg.attach(MIMEText(body, ‘plain’, ‘utf-8’)) # SMTPサーバーに接続して送信 server = smtplib.SMTP(‘smtp.gmail.com’, 587) # Gmailのサーバー server.starttls() # 暗号化通信を開始 server.login(from_email, app_password) # ログイン server.send_message(msg) # メール送信 server.quit() # 接続を閉じる print(f”✓ メール送信完了: {to_email}”) # 使用例 send_simple_email( subject=’日次レポート’, body=’本日の売上レポートを添付します。’, to_email=’manager@example.com’ )

添付ファイル付きメールの送信

HTMLレポートをメールに添付して送信する方法です。

# 添付ファイル付きメールの送信 import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email import encoders import os def send_email_with_attachment(subject, body, to_email, attachment_path): “”” 添付ファイル付きメールを送信する関数 引数: subject: 件名 body: 本文 to_email: 送信先メールアドレス attachment_path: 添付ファイルのパス “”” # 送信者の設定 from_email = ‘your_email@gmail.com’ app_password = ‘xxxx xxxx xxxx xxxx’ # メールメッセージを作成 msg = MIMEMultipart() msg[‘From’] = from_email msg[‘To’] = to_email msg[‘Subject’] = subject msg.attach(MIMEText(body, ‘plain’, ‘utf-8’)) # 添付ファイルを追加 if os.path.exists(attachment_path): with open(attachment_path, ‘rb’) as f: attachment = MIMEBase(‘application’, ‘octet-stream’) attachment.set_payload(f.read()) # Base64エンコード encoders.encode_base64(attachment) # ファイル名を設定 filename = os.path.basename(attachment_path) attachment.add_header( ‘Content-Disposition’, f’attachment; filename=”{filename}”‘ ) msg.attach(attachment) print(f”添付ファイル: {filename}”) else: print(f”警告: 添付ファイルが見つかりません: {attachment_path}”) # メール送信 server = smtplib.SMTP(‘smtp.gmail.com’, 587) server.starttls() server.login(from_email, app_password) server.send_message(msg) server.quit() print(f”✓ メール送信完了: {to_email}”) # 使用例 send_email_with_attachment( subject=’日次売上レポート(2024年12月1日)’, body=”’ お疲れ様です。 本日の売上レポートを添付します。 ご確認をお願いいたします。 自動送信システムより ”’, to_email=’manager@example.com’, attachment_path=’reports/report_2024-12-01.html’ )

完全な自動化システム

ここまで学んだ内容を統合して、完全な自動化システムを構築しましょう。

# auto_report_system.py # 完全な自動化システム import papermill as pm import subprocess import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email import encoders import os from datetime import datetime, timedelta class AutoReportSystem: “””自動レポート作成システム””” def __init__(self, email_config): “”” 初期化 引数: email_config: メール設定の辞書 “”” self.email_config = email_config self.output_dir = ‘reports’ # 出力ディレクトリを作成 if not os.path.exists(self.output_dir): os.makedirs(self.output_dir) def create_report(self, target_date, template=’report_template.ipynb’): “””レポートを作成””” notebook_file = f'{self.output_dir}/report_{target_date}.ipynb’ # Step 1: Notebook実行 pm.execute_notebook( template, notebook_file, parameters={‘target_date’: target_date} ) # Step 2: HTML変換 subprocess.run([ ‘jupyter’, ‘nbconvert’, ‘–to’, ‘html’, ‘–no-input’, notebook_file ], check=True) return notebook_file.replace(‘.ipynb’, ‘.html’) def send_report(self, html_path, to_emails, subject=None): “””レポートをメール送信””” if subject is None: subject = f’自動生成レポート – {datetime.now().strftime(“%Y-%m-%d”)}’ body = f”’ お疲れ様です。 自動生成されたレポートを添付します。 ご確認をお願いいたします。 生成日時: {datetime.now().strftime(“%Y-%m-%d %H:%M:%S”)} ”’ for to_email in to_emails: self._send_email(subject, body, to_email, html_path) def _send_email(self, subject, body, to_email, attachment_path): “””メール送信の内部処理””” msg = MIMEMultipart() msg[‘From’] = self.email_config[‘from_email’] msg[‘To’] = to_email msg[‘Subject’] = subject msg.attach(MIMEText(body, ‘plain’, ‘utf-8’)) # 添付ファイル with open(attachment_path, ‘rb’) as f: attachment = MIMEBase(‘application’, ‘octet-stream’) attachment.set_payload(f.read()) encoders.encode_base64(attachment) attachment.add_header( ‘Content-Disposition’, f’attachment; filename=”{os.path.basename(attachment_path)}”‘ ) msg.attach(attachment) # 送信 server = smtplib.SMTP(‘smtp.gmail.com’, 587) server.starttls() server.login( self.email_config[‘from_email’], self.email_config[‘app_password’] ) server.send_message(msg) server.quit() print(f”✓ メール送信: {to_email}”) def run_daily_report(self, recipients): “””日次レポートを実行””” yesterday = (datetime.now() – timedelta(days=1)).strftime(‘%Y-%m-%d’) print(f”日次レポート作成開始: {yesterday}”) # レポート作成 html_path = self.create_report(yesterday) print(f”✓ レポート作成完了: {html_path}”) # メール送信 self.send_report( html_path, recipients, subject=f’日次売上レポート({yesterday})’ ) print(“✓ 日次レポート処理完了”) # 使用例 if __name__ == ‘__main__’: # メール設定 email_config = { ‘from_email’: ‘your_email@gmail.com’, ‘app_password’: ‘xxxx xxxx xxxx xxxx’ } # 送信先リスト recipients = [ ‘manager@example.com’, ‘sales@example.com’ ] # システム起動 system = AutoReportSystem(email_config) system.run_daily_report(recipients)
⚠️ セキュリティ上の注意

メールのパスワードをスクリプトに直接書くのはセキュリティ上問題があります。本番環境では以下の方法を使いましょう。

  • 環境変数: os.environ['EMAIL_PASSWORD']
  • 設定ファイル: .envファイルを使い、Gitにはコミットしない
  • 秘密管理サービス: AWS Secrets Manager、HashiCorp Vaultなど

📝 STEP 42 のまとめ

✅ このステップで学んだこと
トピック 重要ポイント
レポート自動化 時間短縮、ミス削減、標準化を実現
papermill Notebookをプログラムから実行、パラメータを渡せる
パラメータ化 parametersタグを付けたセルで動的なレポート生成
nbconvert NotebookをHTML/PDFに変換、–no-inputでコード非表示
スケジュール実行 cron(Linux/Mac)/ Task Scheduler(Windows)で定期実行
メール送信 smtplibで自動配信、添付ファイルも可能
💡 最重要ポイント

レポート自動化は、一度設定すれば数ヶ月〜数年単位で時間を節約できる投資です。毎週2時間かかっていた作業が、自動化により年間100時間以上の削減につながります。

  • まずは小さく始める: 1つのシンプルなレポートから
  • テンプレート化: パラメータで柔軟に対応
  • エラー処理: ログを残して問題を追跡可能に

次のステップでは、ダッシュボード実装を学びます!

📝 実践演習

演習 1 基礎

パラメータセル(parametersタグ)を持つシンプルなNotebookを作成し、papermillで実行してください。

【Step 1: テンプレートNotebook(test_template.ipynb)を作成】
# セル1(parametersタグを付ける) name = ‘デフォルト’ value = 100 # セル2 print(f”名前: {name}”) print(f”値: {value}”) print(f”計算結果: {value * 2}”)
【Step 2: papermillで実行】
import papermill as pm pm.execute_notebook( ‘test_template.ipynb’, ‘output.ipynb’, parameters={ ‘name’: ‘太郎’, ‘value’: 200 } ) print(“✓ 実行完了”)
演習 2 応用

papermillで実行したNotebookを、nbconvertでHTMLに変換してください。

【解答コード】
import papermill as pm import subprocess # Step 1: Notebook実行 pm.execute_notebook( ‘test_template.ipynb’, ‘output.ipynb’, parameters={‘name’: ‘花子’, ‘value’: 300} ) # Step 2: HTML変換 subprocess.run([ ‘jupyter’, ‘nbconvert’, ‘–to’, ‘html’, ‘–no-input’, # コードを非表示 ‘output.ipynb’ ]) print(“✓ output.html が作成されました”)
演習 3 発展

レポート作成からメール送信までを自動化するスクリプトを作成し、cronまたはTask Schedulerで毎朝8時に実行されるように設定してください。

【チェックリスト】
□ テンプレートNotebookを作成(parametersタグ付き) □ papermillで実行するスクリプトを作成 □ nbconvertでHTML変換を追加 □ smtplibでメール送信を追加 □ Gmailのアプリパスワードを設定 □ cron(Linux/Mac)またはTask Scheduler(Windows)で設定 【cronの設定例(Linux/Mac)】 0 8 * * * cd /home/user/reports && /usr/bin/python3 auto_report.py >> log.txt 2>&1 【動作確認】 1. まず手動でスクリプトを実行してエラーがないか確認 2. cronを設定後、翌朝の実行結果をログで確認

❓ よくある質問

Q1: papermillでエラーが出た場合、どうすればいいですか?
出力されたNotebookを開いて確認しましょう。papermillはエラーが発生しても、そこまでの実行結果を出力Notebookに保存します。output.ipynbを開いて、どのセルでエラーが発生したかを確認してください。また、pm.execute_notebook()の引数にlog_output=Trueを追加すると、実行中のログが表示されます。
Q2: Gmailでアプリパスワードが作成できません。
2段階認証が有効になっているか確認してください。アプリパスワードは、2段階認証が有効なアカウントでのみ作成できます。まず「Google アカウント → セキュリティ → 2段階認証プロセス」で2段階認証を有効にしてから、アプリパスワードを作成してください。
Q3: cronが動作しません。どこを確認すればいいですか?
以下の点を確認してください。 ①すべてのパスを絶対パスにする(python3、スクリプト、データファイルなど)。 ②環境変数が必要な場合は、スクリプト内で明示的に設定する。 ③実行権限があるか確認(chmod +x script.py)。 ④まずコマンドラインで手動実行して動作確認。 ⑤ログファイルに出力してエラーを確認(>> log.txt 2>&1)。
Q4: Google Colab上で自動化できますか?
Colabは常時起動ではないため、定期実行には向いていません。Colabはブラウザを閉じるとセッションが終了します。定期的な自動化には、ローカルPC、VPS(Virtual Private Server)、AWS Lambda、Google Cloud Functionsなどの常時稼働する環境を使用してください。
Q5: 複数の人に異なるレポートを送信したい場合は?
ループで処理しましょう。例えば、店舗ごとに異なるレポートを作成し、各店長に送信する場合は、店舗リストをループで処理します。for store in stores:でループし、各店舗のパラメータを渡してレポートを作成、対応するメールアドレスに送信します。
📝

学習メモ

データ可視化マスター - Step 42

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE