|
3 | 3 | import dask |
4 | 4 | import dataclasses as dc |
5 | 5 | import inflect |
| 6 | +import numpy as np |
6 | 7 | import pandas as pd |
7 | 8 | from rich.console import Console |
8 | 9 | from rich.table import Table |
9 | 10 | from typing import Dict, List, Optional |
10 | 11 |
|
11 | | -from .constants import COL_PROC_NAME, HUMANIZED_LAYERS, Layer, MiB |
| 12 | +from .constants import COL_PROC_NAME, HUMANIZED_LAYERS, GiB, Layer, MiB |
12 | 13 | from .types import ( |
13 | 14 | AnalyzerResultType, |
14 | 15 | RawStats, |
@@ -155,6 +156,9 @@ def handle_result(self, result: AnalyzerResultType): |
155 | 156 | summary_table = self._create_summary_table(summary=summary, view_key=view_key) |
156 | 157 | layer_breakdown_table = self._create_layer_breakdown_table(summary=summary, view_key=view_key) |
157 | 158 | print_objects.append(summary_table) |
| 159 | + additional_metrics_table = self._create_additional_metrics_table(result=result, view_key=view_key) |
| 160 | + if additional_metrics_table is not None: |
| 161 | + print_objects.append(additional_metrics_table) |
158 | 162 | print_objects.append(layer_breakdown_table) |
159 | 163 | console = Console(record=True) |
160 | 164 | console.print(*print_objects) |
@@ -232,6 +236,63 @@ def _create_summary_table(self, summary: OutputSummary, view_key: ViewKey) -> Ta |
232 | 236 |
|
233 | 237 | return summary_table |
234 | 238 |
|
| 239 | + def _create_additional_metrics_table(self, result: AnalyzerResultType, view_key: ViewKey) -> Optional[Table]: |
| 240 | + if not result.additional_metrics: |
| 241 | + return None |
| 242 | + |
| 243 | + flat_view = result.flat_views[view_key] |
| 244 | + view_type = view_key[-1] |
| 245 | + view_additional_metrics = result.additional_metrics.get(view_type, []) |
| 246 | + if not view_additional_metrics: |
| 247 | + return None |
| 248 | + view_name = humanized_view_name(view_key, ' ') |
| 249 | + additional_table = Table(title=f"{view_name} Additional Metrics", title_style='bold magenta', expand=True) |
| 250 | + additional_table.add_column(header='Metric', style='bold') |
| 251 | + additional_table.add_column(header='Unit', style='italic') |
| 252 | + additional_table.add_column(header='Non-null', justify='right') |
| 253 | + additional_table.add_column(header='Min', justify='right') |
| 254 | + additional_table.add_column(header='Mean', justify='right') |
| 255 | + additional_table.add_column(header='Max', justify='right') |
| 256 | + |
| 257 | + found_metric = False |
| 258 | + for metric in view_additional_metrics: |
| 259 | + if metric not in flat_view.columns: |
| 260 | + continue |
| 261 | + metric_series = pd.to_numeric(flat_view[metric], errors='coerce').replace([np.inf, -np.inf], pd.NA) |
| 262 | + scale, unit = self._additional_metric_scale_and_unit(metric) |
| 263 | + metric_series = metric_series / scale |
| 264 | + non_null = int(metric_series.notna().sum()) |
| 265 | + if non_null == 0: |
| 266 | + additional_table.add_row(metric, unit, "0", "-", "-", "-") |
| 267 | + found_metric = True |
| 268 | + continue |
| 269 | + additional_table.add_row( |
| 270 | + metric, |
| 271 | + unit, |
| 272 | + f"{non_null:,}", |
| 273 | + f"{float(metric_series.min()):.3f}", |
| 274 | + f"{float(metric_series.mean()):.3f}", |
| 275 | + f"{float(metric_series.max()):.3f}", |
| 276 | + ) |
| 277 | + found_metric = True |
| 278 | + |
| 279 | + if not found_metric: |
| 280 | + return None |
| 281 | + return additional_table |
| 282 | + |
| 283 | + @staticmethod |
| 284 | + def _additional_metric_scale_and_unit(metric: str): |
| 285 | + metric_lower = metric.lower() |
| 286 | + if metric_lower.endswith('_gbps'): |
| 287 | + return GiB, 'GB/s' |
| 288 | + if metric_lower.endswith('_mbps'): |
| 289 | + return MiB, 'MB/s' |
| 290 | + if metric_lower.endswith('_gb'): |
| 291 | + return GiB, 'GB' |
| 292 | + if metric_lower.endswith('_mb'): |
| 293 | + return MiB, 'MB' |
| 294 | + return 1.0, '-' |
| 295 | + |
235 | 296 | def _format_val(self, value: float, fmt_int=False) -> str: |
236 | 297 | if value is None or value == 0: |
237 | 298 | return '-' |
|
0 commit comments