WEB+DB PRESS plusシリーズ現場のPython
──Webシステム開発から、機械学習・データ分析まで
──
2024年9月12日紙版発売
株式会社ビープラウド 監修,altnight,石上晋,delhi09,鈴木たかのり,斎藤努 著
A5判/384ページ
定価3,520円(本体3,200円+税10%)
ISBN 978-4-297-14401-2
書籍の概要
この本の概要
『WEB+DB PRESS』の人気連載が待望の書籍化です。Webシステム開発から機械学習・データ分析まで,現場で使えるPythonのノウハウが1冊にまとまっています。取り上げる話題は,環境構築,コード品質,テスト,構造化ログ,リリース管理,Django,Django REST framework,GraphQL,Fast API,Django ORM,データサイエンスプログラムの品質,データ分析レポート,pandasのパフォーマンス改善,JanomeとSudachiPyによる日本語処理,pandasやNumPyによるテスト,数理最適化などなど。今日から仕事で活かせるヒントやテクニックがきっと見つかるです。
こんな方におすすめ
- 脱初心者を目指す方
- Pythonの入門を終えた中級者の方
- すでに趣味の開発ではPythonを使っており,実務レベルにステップアップしたい方
- Pythonがソフトウェア開発の業務にどのように使えるのかを知りたい方
- 経験2,3年目で基本的なコードを書けるようになっているが,その先に進む方法がわからない方
- エキスパートな内容は難しいと感じるが,入門よりは難しい内容を知りたい方
目次
- はじめに
第1部 基礎編
第1章 最新Python環境構築
シンプルでコーディングしやすい環境を整える
- 1.1 Pythonのインストール
- インストール方法のお勧めは?
- インストーラでの導入──簡易的な導入手段
- 仮想環境と標準モジュールのvenv
- 仮想環境の切り替え──activate/deactivate
- Dockerイメージ──複数人開発でより扱いやすい方法
- 1.2 ライブラリのインストール
- とりあえず何を使えばよい?
- pip──標準かつ簡単な方法
- Poetry──より安全に管理するなら
- 1.3 コーディング環境を整える
- とりあえずどこまでやるべき?──最低限の品質保証
- PEP 8──コーディング規約
- black──PEP 8の自動適用
- ruff──高速なインポート順の整列とPEP 8のチェック
- 1.4 漸進的型付けと静的型チェック
- どこまで対応すればよいか?──とりあえずType Hintingを書く
- 漸進的型付け──あとから型を付けられる
- Type Hinting
- mypy──型のチェック
- 1.5 開発支援ツールを一括実行──tox
- toxのインストール方法
- toxの設定例
- toxの実行と実行結果
- toxのテストを個別で実行
第2章 型ヒントとmypyによるコード品質の向上
型チェックの基本から,既存コードの改善プロセスまで
- 2.1 型ヒントの役割と型チェッカーの活用
- 型ヒントがある場合・ない場合
- 型ヒントを活用する方法
- 2.2 型ヒントの使い方──基本編
- 変数
- 関数
- ジェネリック型
- 複雑な型
- クラス
- 型エイリアス
- 2.3 型ヒントの使い方──発展編
- dataclassesモジュールを活用する
- アノテーションによる実行時のエラー回避
- スタブファイルを利用する
- 既存のコードベースに型ヒントを追加する
第3章 pytestを使って品質の高いテストを書く
parametrize・フィクスチャ・pytest-covの活用
- 3.1 テストの品質向上のポイント
- テストコードとプロダクトコードの違い
- テストコードを書くときに必要な考え方
- 3.2 pytestによるテストの書き方
- テストケースの書き方
- テストケースの基本形
- 3.3 pytestでテストを書くときに押さえるべき基本
- 1つのテストケースでは1つのことを調べる
- テスト対象のインポートはテスト関数内で行う
- 3.4 サンプルコードのテストを作成しよう
- ディレクトリ構成とテスト対象の概要
- 開発環境のセットアップ
- 素朴なテストを書く
- 3.5 pytestを使いこなしてテストコードを改善しよう
- parametrizeを使って繰り返すテストを書こう
- フィクスチャを使って共通処理をまとめよう
- フィクスチャの機能を適度に使いこなす
- 3.6 テストの品質をチェックしよう
- pytest-covを使ってカバレッジをチェックしよう
- テストコードをレビューするときのコツ
第4章 structlogで効率的に構造化ログを出力
横断的に検索や解析のしやすいログのしくみを整えよう
- 4.1 ログはなぜ必要なのか
- 4.2 構造化ログはなぜ便利なのか
- 4.3 Python標準モジュールのみで構造化ログを実現しよう
- 基本的なログ出力
- loggingモジュールで構造化ログを出力する
- シンプルに構造化ログを実装した際の問題点
- 4.4 structlogでより便利に構造化ログを出力しよう
- structlogを導入して利用する
- JSON形式で構造化ログを出力する
- データバインディングして情報を追跡しやすくする
- 4.5 django-structlogでリクエストとレスポンスログを拡張しよう
- 4.6 ログを活用する
- CloudWatch Logs Insightsでログを横断的に検索する
第5章 リリースを管理して開発効率を高める
towncrierとGitHub Actionsによるリリースの自動化
- 5.1 リリースを管理しよう
- リリースを管理しないと発生する困りごと
- リリースを管理すると解決できること
- 5.2 リリースを管理する方法
- Changelogを手動で作成する
- towncrierでChangelogを自動更新する
- 5.3 GitHub Actionsでリリースを自動化する
- GitHub Actionsとは
- リリース作業を自動化するworkflowを作成する
- workflowを実行する
- workflowで作成したChangelog,Gitタグ,GitHubのリリースを確認する
第2部 Webシステム開発編
第6章 Djangoアプリケーションの品質を高める
単体テストと運用時の監視
- 6.1 Djangoとアプリケーション品質
- Django──フルスタックWebアプリケーションフレームワーク
- アプリケーションの品質
- 6.2 サンプルアプリケーションの作成
- 仕様
- 実装
- 6.3 標準モジュールを使った単体テスト
- 実装
- 実行
- 単体テストを作成するための標準モジュール
- 6.4 単体テストを効率化するライブラリ
- pytest──高機能な単体テストフレームワーク
- unittest.mock──外部システム通信や複雑な処理をモック化
- freezegun──単体テスト実行時の時刻を簡単に指定
- factory-boy──モデルのデータ作成を効率化
- 6.5 運用に役立つロギングと監視
- Python標準のロギングモジュールを活用
- Sentryで監視をより効果的に
第7章 DjangoでAPI開発
初めてのDjango REST framework
- 7.1 Django REST framework(DRF)とは
- DjangoとDRFの違い
- DRFのインストール方法
- 7.2 サンプルアプリケーションの準備
- DRFの準備
- DBの準備
- 7.3 シリアライザ
- シリアライザの作成方法
- デシリアライズ
- バリデーションの詳細
- バリデーション済みデータのDBへの登録/更新
- シリアライズ
- 7.4 APIビュー
- シンプルなAPIビュー
- ジェネリックAPIビュー
- ビューセット
第8章 Django×StrawberryによるGraphQL入門
GraphQLの基礎から実際のプロダクトへの導入まで
- 8.1 GraphQL──自由で過不足の少ないAPI
- GraphQLのメリット
- GraphQLのスキーマを知る
- 8.2 Strawberryとは
- 8.3 Django×StrawberryでGraphQLサーバを立ち上げてみよう
- 必要なパッケージをインストールしよう
- GraphQLサーバを立ち上げよう
- 8.4 ミューテーションの実装──カテゴリ登録APIの実装
- 入力型とミューテーションを実装する
- ミューテーションをスキーマに追加する
- 8.5 子ノードと子孫ノードを取得しよう──リゾルバチェインズ
- リゾルバ関数
- リゾルバチェインズ
- リゾルバチェインズによる子ノードと子孫ノードの取得の実装例
- リゾルバ関数とビジネスロジックは分けよう
- リゾルバチェインズの柔軟性の代償としてのN+1問題
- 8.6 N+1問題とどう向き合うか──データローダパターン
- N+1問題とは
- GraphQLではなぜN+1問題が発生しがちなのか
- データローダパターンを使う
- データローダの実装方法
- データローダの制約
- 8.7 エラー対応──開発者用のエラーとユーザー用のエラーを使い分ける
- 一般APIエラー対応
- 開発者用エラーの返し方
- ユーザー用エラーの返し方
- 8.8 GraphQLにおけるユニットテストの考え方
- GraphQLエンジンはテスト重要度もテスト容易性も低い
- リゾルバ関数はテスト重要度が低い
- ビジネスロジックをテストしよう
- GraphQLをテストしたい場合
第9章 FastAPIによるWeb API開発
型ヒントを活用したAPI仕様中心の開発手法
- 9.1 FastAPIの特徴
- 9.2 FastAPIの開発環境をセットアップしよう
- 最小限のプロジェクトを作成しよう
- 最小限のプロジェクトの動作を確認しよう
- 9.3 API仕様とモックを作成しよう
- FastAPIによる開発の一般的な構成を理解しよう
- API仕様を決めてエンドポイントと入出力を設計しよう
- スキーマを定義しよう
- ルータを定義しよう
- 生成されたドキュメントとAPIの動作を確認しよう
- 9.4 DBに接続する処理を追加し,API実装を完成させよう
- DB接続に必要なライブラリをセットアップしよう
- DBに接続するDependencyを作成しよう
- CRUD処理を実装しよう
- path operation関数を完成させよう
- APIの動作を確認しよう
- 9.5 バリデーションとエラー処理を追加しよう
- スキーマにバリデーションを追加しよう
- ルータにバリデーションを追加しよう
- HTTPException例外を使って400番台のエラーを返そう
- 9.6 FastAPIの強み
第10章 Django ORMの速度改善
クエリ発行の基礎,計測,チューニング
- 10.1 作成するサンプルアプリケーション
- Djangoアプリケーションの作成
- ダミーデータの投入
- 10.2 DjangoアプリケーションのSQL発行ログの確認
- 簡易的にクエリを調べる
- ライブラリを使い,画面上で俯瞰して確認する──Silk
- 10.3 Django ORMのクエリ発行タイミング
- クエリ発行タイミングの原則──遅延実行
- クエリ発行が遅延される場合(d1) ──filterメソッドのチェイン
- クエリ発行が遅延される場合(d2)──リレーション先のオブジェクトの取得
- 10.4 親子モデルの情報の取得を改善する
- 実行時間の計測──デコレータで特定ビューの実行時間を計測する
- 子から親の情報参照──select_relatedメソッド
- 親から子の情報参照──prefetch_relatedメソッド
- 10.5 大量レコードの作成・更新を改善する
- 大量レコードの作成──bulk_createメソッド
- 大量レコードの更新──bulk_updateメソッド
第11章 Django ORMトラブルシューティング
ORMにまつわる問題を解決するための型を身に付けよう
- 11.1 ORM利用の3つの基本
- 11.2 SQLを確認する
- 問題のあるORMクエリ例
- Django ORMのログ出力設定
- ログは現状を映す鏡
- 11.3 意図しないタイミングでのSQL発行を避ける
- PythonスクリプトでDjango ORMを実行
- コードを集めて処理の要点を押さえる
- 11.4 理想のSQLからORMを組む
- SQLを整形表示する治具を作る
- 理想のSQLを考える
- 現実的な時間で開発を進める
第3部 機械学習・データ分析編
第12章 データサイエンスプログラムの品質改善
5つのステップで製品レベルの品質へ
- 12.1 PoCフェーズのあとに必要なこと
- 架空のシナリオについて
- 品質向上のための5つのステップ
- 12.2 ステップ1:単体コマンドとして実行できるようにする
- 一般的なディレクトリ構成にする
- 実行可能コマンドを作成する
- 仮想環境を作成し,ライブラリを導入する
- フォーマッター,静的チェックを実行
- プログラムを実行する
- 12.3 ステップ2:回帰テストを行えるようにする
- 回帰テスト導入のために最低限の修正をする
- pytest-snapshotを使用して回帰テストを実現する
- 回帰テストを実行する
- 12.4 ステップ3:パフォーマンス対策をできるようにする
- プロファイラを導入する
- Line Profilerで実行時間を計測する
- Memory Profilerでメモリ使用量を計測する
- 実行速度改善のテクニック
- プログラムを書き換えたらプロファイラを再実行しよう
- 12.5 ステップ4:コードの可読性を向上する
- 処理を関数に分割して可読性を向上する
- 12.6 ステップ5:コードの保守性を向上する
- 12.7 まとめ──限られた時間で最大の効果を
第13章 データ分析レポートの作成
JupyterLab+pandas+Plotlyでインタラクティブに
- 13.1 環境構築
- サンプルデータ
- 13.2 表にスタイルを適用する──pandasのStyling機能
- pandasのインポートとサンプルデータの読み込み
- DataFrameのStyling機能とは
- セルの値を棒グラフで表現する
- 条件付き書式でセルの背景色を変更する
- 1つのDataFrameに複数のスタイルを適用する
- 条件付き書式で行の背景色を変更する
- すべてのスタイル変更をまとめる
- 13.3 動的なグラフを描画する──Plotly Express
- 13.4 レポートを出力する──ノートブックのHTML化
第14章 pandasを使った処理を遅くしないテクニック
4つの視点でパフォーマンス改善
- 14.1 なぜpandasによるデータ処理が遅くなってしまうのか
- 14.2 遅い機能を使わないようにしよう
- iterrowsの使用は避けよう
- DataFrameのapplyメソッドはあまり速くないことを知ろう
- 14.3 「Pythonの遅さ」に対処しよう
- Pythonがどれくらい遅いのかを知ろう
- なるべく列をまとめて計算しよう
- loc,where,maskを活用してPythonでの分岐を減らそう
- 14.4 アルゴリズムやデータ構造の効率化を考えよう
- groupbyを使って多重ループを回避しよう
- カテゴリ型を使おう
- 14.5 マルチコアCPUを使い切ろう
- 時間がかかる処理はマルチコアを使い切れているか確認しよう
- マルチコアを使い切る方法を知ろう
- pandarallelでapplyを並列化しよう
- 14.6 まとめ──チューニングは必要になってから
第15章 JanomeとSudachiPyによる日本語処理
フリガナプログラム作成で学ぶ自然言語処理の流れ
- 15.1 日本語の処理とは
- 形態素解析とは
- 品詞,原形,読み
- 漢字の読みの難しさ
- 形態素解析の用途
- 文章にフリガナを振る
- 15.2 Janomeで形態素解析
- Janomeとは
- Janomeをインストールして使ってみる
- Janomeでフリガナを振る
- 辞書をカスタマイズする
- 15.3 SudachiPyで形態素解析
- SudachiPyとは
- SudachiPyをインストールして使ってみる
- SudachiPyでフリガナを振る
- さらにフリガナ処理を改善する
- ユーザー辞書をカスタマイズする
- ユーザー辞書のコストを調整する
- フリガナの漢字レベル対応
第16章 データサイエンスのためのテスト入門
pandasやNumPyのテスト機能を使って快適に実験
- 16.1 データサイエンスにおけるテスト
- ソフトウェア開発におけるテストとの違い
- テスト導入のステップ
- 16.2 仮想環境の作成
- 16.3 assert文による簡単なチェック
- 目視確認からassert文へ
- assert文でチェックする内容とタイミング
- 16.4 pandasのテスト機能──pandas.testingモジュール
- DataFrameの比較──assert_frame_equal()
- Seriesの比較──assert_series_equal()
- 16.5 NumPyのテスト機能──numpy.testingモジュール
- NumPy配列の比較──assert_array_equal()
- 浮動小数点数を持つNumPy配列の比較──assert_allclose()
- 16.6 Pythonモジュールに切り出し,pytestでテストの実行を自動化
- テストに向いているコード
- pytestによるテスト
第17章 Pythonで始める数理最適化
看護師のスケジュール作成で基本をマスター
- 17.1 数理最適化とは──数理モデルによる最適化
- 数理モデルの構成要素
- 数理モデルの解き方──ソルバー
- 17.2 ライブラリを使った数理モデルの作成
- 化学製品の問題の数理モデル
- Python-MIPのメソッドやプロパティ
- 17.3 数理最適化で看護師のスケジュールを作成
- スケジュール作成の課題
- 問題──看護師のスケジュール作成
- 変数,目的関数,制約条件
- 希望シフトのデータの準備と変数表の作成
- Pythonによる数理モデルの作成
- 17.4 StreamlitによるWebアプリケーション化
- Streamlitとは
- Streamlitを組み込む
- 索引