"""
[신규 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")
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)
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)
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_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()