目次
- はじめに
第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を組み込む
- 索引