sitespeed.io/lib/plugins/compare/statistical.py

41 lines
1.5 KiB
Python

import sys
import json
from scipy.stats import wilcoxon, mannwhitneyu
def has_variability(sample):
"""Check if the sample has more than one unique value."""
return len(set(sample)) > 1
def perform_test(test_type, baseline, current, **kwargs):
"""Perform the statistical test based on the test type."""
if not has_variability(baseline) or not has_variability(current):
if baseline == current:
return None, "Datasets are identical"
else:
return None, "No variability"
if test_type == 'wilcoxon':
return wilcoxon(current, baseline, **kwargs)
elif test_type == 'mannwhitneyu':
return mannwhitneyu(current, baseline, **kwargs)
else:
raise ValueError("Invalid test type. Choose 'wilcoxon' or 'mannwhitneyu'.")
input_data = json.loads(sys.stdin.read())
options = input_data['options']
test_type = options.pop('test_type')
final_results = {}
# Iterate over each metric group in the metrics dictionary
for group_name, metrics in input_data['metrics'].items():
group_results = {}
for metric_name, metric_data in metrics.items():
stat, p = perform_test(test_type, metric_data['baseline'], metric_data['current'], **options)
if p == "No variability" or p == "Datasets are identical":
group_results[metric_name] = {'statistic': "N/A", 'p-value': p}
else:
group_results[metric_name] = {'statistic': stat, 'p-value': p}
final_results[group_name] = group_results
print(json.dumps(final_results))