Pandas実践ガイド:データ分析のための主要スキルまとめ

はじめに

データ分析やマイニングにおいては、まずSQLを用いてデータウェアハウスで大量のデータを処理し、その後Pythonを使用して後続の分析やモデリングに適した形へとデータを整形することが一般的です。この工程においてPythonとpandasは非常に重要な役割を果たします。

「道具が良ければ、仕事も速く正確になる」。これまで断片的にpandasのコア構文や可視化テクニックを紹介してきましたが、今回は週末を利用して7日間かけて、pandasの中心的なスキルを体系的にまとめたチュートリアルを作成しました。本資料は以下の特徴を持っています:

  • pandas 2.2.0 バージョンに基づいています。
  • 基本から応用まで、豊富な例題を通じてpandasの主要機能をわかりやすく解説。
  • データ処理および可視化における頻出スキルを深く掘り下げています。
  • 正規表現、条件抽出、集計、ソート、関数型プログラミング、チャート表示、データマイニングなど多岐にわたるトピックを網羅。
  • 市販の教材と比較して、より多くの実践的なケーススタディと便利なテクニックを収録しています。
  • 読者がデータ加工に対してより自信を持てるようになることを目指しています。

内容は多岐にわたるため、ブックマークしてじっくり読んでいただければ幸いです。参考になれば、「いいね」「フォロー」「シェア」をお願いいたします。

「Z氏のメモ帳」という公式アカウントでは、データインサイト・大規模言語モデル・可視化に関する継続的な情報を発信しており、今後ツール編・アプリケーション編・ビジネス編などの高品質なチュートリアルも順次公開予定です。これにより、データサイエンスの領域において圧倒的なスキルを持つことができます。

本記事で使用するPythonおよび各種ライブラリのバージョン情報は以下の通りです:

# !pip install pandas_flavor==0.6.0
# !pip install pyjanitor==0.26.0
# !pip install mpl_font==1.1.0
# !pip install mplcyberpunk==0.7.1
import numpy as np 
import pandas as pd 
import pandas_flavor 
import janitor
import matplotlib
import mplcyberpunk
import seaborn as sns
import scipy
import numba
import warnings
warnings.filterwarnings('ignore')
print("numpy:",np.__version__) # numpy: 1.26.3
print("pandas:", pd.__version__) # pandas: 2.2.0
print("pandas_flavor: 0.6.0") # pandas_flavor: 0.6.0
print("matplotlib:",matplotlib.__version__)  #matplotlib: 3.7.4
print("seaborn:",sns.__version__)  # seaborn: 0.12.2
print("scipy:",scipy.__version__)  # scipy: 1.11.4
print("numba:",numba.__version__)  # numba: 0.58.1 

目次

  • 前書き
  • 準備編:Python開発の基礎知識
    • LLMツールの活用方法
    • Githubリポジトリのコード閲覧術
    • JupyterLabの主要コマンド一覧
    • PipおよびCondaソースの設定
    • 固定シードによる再現性確保
    • メモリとGPUメモリ解放コード
  • 初級編:Pandasの基本関数概要
    • Pandasの出力形式設定
    • データ型と構造体のまとめ
    • 統計量と分布指標の確認
    • 集約関数の使い方
    • 条件フィルタリング関数
    • 日付データの加工手法
    • 文字列操作の基本
    • ファイル入出力形式とパフォーマンス比較
    • 正規表現の要点
  • 中級編:高度な関数による複雑なデータ処理
    • filter関数の応用
    • assign関数の活用
    • query関数の使い方
    • eval関数による評価処理
    • stack/unstackによる効率的なデータ変換
    • マルチインデックスの操作
    • データクリーニング関連関数
    • crosstabによるカテゴリデータ処理
    • ウィンドウ関数の種類と用途
  • 中級編:複数DataFrame間の結合処理
    • 等値条件に基づくjoin操作
    • 非等値条件でのjoin実装
    • append/concatによるUNION ALL相当処理
  • 中級編:チェーンプログラミング技法
    • Pandas内蔵メソッドによるチェーン処理
    • パイプライン処理の実装
  • 中級編:Pandas高速化技術
    • Ctypesを利用した計算速度向上
    • NumbaによるJITコンパイル最適化
    • Pandarallelを使った並列処理
  • 中級編:PyJanitorとの連携(DataFrame拡張・データクリーニング)
    • PyJanitorの動作原理
    • also/thenによるカスタム関数呼び出し
    • データクリーニング関数群
    • 条件判定系メソッド
  • 応用編:Pandas vs SQL対比
    • テストデータ準備
    • 複数条件検索(Pandas vs Hive SQL)
    • テーブル結合(等値条件)
    • 列→行変換
    • 行→列変換
    • UNION操作
    • ソート関数
    • Lag/Lead関数
    • FIRST_VALUE/LAST_VALUE関数
    • ウィンドウ関数
    • Preceding/Following指定
  • 応用編:美しいグラフ描画
    • 棒グラフ作成
    • 複数グラフの横並び配置
    • 縦分割レイアウト
    • Seabornによるヒストグラム・カーネル密度推定図
    • Pandas plotによるマルチチャート表示
  • 応用編:テーブルスタイルのカスタマイズ
    • 背景色の設定
    • カラーバー表示
    • アイコン埋め込み
    • グラデーション表示
  • 応用編:pandas_flavorによるユーザー定義関数拡張
  • 応用編:ミニチャート・グラフ挿入による視覚的レポート作成

準備編:Python開発の基礎知識

LLMツールの活用方法

現在の大規模言語モデルは高校生レベルと考えられ、複雑な問題への対応には限界がありますが、入門的な質問には有用な回答を返すことができます。例えば括弧内の文字列を取り出す正規表現が思い出せない場合、以下のように質問すると:

user: pythonで括弧内の文字列を抽出する正規表現コードを教えてください

モデルからの返答例:

import re
text = "これは(サンプル)テキストであり、別の(コンテンツ)もあります。"
result = re.findall(r'\((.*?)\)', text)
print(result)
# ['サンプル', 'コンテンツ']

Githubリポジトリのコード閲覧術

Python開発中にライブラリの使い方がわからない場合は、大規模言語モデルだけでなくGitHub上で該当リポジトリを検索することも有効です。これにより公式ドキュメントやソースコードに直接アクセスでき、最新かつ正確な情報を得ることができます。例としてpandasのリポジトリ検索画面:

JupyterLabの主要コマンド一覧

Bashコマンド:

# 全ての出力を表示
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"

jupyter kernelspec list                    # 登録済みカーネル一覧
jupyter kernelspec remove 'kernel_name'   # 特定カーネル削除
conda install ipykernel                   # 新環境にipykernel追加
python -m ipykernel install --user --name env_name --display-name "Alias Name" # 仮想環境登録

# GitHub上の.ipynbファイルが読み込めない際は以下URLで安定して表示可能(オープンソース限定)
https://nbviewer.org/

JupyterLab内マジックコマンド:

%cd target_directory       # 指定ディレクトリ移動
function_name?             # 引数情報表示
function_name??            # ソースコード表示

!ls                        # 現在位置ファイル一覧
%%time                     # 実行時間測定
%%capture                  # 出力抑制
%%run demo.py              # Pythonファイル実行
%prun slow_function()      # 関数別消費時間解析
%matplotlib inline         # plt.show()相当
%timeit simple_code        # 単一行実行時間計測
dir_name = 'new_folder'
!mkdir $dir_name           # 変数展開によるフォルダ作成

%load ./hello_world.py     # 外部ファイル読み込み
%%file hello.py            # ファイル作成
%%writefile demo.py        # 書き込み

%%bash                     # bashスクリプト実行
for i in {1..5}; do echo "i is $i"; done

PipおよびCondaソースの設定

pipソース設定(清華大学ミラー):

pip config set global.trusted-host pypi.tuna.tsinghua.edu.cn
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple/
pip config set global.timeout 500

pip install --ignore-installed llvmlite # 上書きインストール
# オフラインダウンロード&インストール:
pip download -d ./packages package_name
pip install --no-index --find-links=./packages package_name

condaソース設定:

# 清華大学Anacondaミラー追加
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/pro/

## 削除コマンド
conda config --remove channels 

# チャンネルURL表示設定
conda config --set show_channel_urls yes

# 設定情報表示
conda config --show-sources

固定シードによる再現性確保

コード実行結果の一貫性を保つために、ランダムシードを固定します:

import random 
import os
import numpy as np
import torch

def fix_random_seeds(seed_value=42):
    random.seed(seed_value)
    os.environ['PYTHONHASHSEED'] = str(seed_value)
    np.random.seed(seed_value)
    torch.manual_seed(seed_value)
    if torch.cuda.is_available():
        torch.cuda.manual_seed(seed_value)
        torch.backends.cudnn.deterministic = True
        torch.backends.cudnn.benchmark = False
        torch.backends.cudnn.enabled = True
        
fix_random_seeds(2023)

メモリとGPUメモリ解放コード

不要になったメモリを解放することでシステムリソースを節約できます:

import gc
import ctypes
import torch

def release_unused_resources():
    gc.collect()
    try:
        ctypes.CDLL("libc.so.6").malloc_trim(0)
    except:
        pass
    if torch.cuda.is_available():
        torch.cuda.empty_cache()

release_unused_resources()

タグ: Pandas data-analysis Python regex jupyter

7月29日 03:23 投稿