Skip to content

Commit 996f2ae

Browse files
committed
make release-tag: Merge branch 'main' into stable
2 parents 8f0f145 + 57f5766 commit 996f2ae

File tree

11 files changed

+60
-24
lines changed

11 files changed

+60
-24
lines changed

HISTORY.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,16 @@
11
# History
22

3+
## v0.27.1 - 2026-02-13
4+
5+
### Bugs Fixed
6+
7+
* `Meets Threshold?` column in QualityReport details is showing numerical values instead of booleans - Issue [#843](https://github.com/sdv-dev/SDMetrics/issues/843) by @fealho
8+
9+
### Maintenance
10+
11+
* Update README and other meta information to point to the DataCebo forum - Issue [#845](https://github.com/sdv-dev/SDMetrics/issues/845) by @pvk-developer
12+
* Update license information in pyproject.toml to use new format - Issue [#814](https://github.com/sdv-dev/SDMetrics/issues/814) by @pvk-developer
13+
314
## v0.27.0 - 2026-01-29
415

516
### New Features

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
[![Downloads](https://pepy.tech/badge/sdmetrics)](https://pepy.tech/project/sdmetrics)
1010
[![Tests](https://github.com/sdv-dev/SDMetrics/workflows/Run%20Tests/badge.svg)](https://github.com/sdv-dev/SDMetrics/actions?query=workflow%3A%22Run+Tests%22+branch%3Amain)
1111
[![Coverage Status](https://codecov.io/gh/sdv-dev/SDMetrics/branch/main/graph/badge.svg)](https://codecov.io/gh/sdv-dev/SDMetrics)
12-
[![Slack](https://img.shields.io/badge/Community-Slack-blue?style=plastic&logo=slack)](https://bit.ly/sdv-slack-invite)
12+
[![Forum](https://img.shields.io/badge/Forum-Join%20now!-36C5F0)](https://forum.datacebo.com)
1313
[![Tutorial](https://img.shields.io/badge/Demo-Get%20started-orange?style=plastic&logo=googlecolab)](https://bit.ly/sdmetrics-demo)
1414
[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.14279167.svg)](https://doi.org/10.5281/zenodo.14279167)
1515

latest_requirements.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
copulas==0.14.0
1+
copulas==0.14.1
22
numpy==2.3.5
33
pandas==2.3.3
44
plotly==6.5.2
55
scikit-learn==1.8.0
66
scipy==1.17.0
7-
tqdm==4.67.1
7+
tqdm==4.67.3

pyproject.toml

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ authors = [{ name = "MIT Data To AI Lab", email = "dailabmit@gmail.com" }]
55
classifiers = [
66
'Development Status :: 2 - Pre-Alpha',
77
'Intended Audience :: Developers',
8-
'License :: OSI Approved :: MIT License',
98
'Natural Language :: English',
109
'Programming Language :: Python :: 3',
1110
'Programming Language :: Python :: 3.9',
@@ -17,7 +16,8 @@ classifiers = [
1716
]
1817
keywords = ['sdmetrics', 'SDMetrics']
1918
dynamic = ['version']
20-
license = { text = 'MIT license' }
19+
license = 'MIT'
20+
license-files = ['LICENSE']
2121
requires-python = ">=3.9,<3.15"
2222
readme = 'README.md'
2323
dependencies = [
@@ -53,7 +53,7 @@ dependencies = [
5353
"Issue Tracker" = "https://github.com/sdv-dev/SDMetrics/issues"
5454
"Changes" = "https://github.com/sdv-dev/SDMetrics/blob/main/HISTORY.md"
5555
"Twitter" = "https://twitter.com/sdv_dev"
56-
"Chat" = "https://bit.ly/sdv-slack-invite"
56+
"Chat" = "https://forum.datacebo.com/"
5757

5858
[project.entry-points]
5959
sdmetrics = { main = 'sdmetrics.cli.__main__:main' }
@@ -105,7 +105,6 @@ dev = [
105105

106106
[tool.setuptools]
107107
include-package-data = true
108-
license-files = ['LICENSE']
109108

110109
[tool.setuptools.packages.find]
111110
include = ['sdmetrics', 'sdmetrics.*']
@@ -149,7 +148,7 @@ convention = 'google'
149148
add-ignore = ['D107', 'D407', 'D417']
150149

151150
[tool.bumpversion]
152-
current_version = "0.27.0"
151+
current_version = "0.27.1.dev1"
153152
parse = '(?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)(\.(?P<release>[a-z]+)(?P<candidate>\d+))?'
154153
serialize = [
155154
'{major}.{minor}.{patch}.{release}{candidate}',

sdmetrics/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
__author__ = 'MIT Data To AI Lab'
66
__email__ = 'dailabmit@gmail.com'
7-
__version__ = '0.27.0'
7+
__version__ = '0.27.1.dev1'
88

99
import sys
1010
import warnings as python_warnings

sdmetrics/reports/single_table/_properties/column_pair_trends.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,7 @@ def _generate_details(
392392
'Meets Threshold?': meets_threshold,
393393
'Error': error_messages,
394394
})
395+
result['Meets Threshold?'] = result['Meets Threshold?'].astype('boolean')
395396

396397
if result['Error'].isna().all():
397398
result = result.drop('Error', axis=1)

static_code_analysis.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
Run started:2026-01-29 21:43:48.344046+00:00
1+
Run started:2026-02-13 15:55:31.917050+00:00
22

33
Test results:
44
>> Issue: [B101:assert_used] Use of assert detected. The enclosed code will be removed when compiling to optimised byte code.
@@ -117,7 +117,7 @@ Test results:
117117
--------------------------------------------------
118118

119119
Code scanned:
120-
Total lines of code: 12188
120+
Total lines of code: 12189
121121
Total lines skipped (#nosec): 0
122122
Total potential issues skipped due to specifically being disabled (e.g., #nosec BXXX): 0
123123

tests/integration/reports/multi_table/test_quality_report.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ def test_multi_table_quality_report():
142142
'Real Correlation': [np.nan],
143143
'Synthetic Correlation': [np.nan],
144144
'Real Association': [np.nan],
145-
'Meets Threshold?': [True],
145+
'Meets Threshold?': pd.Series([True], dtype='boolean'),
146146
})
147147
pd.testing.assert_frame_equal(details[1], expected_df_1)
148148

@@ -176,7 +176,7 @@ def test_multi_table_quality_report():
176176
'Real Correlation': [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
177177
'Synthetic Correlation': [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
178178
'Real Association': [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
179-
'Meets Threshold?': [True, True, True, True, True, True],
179+
'Meets Threshold?': pd.Series([True, True, True, True, True, True], dtype='boolean'),
180180
})
181181
pd.testing.assert_frame_equal(details[3], expected_df_3)
182182
pd.testing.assert_frame_equal(details[7], expected_df_3)
@@ -205,7 +205,7 @@ def test_multi_table_quality_report():
205205
'Real Correlation': [np.nan, 0.946664, 0.966247, 0.862622],
206206
'Synthetic Correlation': [np.nan, 0.926925, 0.936853, 0.798384],
207207
'Real Association': [np.nan, np.nan, np.nan, np.nan],
208-
'Meets Threshold?': [True, True, True, True],
208+
'Meets Threshold?': pd.Series([True, True, True, True], dtype='boolean'),
209209
})
210210
pd.testing.assert_frame_equal(details[5], expected_df_4)
211211

tests/integration/reports/single_table/_properties/test_column_pair_trends.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def test_get_score(self):
6161
'Real Correlation': [0.04735340044317632, np.nan, np.nan, np.nan, np.nan, np.nan],
6262
'Synthetic Correlation': [-0.11506297326956302, np.nan, np.nan, np.nan, np.nan, np.nan],
6363
'Real Association': [np.nan] * 6,
64-
'Meets Threshold?': [True] * 6,
64+
'Meets Threshold?': pd.Series([True] * 6, dtype='boolean'),
6565
}
6666
expected_details = pd.DataFrame(expected_details_dict)
6767
pd.testing.assert_frame_equal(column_pair_trends.details, expected_details)
@@ -151,7 +151,7 @@ def test_only_categorical_columns(self):
151151
'Real Correlation': [np.nan] * 6,
152152
'Synthetic Correlation': [np.nan] * 6,
153153
'Real Association': [np.nan] * 6,
154-
'Meets Threshold?': [True] * 6,
154+
'Meets Threshold?': pd.Series([True] * 6, dtype='boolean'),
155155
}
156156
expected_details = pd.DataFrame(expected_details_dict)
157157
pd.testing.assert_frame_equal(column_pair_trends.details, expected_details)
@@ -187,7 +187,7 @@ def test_real_association_threshold_filters_pairs(self):
187187
'Real Correlation': [np.nan, np.nan, np.nan],
188188
'Synthetic Correlation': [np.nan, np.nan, np.nan],
189189
'Real Association': [0.0, 1.0, 0.0],
190-
'Meets Threshold?': [False, True, False],
190+
'Meets Threshold?': pd.Series([False, True, False], dtype='boolean'),
191191
})
192192
pd.testing.assert_frame_equal(column_pair_trends.details, expected_details)
193193
assert score == 1.0

tests/integration/reports/single_table/test_quality_report.py

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ def test_report_end_to_end(self):
146146
np.nan,
147147
],
148148
'Real Association': [np.nan] * 6,
149-
'Meets Threshold?': [True] * 6,
149+
'Meets Threshold?': pd.Series([True] * 6, dtype='boolean'),
150150
}
151151
expected_details_column_shapes = pd.DataFrame(expected_details_column_shapes_dict)
152152
expected_details_cpt = pd.DataFrame(expected_details_cpt__dict)
@@ -314,7 +314,7 @@ def test_quality_report_with_object_datetimes(self):
314314
np.nan,
315315
],
316316
'Real Association': [np.nan] * 6,
317-
'Meets Threshold?': [True] * 6,
317+
'Meets Threshold?': pd.Series([True] * 6, dtype='boolean'),
318318
}
319319
expected_details_column_shapes = pd.DataFrame(expected_details_column_shapes_dict)
320320
expected_details_cpt = pd.DataFrame(expected_details_cpt__dict)
@@ -394,7 +394,9 @@ def test_report_end_to_end_with_errors(self):
394394
'Real Correlation': [np.nan] * 6,
395395
'Synthetic Correlation': [np.nan] * 6,
396396
'Real Association': [np.nan] * 6,
397-
'Meets Threshold?': [np.nan, True, True, np.nan, np.nan, True],
397+
'Meets Threshold?': pd.Series(
398+
[np.nan, True, True, np.nan, np.nan, True], dtype='boolean'
399+
),
398400
'Error': [
399401
'AttributeError', # This can be either ValueError or AttributeError
400402
None,
@@ -417,6 +419,27 @@ def test_report_end_to_end_with_errors(self):
417419
pd.testing.assert_frame_equal(col_pair_report[1:], expected_details_cpt[1:])
418420
assert report.get_score() == 0.8204378797402054
419421

422+
def test_meets_threshold_column_has_boolean_dtype_with_errors(self):
423+
"""Test that 'Meets Threshold?' column contains booleans when errors occur."""
424+
# Setup
425+
real_data, synthetic_data, metadata = load_demo(modality='single_table')
426+
real_data.loc[2, 'second_perc'] = 'a' # Corrupt data to trigger errors
427+
428+
# Run
429+
report = QualityReport()
430+
report.generate(real_data, synthetic_data, metadata, verbose=False)
431+
details = report.get_details('Column Pair Trends')
432+
433+
# Assert
434+
meets_threshold_col = details['Meets Threshold?']
435+
assert meets_threshold_col.dtype == 'boolean'
436+
437+
# Ensure non-NA values are actual booleans, not integers
438+
non_na_values = meets_threshold_col.dropna()
439+
assert len(non_na_values) > 0
440+
for val in non_na_values:
441+
assert isinstance(val, np.bool_)
442+
420443
def test_report_with_column_nan(self):
421444
"""Test the report with column full of NaNs."""
422445
# Setup
@@ -538,7 +561,9 @@ def test_report_with_column_nan(self):
538561
np.nan,
539562
],
540563
'Real Association': [np.nan] * 10,
541-
'Meets Threshold?': [True, True, True, np.nan, True, True, np.nan, True, True, True],
564+
'Meets Threshold?': pd.array(
565+
[True, True, True, pd.NA, True, True, pd.NA, True, True, True], dtype='boolean'
566+
),
542567
'Error': [
543568
None,
544569
None,

0 commit comments

Comments
 (0)