import pandas as pd import numpy as np from confidence import calculate_confidence_interval from latencyArgs import get_args import yaml import os class LatencyData: def __init__(self, filepath, delimiter=',', confidence_level=0.99): self.df = pd.read_csv(filepath, delimiter=delimiter, header=None, names=['index', 'delay_ms']) self.__parse(confidence_level) self.filepath = filepath def __parse(self, confidence_level): self.delays = np.array(self.df['delay_ms'].values) self.confidence_level = confidence_level # Вычисление базовой статистики self.mean_delay = np.mean(self.delays) self.median_delay = np.median(self.delays) self.std_delay = np.std(self.delays) self.min_delay = np.min(self.delays) self.max_delay = np.max(self.delays) # Вычисление доверительного интервала self.mean_ci, self.ci_lower, self.ci_upper, self.std_error = calculate_confidence_interval( self.delays, confidence_level) self.__output_data() def dump_to_yml(self): fileDict = dict() whereToSaveYml = os.path.basename(self.filepath).split('.')[0] whereToSaveYml = whereToSaveYml + '_res.yml' fileDict['filepath'] = str(self.filepath) fileDict['mean_delay'] = round(float(self.mean_delay), 3) fileDict['median_delay'] = round(float(self.median_delay), 3) fileDict['std_delay'] = round(float(self.std_delay), 3) fileDict['min_delay'] = round(float(self.min_delay), 3) fileDict['max_delay'] = round(float(self.max_delay), 3) fileDict['err'] = round(float(self.err), 3) with open(f"{get_args().yml_prefix}/{whereToSaveYml}", 'w') as f: yaml.dump(fileDict, f) @property def err(self): return (self.ci_upper - self.ci_lower)/2 def __output_data(self): # Вывод статистики print("=" * 60) print("АНАЛИЗ ЗАДЕРЖЕК С ДОВЕРИТЕЛЬНЫМ ИНТЕРВАЛОМ") print("=" * 60) print(f"Количество измерений (n): {len(self.delays)}") print(f"Уровень доверия: {self.confidence_level*100}%") print("\n--- ОСНОВНАЯ СТАТИСТИКА ---") print(f"Минимальная задержка: {self.min_delay:.2f} мс") print(f"Максимальная задержка: {self.max_delay:.2f} мс") print(f"Средняя задержка: {self.mean_delay:.2f} мс") print(f"Медианная задержка: {self.median_delay:.2f} мс") print(f"Стандартное отклонение: {self.std_delay:.2f} мс") print(f"Стандартная ошибка: {self.std_error:.4f} мс") print(f"\n--- ДОВЕРИТЕЛЬНЫЙ ИНТЕРВАЛ {self.confidence_level*100}% ---") print(f"Точечная оценка среднего: {self.mean_ci:.2f} мс") print( f"Доверительный интервал: [{self.ci_lower:.2f}, {self.ci_upper:.2f}] мс") print(f"Ширина интервала: {self.ci_upper - self.ci_lower:.2f} мс") print(f"Погрешность: ±{(self.ci_upper - self.ci_lower)/2:.2f} мс") # Дополнительные метрики cv = (self.std_delay / self.mean_delay) * 100 # Коэффициент вариации print(f"\n--- ДОПОЛНИТЕЛЬНЫЕ МЕТРИКИ ---") print(f"Коэффициент вариации: {cv:.1f}%") print(f"Q1 (25-й перцентиль): {np.percentile(self.delays, 25):.2f} мс") print(f"Q3 (75-й перцентиль): {np.percentile(self.delays, 75):.2f} мс") print( f"IQR (межквартильный размах): {np.percentile(self.delays, 75) - np.percentile(self.delays, 25):.2f} мс")