rdt 1.21.1.dev0__tar.gz → 1.21.2.dev0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {rdt-1.21.1.dev0/rdt.egg-info → rdt-1.21.2.dev0}/PKG-INFO +1 -1
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/pyproject.toml +1 -1
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/__init__.py +1 -1
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/id.py +57 -5
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0/rdt.egg-info}/PKG-INFO +1 -1
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/LICENSE +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/README.md +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/_utils.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/errors.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/hyper_transformer.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/performance/__init__.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/performance/datasets/__init__.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/performance/datasets/base.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/performance/datasets/boolean.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/performance/datasets/categorical.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/performance/datasets/datetime.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/performance/datasets/id.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/performance/datasets/numerical.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/performance/datasets/pii.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/performance/datasets/text.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/performance/datasets/utils.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/performance/performance.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/performance/profiling.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/__init__.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/_validators.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/base.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/boolean.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/categorical.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/datetime.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/null.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/numerical.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/pii/__init__.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/pii/anonymization.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/pii/anonymizer.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/pii/utils.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/text.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/utils.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt.egg-info/SOURCES.txt +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt.egg-info/dependency_links.txt +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt.egg-info/entry_points.txt +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt.egg-info/requires.txt +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt.egg-info/top_level.txt +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/setup.cfg +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/tests/test_scripts.py +0 -0
- {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/tests/test_tasks.py +0 -0
|
@@ -150,7 +150,7 @@ collect_ignore = ['pyproject.toml']
|
|
|
150
150
|
exclude_lines = ['NotImplementedError()']
|
|
151
151
|
|
|
152
152
|
[tool.bumpversion]
|
|
153
|
-
current_version = "1.21.
|
|
153
|
+
current_version = "1.21.2.dev0"
|
|
154
154
|
parse = '(?P<major>\d+)\.(?P<minor>\d+)\.(?P<patch>\d+)(\.(?P<release>[a-z]+)(?P<candidate>\d+))?'
|
|
155
155
|
serialize = [
|
|
156
156
|
'{major}.{minor}.{patch}.{release}{candidate}',
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import logging
|
|
4
4
|
import warnings
|
|
5
|
+
from itertools import count
|
|
5
6
|
|
|
6
7
|
import numpy as np
|
|
7
8
|
import pandas as pd
|
|
@@ -132,6 +133,25 @@ class RegexGenerator(BaseTransformer):
|
|
|
132
133
|
state.pop('generator')
|
|
133
134
|
return state
|
|
134
135
|
|
|
136
|
+
def _create_numerical_fallback_generator(self):
|
|
137
|
+
"""Create fallback generator."""
|
|
138
|
+
regex_generator, _ = strings_from_regex(self.regex_format)
|
|
139
|
+
last_template = ''
|
|
140
|
+
for _ in range(self.generated):
|
|
141
|
+
last_template = next(regex_generator)
|
|
142
|
+
|
|
143
|
+
try:
|
|
144
|
+
# count is like range, but generates infinite values
|
|
145
|
+
for value in count(int(last_template) + 1):
|
|
146
|
+
yield str(value)
|
|
147
|
+
|
|
148
|
+
except ValueError:
|
|
149
|
+
# Generate values like A(0), B(0), A(1), B(1), etc
|
|
150
|
+
for counter in count():
|
|
151
|
+
regex_generator, _ = strings_from_regex(self.regex_format)
|
|
152
|
+
for value in regex_generator:
|
|
153
|
+
yield f'{value}({counter})'
|
|
154
|
+
|
|
135
155
|
def __setstate__(self, state):
|
|
136
156
|
"""Set the generator when pickling."""
|
|
137
157
|
generator_size = state.get('generator_size')
|
|
@@ -141,13 +161,18 @@ class RegexGenerator(BaseTransformer):
|
|
|
141
161
|
state['generator_size'] = size
|
|
142
162
|
if generated is None:
|
|
143
163
|
state['generated'] = 0
|
|
144
|
-
|
|
145
|
-
|
|
164
|
+
if '_num_fallback_samples_generated' not in state:
|
|
165
|
+
state['_num_fallback_samples_generated'] = 0
|
|
166
|
+
if generated and not state['_num_fallback_samples_generated']:
|
|
146
167
|
for _ in range(generated):
|
|
147
168
|
next(generator)
|
|
148
169
|
|
|
149
170
|
state['generator'] = generator
|
|
150
171
|
self.__dict__ = state
|
|
172
|
+
if self._num_fallback_samples_generated:
|
|
173
|
+
self.generator = self._create_numerical_fallback_generator()
|
|
174
|
+
for _ in range(self._num_fallback_samples_generated):
|
|
175
|
+
next(self.generator)
|
|
151
176
|
|
|
152
177
|
def __init__(
|
|
153
178
|
self,
|
|
@@ -180,12 +205,14 @@ class RegexGenerator(BaseTransformer):
|
|
|
180
205
|
# Used otherwise
|
|
181
206
|
self.generator_size = None
|
|
182
207
|
self.generated = None
|
|
208
|
+
self._num_fallback_samples_generated = 0
|
|
183
209
|
|
|
184
210
|
def reset_randomization(self):
|
|
185
211
|
"""Create a new generator and reset the generated values counter."""
|
|
186
212
|
super().reset_randomization()
|
|
187
213
|
self.generator, self.generator_size = strings_from_regex(self.regex_format)
|
|
188
214
|
self.generated = 0
|
|
215
|
+
self._num_fallback_samples_generated = 0
|
|
189
216
|
|
|
190
217
|
if hasattr(self, 'cardinality_rule') and self.cardinality_rule == 'scale':
|
|
191
218
|
self._remaining_samples['repetitions'] = 0
|
|
@@ -193,6 +220,17 @@ class RegexGenerator(BaseTransformer):
|
|
|
193
220
|
|
|
194
221
|
def _sample_fallback(self, num_samples, template_samples):
|
|
195
222
|
"""Sample num_samples values such that they are all unique, disregarding the regex."""
|
|
223
|
+
unique_condition = (
|
|
224
|
+
self.cardinality_rule == 'unique'
|
|
225
|
+
if hasattr(self, 'cardinality_rule')
|
|
226
|
+
else self.enforce_uniqueness
|
|
227
|
+
)
|
|
228
|
+
if unique_condition:
|
|
229
|
+
if not self._num_fallback_samples_generated:
|
|
230
|
+
self.generator = self._create_numerical_fallback_generator()
|
|
231
|
+
|
|
232
|
+
return [next(self.generator) for _ in range(num_samples)]
|
|
233
|
+
|
|
196
234
|
try:
|
|
197
235
|
# Integer-based fallback: attempt to convert the last template sample to an integer
|
|
198
236
|
# and then generate values in a sequential manner.
|
|
@@ -247,6 +285,9 @@ class RegexGenerator(BaseTransformer):
|
|
|
247
285
|
match_cardinality (bool):
|
|
248
286
|
Whether or not to match the cardinality of the data.
|
|
249
287
|
"""
|
|
288
|
+
if unique_condition and self._num_fallback_samples_generated:
|
|
289
|
+
return
|
|
290
|
+
|
|
250
291
|
warned = False
|
|
251
292
|
warn_msg = (
|
|
252
293
|
f"The regex for '{self.get_input_column()}' can only generate "
|
|
@@ -389,16 +430,27 @@ class RegexGenerator(BaseTransformer):
|
|
|
389
430
|
if self.cardinality_rule == 'scale':
|
|
390
431
|
return self._sample_scale(num_samples)
|
|
391
432
|
|
|
392
|
-
|
|
393
|
-
|
|
433
|
+
if unique_condition and self._num_fallback_samples_generated:
|
|
434
|
+
samples = self._sample_fallback(num_samples, [])
|
|
435
|
+
self._num_fallback_samples_generated += len(samples)
|
|
436
|
+
return samples
|
|
437
|
+
|
|
438
|
+
# If there aren't enough values left in the generator, reset it if cardinality_rule!=unique
|
|
439
|
+
remaining = max(self.generator_size - self.generated, 0)
|
|
440
|
+
if num_samples > remaining and not unique_condition:
|
|
394
441
|
self.reset_randomization()
|
|
395
442
|
|
|
396
443
|
samples = self._sample_from_generator(num_samples)
|
|
444
|
+
|
|
445
|
+
# Need more samples than the generator can produce
|
|
397
446
|
if num_samples > len(samples):
|
|
398
447
|
if unique_condition:
|
|
399
|
-
|
|
448
|
+
fallback_size = num_samples - len(samples)
|
|
449
|
+
new_samples = self._sample_fallback(fallback_size, samples)
|
|
450
|
+
self._num_fallback_samples_generated += len(new_samples)
|
|
400
451
|
else:
|
|
401
452
|
new_samples = self._sample_from_template(num_samples - len(samples), samples)
|
|
453
|
+
|
|
402
454
|
samples.extend(new_samples)
|
|
403
455
|
|
|
404
456
|
return samples
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|