Skip to content

Commit 6a5acd0

Browse files
authored
Merge pull request LREN-CHUV#52 from LREN-CHUV/fix-anova
raise error in anova when data is empty
2 parents e7e413c + 278254b commit 6a5acd0

2 files changed

Lines changed: 59 additions & 2 deletions

File tree

python-anova/anova.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,12 @@ def format_output(statsmodels_dict):
6969
def compute_anova(dep_var, indep_vars, data, design='factorial'):
7070
formula = generate_formula(dep_var, indep_vars, design)
7171
logging.info("Formula: %s" % formula)
72-
lm = ols(data=DataFrame(data), formula=formula).fit()
72+
data = DataFrame(data)
73+
74+
if data.empty:
75+
raise errors.UserError('SQL returned no data, check your dataset and null values.')
76+
77+
lm = ols(data=data, formula=formula).fit()
7378
logging.info(lm.summary())
7479
return anova_lm(lm)
7580

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import pytest
2-
from anova import generate_formula
2+
import mock
3+
import json
4+
from anova import generate_formula, main
35
from mip_helper import errors
6+
from mip_helper import testing as t
47

58

69
def test_generate_formula():
@@ -9,3 +12,52 @@ def test_generate_formula():
912
indep_vars = [{'name': str(i)} for i in range(10)]
1013
with pytest.raises(errors.UserError):
1114
generate_formula(dep_var, indep_vars, 'factorial')
15+
16+
17+
@mock.patch('anova.io_helper.fetch_data')
18+
@mock.patch('anova.io_helper.save_results')
19+
def test_main(mock_save_results, mock_fetch_data):
20+
mock_fetch_data.return_value = t.inputs_regression(include_nominal=False)
21+
main()
22+
result = json.loads(mock_save_results.call_args[0][0])
23+
assert t.round_dict(result) == {
24+
'Residual': {
25+
'F': 'NaN',
26+
'PR(>F)': 'NaN',
27+
'df': 1.0,
28+
'mean_sq': 0.019,
29+
'sum_sq': 0.019
30+
},
31+
'minimentalstate': {
32+
'F': 12.831,
33+
'PR(>F)': 0.173,
34+
'df': 1.0,
35+
'mean_sq': 0.248,
36+
'sum_sq': 0.248
37+
},
38+
'subjectage': {
39+
'F': 0.958,
40+
'PR(>F)': 0.507,
41+
'df': 1.0,
42+
'mean_sq': 0.019,
43+
'sum_sq': 0.019
44+
},
45+
'subjectage:minimentalstate': {
46+
'F': 0.096,
47+
'PR(>F)': 0.808,
48+
'df': 1.0,
49+
'mean_sq': 0.002,
50+
'sum_sq': 0.002
51+
}
52+
}
53+
54+
55+
@mock.patch('anova.io_helper.fetch_data')
56+
@mock.patch('anova.io_helper.save_error')
57+
@mock.patch('sys.exit')
58+
def test_main_empty_input(mock_exit, mock_save_error, mock_fetch_data):
59+
mock_fetch_data.return_value = t.inputs_regression(limit_to=0)
60+
main()
61+
62+
mock_exit.assert_called_once_with(1)
63+
mock_save_error.assert_called_once()

0 commit comments

Comments
 (0)