26J29f4

Young-Kyoo Kim·2026년 6월 29일
"""
[신규 6단계] 전사 배포용 FinOps 자원 최적화 최종 마스터 엑셀 빌더
실행: python step6_excel_builder.py
"""

import pandas as pd
from pathlib import Path

MERGED_DIR = Path("./data/merged")
OUT_DIR = Path("./data/output")
OUT_DIR.mkdir(parents=True, exist_ok=True)

def build_master_excel_report():
    df_pod = pd.read_parquet(MERGED_DIR / "enriched_fixed_7d.parquet")
    df_ns = pd.read_parquet(MERGED_DIR / "pareto_fixed_ns.parquet")

    # ── 📝 탭 0. 전사 거시 지표 총괄 요약 데이터 빌드 ──
    summary_data = {
        "인프라 평가지표": [
            "총 CPU 할당량 (Core-Hours)", "총 CPU 실사용량 (Core-Hours)", "총 CPU 순수 낭비량 (Core-Hours)", "전사 CPU 평균 자원 효율성 (%)",
            "총 Memory 할당량 (GB-Hours)", "총 Memory 실사용량 (GB-Hours)", "총 Memory 순수 낭비량 (GB-Hours)", "전사 Memory 평균 자원 효율성 (%)"
        ],
        "관측 통계 실측치": [
            df_pod["cpu_allocated_core_hours"].sum(), df_pod["cpu_usage_core_hours"].sum(), df_pod["cpu_waste_core_hours"].sum(),
            (df_pod["cpu_usage_core_hours"].sum() / max(1, df_pod["cpu_allocated_core_hours"].sum())) * 100,
            df_pod["mem_allocated_gb_hours"].sum(), df_pod["mem_usage_gb_hours"].sum(), df_pod["mem_waste_gb_hours"].sum(),
            (df_pod["mem_usage_gb_hours"].sum() / max(1, df_pod["mem_allocated_gb_hours"].sum())) * 100
        ]
    }
    df_summary = pd.DataFrame(summary_data)
    df_summary["관측 통계 실측치"] = df_summary["관측 통계 실측치"].round(2)

    # ── 📝 탭 2. 낭비 실명 저격 Top 30 컨테이너 명세 ──
    df_waste_top30 = df_pod.sort_values(by="cpu_waste_core_hours", ascending=False).head(30)[
        ["date", "namespace", "workload_type", "pod", "container", "minutes_running", "cpu_request_max", "cpu_usage_p95", "cpu_waste_core_hours"]
    ].reset_index(drop=True)

    # ── 📝 탭 3. 시한폭탄 OOM / 자원부족 위험군 Top 10 명세 ──
    df_shortage_top10 = df_pod[df_pod["cpu_shortage_cores"] > 0].sort_values(by="cpu_shortage_cores", ascending=False).head(10)[
        ["date", "namespace", "workload_type", "pod", "container", "cpu_request_max", "cpu_usage_p95", "cpu_shortage_cores"]
    ].reset_index(drop=True)

    # Excel 마스터 문서 쓰기 파이프라인
    excel_path = OUT_DIR / "workload_analysis_master_fixed.xlsx"
    with pd.ExcelWriter(excel_path, engine="openpyxl") as writer:
        df_summary.to_excel(writer, sheet_name="0. 전사종합요약", index=False)
        df_ns.to_excel(writer, sheet_name="1. 파레토분석_NS", index=False)
        df_waste_top30.to_excel(writer, sheet_name="2. 컨테이너낭비Top30P", index=False)
        df_shortage_top10.to_excel(writer, sheet_name="3. 자원부족위험군Top10P", index=False)

    print(f"🚀 [마스터 엑셀 완공] 최종 보고서가 다음 경로에 저장되었습니다: {excel_path}\n")

if __name__ == "__main__":
    build_master_excel_report()

0개의 댓글