1use pyo3::exceptions::PyRuntimeError;
6use pyo3::prelude::*;
7use pyo3::types::{PyAny, PyDict};
8use scirs2_numpy::{PyArray1, PyArrayMethods};
9
10use super::types::{
11 PyBeta, PyBinomial, PyCauchy, PyChiSquare, PyExponential, PyF, PyGamma, PyGeometric, PyLaplace,
12 PyLogistic, PyLognormal, PyNormal, PyPareto, PyPoisson, PyStudentT, PyUniform, PyWeibull,
13};
14
15use super::batch::register_batch_module;
17use super::functions::{
18 correlation_py, covariance_py, describe_py, iqr_py, mean_py, median_py, percentile_py, std_py,
19 ttest_1samp_py, ttest_ind_py, var_py,
20};
21use super::functions_2::{
22 boxplot_stats_py, coef_variation_py, cross_entropy_py, data_range_py, entropy_py,
23 gini_coefficient_py, gmean_py, hmean_py, kl_divergence_py, kurtosis_ci_py, kurtosis_py,
24 mean_abs_deviation_py, median_abs_deviation_py, mode_py, moment_py, quartiles_py, quintiles_py,
25 skew_py, skewness_ci_py, ttest_rel_py, weighted_mean_py, winsorized_mean_py,
26 winsorized_variance_py, zscore_py,
27};
28use super::functions_3::{
29 anderson_darling_py, bartlett_test_py, brown_forsythe_py, chisquare_py, covariance_simd_py,
30 dagostino_k2_py, deciles_py, f_oneway_py, kruskal_py, kurtosis_simd_py, levene_py,
31 mannwhitneyu_py, mean_simd_py, moment_simd_py, pearson_r_simd_py, percentile_range_py, sem_py,
32 shapiro_py, skewness_simd_py, std_simd_py, variance_simd_py, wilcoxon_py,
33};
34use super::functions_4::{
35 chi2_independence_py, chi2_yates_py, fisher_exact_py, friedman_py, ks_2samp_py, linregress_py,
36 odds_ratio_py, pearsonr_py, relative_risk_py, spearmanr_py, tukey_hsd_py,
37};
38use scirs2_stats::kendalltau;
39
40#[pyfunction]
55#[pyo3(signature = (x, y, method = "b", alternative = "two-sided"))]
56fn kendalltau_py(
57 py: Python,
58 x: &Bound<'_, PyArray1<f64>>,
59 y: &Bound<'_, PyArray1<f64>>,
60 method: &str,
61 alternative: &str,
62) -> PyResult<Py<PyAny>> {
63 let x_readonly = x.readonly();
64 let x_arr = x_readonly.as_array();
65 let y_readonly = y.readonly();
66 let y_arr = y_readonly.as_array();
67 let (tau, pvalue) = kendalltau(&x_arr.view(), &y_arr.view(), method, alternative)
68 .map_err(|e| PyRuntimeError::new_err(format!("Kendall tau test failed: {}", e)))?;
69 let dict = PyDict::new(py);
70 dict.set_item("correlation", tau)?;
71 dict.set_item("pvalue", pvalue)?;
72 Ok(dict.into())
73}
74pub fn register_module(m: &Bound<'_, PyModule>) -> PyResult<()> {
76 m.add_function(wrap_pyfunction!(describe_py, m)?)?;
77 m.add_function(wrap_pyfunction!(mean_py, m)?)?;
78 m.add_function(wrap_pyfunction!(std_py, m)?)?;
79 m.add_function(wrap_pyfunction!(var_py, m)?)?;
80 m.add_function(wrap_pyfunction!(percentile_py, m)?)?;
81 m.add_function(wrap_pyfunction!(correlation_py, m)?)?;
82 m.add_function(wrap_pyfunction!(covariance_py, m)?)?;
83 m.add_function(wrap_pyfunction!(median_py, m)?)?;
84 m.add_function(wrap_pyfunction!(iqr_py, m)?)?;
85 m.add_function(wrap_pyfunction!(ttest_1samp_py, m)?)?;
86 m.add_function(wrap_pyfunction!(ttest_ind_py, m)?)?;
87 m.add_function(wrap_pyfunction!(ttest_rel_py, m)?)?;
88 m.add_function(wrap_pyfunction!(shapiro_py, m)?)?;
89 m.add_function(wrap_pyfunction!(chisquare_py, m)?)?;
90 m.add_function(wrap_pyfunction!(f_oneway_py, m)?)?;
91 m.add_function(wrap_pyfunction!(wilcoxon_py, m)?)?;
92 m.add_function(wrap_pyfunction!(mannwhitneyu_py, m)?)?;
93 m.add_function(wrap_pyfunction!(kruskal_py, m)?)?;
94 m.add_function(wrap_pyfunction!(levene_py, m)?)?;
95 m.add_function(wrap_pyfunction!(bartlett_test_py, m)?)?;
96 m.add_function(wrap_pyfunction!(brown_forsythe_py, m)?)?;
97 m.add_function(wrap_pyfunction!(anderson_darling_py, m)?)?;
98 m.add_function(wrap_pyfunction!(dagostino_k2_py, m)?)?;
99 m.add_function(wrap_pyfunction!(ks_2samp_py, m)?)?;
100 m.add_function(wrap_pyfunction!(friedman_py, m)?)?;
101 m.add_function(wrap_pyfunction!(chi2_independence_py, m)?)?;
102 m.add_function(wrap_pyfunction!(chi2_yates_py, m)?)?;
103 m.add_function(wrap_pyfunction!(fisher_exact_py, m)?)?;
104 m.add_function(wrap_pyfunction!(odds_ratio_py, m)?)?;
105 m.add_function(wrap_pyfunction!(relative_risk_py, m)?)?;
106 m.add_function(wrap_pyfunction!(linregress_py, m)?)?;
107 m.add_function(wrap_pyfunction!(tukey_hsd_py, m)?)?;
108 m.add_function(wrap_pyfunction!(skew_py, m)?)?;
109 m.add_function(wrap_pyfunction!(kurtosis_py, m)?)?;
110 m.add_function(wrap_pyfunction!(mode_py, m)?)?;
111 m.add_function(wrap_pyfunction!(gmean_py, m)?)?;
112 m.add_function(wrap_pyfunction!(hmean_py, m)?)?;
113 m.add_function(wrap_pyfunction!(zscore_py, m)?)?;
114 m.add_function(wrap_pyfunction!(mean_abs_deviation_py, m)?)?;
115 m.add_function(wrap_pyfunction!(median_abs_deviation_py, m)?)?;
116 m.add_function(wrap_pyfunction!(data_range_py, m)?)?;
117 m.add_function(wrap_pyfunction!(coef_variation_py, m)?)?;
118 m.add_function(wrap_pyfunction!(gini_coefficient_py, m)?)?;
119 m.add_function(wrap_pyfunction!(boxplot_stats_py, m)?)?;
120 m.add_function(wrap_pyfunction!(quartiles_py, m)?)?;
121 m.add_function(wrap_pyfunction!(quintiles_py, m)?)?;
122 m.add_function(wrap_pyfunction!(deciles_py, m)?)?;
123 m.add_function(wrap_pyfunction!(sem_py, m)?)?;
124 m.add_function(wrap_pyfunction!(percentile_range_py, m)?)?;
125 m.add_function(wrap_pyfunction!(winsorized_mean_py, m)?)?;
126 m.add_function(wrap_pyfunction!(winsorized_variance_py, m)?)?;
127 m.add_function(wrap_pyfunction!(skewness_simd_py, m)?)?;
128 m.add_function(wrap_pyfunction!(kurtosis_simd_py, m)?)?;
129 m.add_function(wrap_pyfunction!(pearson_r_simd_py, m)?)?;
130 m.add_function(wrap_pyfunction!(covariance_simd_py, m)?)?;
131 m.add_function(wrap_pyfunction!(moment_simd_py, m)?)?;
132 m.add_function(wrap_pyfunction!(mean_simd_py, m)?)?;
133 m.add_function(wrap_pyfunction!(std_simd_py, m)?)?;
134 m.add_function(wrap_pyfunction!(variance_simd_py, m)?)?;
135 m.add_function(wrap_pyfunction!(entropy_py, m)?)?;
136 m.add_function(wrap_pyfunction!(kl_divergence_py, m)?)?;
137 m.add_function(wrap_pyfunction!(cross_entropy_py, m)?)?;
138 m.add_function(wrap_pyfunction!(weighted_mean_py, m)?)?;
139 m.add_function(wrap_pyfunction!(moment_py, m)?)?;
140 m.add_function(wrap_pyfunction!(skewness_ci_py, m)?)?;
141 m.add_function(wrap_pyfunction!(kurtosis_ci_py, m)?)?;
142 m.add_class::<PyNormal>()?;
143 m.add_class::<PyBinomial>()?;
144 m.add_class::<PyPoisson>()?;
145 m.add_class::<PyExponential>()?;
146 m.add_class::<PyUniform>()?;
147 m.add_class::<PyBeta>()?;
148 m.add_class::<PyGamma>()?;
149 m.add_class::<PyChiSquare>()?;
150 m.add_class::<PyStudentT>()?;
151 m.add_class::<PyCauchy>()?;
152 m.add_class::<PyF>()?;
153 m.add_class::<PyLognormal>()?;
154 m.add_class::<PyWeibull>()?;
155 m.add_class::<PyLaplace>()?;
156 m.add_class::<PyLogistic>()?;
157 m.add_class::<PyPareto>()?;
158 m.add_class::<PyGeometric>()?;
159 m.add_function(wrap_pyfunction!(pearsonr_py, m)?)?;
160 m.add_function(wrap_pyfunction!(spearmanr_py, m)?)?;
161 m.add_function(wrap_pyfunction!(kendalltau_py, m)?)?;
162 register_batch_module(m)?;
164 Ok(())
165}