41 lines
1.5 KiB
Python
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))
|