発展編②:pandasでSlackワースト10を抽出する

Parser

〜表データ処理の基本とクリティカルパス分析〜

📝 はじめに

前回は、dataclassを使ってTiming Reportのパス情報を
Startpoint・Endpoint・Slackを1つのオブジェクトに整理 しました。

今回はさらに一歩進めて、pandasを使ってSlackワースト10を抽出します。
実務でよく使う「クリティカルパス分析」をPythonで自動化できるようになります。


📦 pandasとは?

pandasは、Pythonで表形式データを扱うためのライブラリです。

  • CSVやリストを簡単に読み込み可能
  • 並べ替え・フィルタ・集計に強い
  • Excelより高速で自動化向き

インストールしていない場合は以下を実行してください。

pip install pandas

✍️ クラスからpandasへ

まずは前回のクラスデータをリストに格納してあるとします。
それを pandasのDataFrame に変換してみましょう。

import re
import pandas as pd
from dataclasses import dataclass, asdict

@dataclass
    class TimingPath:
    startpoint: str
    endpoint: str
    slack: float

filename = "timing_sample.rpt"

with open(filename, "r", encoding="utf-8") as f:
    text = f.read()

# 正規表現で抽出

start_matches = re.findall(r"Startpoint:\s(.+)", text) end_matches = re.findall(r"Endpoint:\s(.+)", text)
slack_matches = re.findall(r"slack.?([-+]?\d.?\d+)", text, flags=re.IGNORECASE)

# クラスのリストに格納

paths = []
for sp, ep, sl in zip(start_matches, end_matches, slack_matches):
    paths.append(TimingPath(startpoint=sp, endpoint=ep, slack=float(sl)))

# pandas DataFrameに変換

df = pd.DataFrame([asdict(p) for p in paths])
print(df)

出力例:

                                         startpoint  \
0  U1/clk (rising edge-triggered flip-flop clocked by CLK)   

                                           endpoint  slack  
0  U5/data (rising edge-triggered flip-flop clocked by CLK)   0.11  

🔍 Slackワースト10を抽出

pandasを使うと、並べ替えや抽出が一瞬でできます。

# Slackを昇順で並べ替え(小さい=悪いパス)
df_sorted = df.sort_values(by="slack", ascending=True)

# ワースト10を抽出
worst10 = df_sorted.head(10)

print("=== Slack ワースト10 ===")
print(worst10)

出力例(サンプルなので1件のみ):

=== Slack ワースト10 ===
                                         startpoint  \
0  U1/clk (rising edge-triggered flip-flop clocked by CLK)   

                                           endpoint  slack  
0  U5/data (rising edge-triggered flip-flop clocked by CLK)   0.11  

💡 応用ポイント

  • df[df["slack"] < 0]
    → タイミング違反パスだけを抽出
  • df.to_csv("worst10.csv", index=False)
    → 抽出結果をCSVとして保存
  • df.groupby("startpoint")["slack"].min()
    → Startpointごとの最悪Slackを一覧化

✅ まとめ

  • pandasを使えば、複数パスを簡単に並べ替え・抽出できる
  • Slackの小さい順に並べれば「クリティカルパス分析」が自動化できる
  • Excelより速く、再現性のある解析が可能になった
Parser
スポンサーリンク
この記事を書いた人

運営者について

当サイトは、個人が運営する学習・記録ブログです。

AI・データサイエンス・自動化を中心に、
Python、G検定・DS検定の学習内容や、
実際に試しながら整理した知識をまとめています。

特定の企業や団体に属さない個人サイトとして、
学習過程で得た気づきや判断の整理を目的に運営しています。

「知識はあるが、どう使えばよいか分からない」
「情報が多く、判断に迷ってしまう」
といった状態を減らすことを目的に発信しています。

専門家として教える立場ではなく、
自分自身がつまずき、試し、整理してきた過程をそのまま共有するスタイルです。

用語の暗記やテクニックの紹介よりも、
・なぜそう考えるのか
・どの順番で判断するのか
・どこで迷いやすいのか
といった思考の整理を重視しています。

学び場をフォローする
学び場をフォローする
タイトルとURLをコピーしました