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.
Files changed (45) hide show
  1. {rdt-1.21.1.dev0/rdt.egg-info → rdt-1.21.2.dev0}/PKG-INFO +1 -1
  2. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/pyproject.toml +1 -1
  3. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/__init__.py +1 -1
  4. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/id.py +57 -5
  5. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0/rdt.egg-info}/PKG-INFO +1 -1
  6. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/LICENSE +0 -0
  7. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/README.md +0 -0
  8. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/_utils.py +0 -0
  9. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/errors.py +0 -0
  10. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/hyper_transformer.py +0 -0
  11. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/performance/__init__.py +0 -0
  12. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/performance/datasets/__init__.py +0 -0
  13. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/performance/datasets/base.py +0 -0
  14. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/performance/datasets/boolean.py +0 -0
  15. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/performance/datasets/categorical.py +0 -0
  16. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/performance/datasets/datetime.py +0 -0
  17. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/performance/datasets/id.py +0 -0
  18. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/performance/datasets/numerical.py +0 -0
  19. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/performance/datasets/pii.py +0 -0
  20. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/performance/datasets/text.py +0 -0
  21. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/performance/datasets/utils.py +0 -0
  22. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/performance/performance.py +0 -0
  23. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/performance/profiling.py +0 -0
  24. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/__init__.py +0 -0
  25. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/_validators.py +0 -0
  26. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/base.py +0 -0
  27. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/boolean.py +0 -0
  28. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/categorical.py +0 -0
  29. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/datetime.py +0 -0
  30. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/null.py +0 -0
  31. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/numerical.py +0 -0
  32. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/pii/__init__.py +0 -0
  33. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/pii/anonymization.py +0 -0
  34. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/pii/anonymizer.py +0 -0
  35. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/pii/utils.py +0 -0
  36. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/text.py +0 -0
  37. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt/transformers/utils.py +0 -0
  38. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt.egg-info/SOURCES.txt +0 -0
  39. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt.egg-info/dependency_links.txt +0 -0
  40. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt.egg-info/entry_points.txt +0 -0
  41. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt.egg-info/requires.txt +0 -0
  42. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/rdt.egg-info/top_level.txt +0 -0
  43. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/setup.cfg +0 -0
  44. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/tests/test_scripts.py +0 -0
  45. {rdt-1.21.1.dev0 → rdt-1.21.2.dev0}/tests/test_tasks.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rdt
3
- Version: 1.21.1.dev0
3
+ Version: 1.21.2.dev0
4
4
  Summary: Reversible Data Transforms
5
5
  Author-email: "DataCebo, Inc." <info@sdv.dev>
6
6
  License-Expression: BUSL-1.1
@@ -150,7 +150,7 @@ collect_ignore = ['pyproject.toml']
150
150
  exclude_lines = ['NotImplementedError()']
151
151
 
152
152
  [tool.bumpversion]
153
- current_version = "1.21.1.dev0"
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}',
@@ -4,7 +4,7 @@
4
4
 
5
5
  __author__ = 'DataCebo, Inc.'
6
6
  __email__ = 'info@sdv.dev'
7
- __version__ = '1.21.1.dev0'
7
+ __version__ = '1.21.2.dev0'
8
8
 
9
9
 
10
10
  import sys
@@ -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
- if generated:
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
- # If there aren't enough values left in the generator, reset it
393
- if num_samples > self.generator_size - self.generated:
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
- new_samples = self._sample_fallback(num_samples - len(samples), samples)
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: rdt
3
- Version: 1.21.1.dev0
3
+ Version: 1.21.2.dev0
4
4
  Summary: Reversible Data Transforms
5
5
  Author-email: "DataCebo, Inc." <info@sdv.dev>
6
6
  License-Expression: BUSL-1.1
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes