Create a floating-point column specification for use in a schema.
float_field(
min_val=None,
max_val=None,
allowed=None,
precision=None,
nullable=False,
null_probability=0.0,
unique=False,
generator=None,
dtype="Float64",
)
The float_field() function defines the constraints and behavior for a floating-point column when generating synthetic data with generate_dataset(). You can control the range of values with min_val= and max_val=, restrict values to a specific set with allowed=, enforce uniqueness with unique=True, and introduce null values with nullable=True and null_probability=. The dtype= parameter sets the float type in the schema ("Float32" or "Float64").
When both min_val= and max_val= are provided, values are drawn from a uniform distribution across that range. If neither is specified, values are drawn uniformly from a large default range. If allowed= is provided, values are sampled from that specific list.
Parameters
min_val: float | None = None
-
Minimum value (inclusive). Default is None (no minimum).
max_val: float | None = None
-
Maximum value (inclusive). Default is None (no maximum).
allowed: list[float] | None = None
-
List of allowed values (categorical constraint). When provided, values are sampled from this list. Cannot be combined with min_val=/max_val=.
precision: int | None = None
-
Number of decimal places to round generated values to. Default is None (no rounding). Must be a non-negative integer. Has no effect when allowed= or generator= is used.
nullable: bool = False
-
Whether the column can contain null values. Default is False.
null_probability: float = 0.0
-
Probability of generating a null value for each row when nullable=True. Must be between 0.0 and 1.0. Default is 0.0.
unique: bool = False
-
Whether all values must be unique. Default is False. When True, the generator will retry until it produces n distinct values.
generator: Callable[[], Any] | None = None
-
Custom callable that generates values. When provided, it’s used instead of min_val=, max_val=, allowed= and precision=, while unique= and nullable= still apply. The callable should take no arguments and return a single float value. It isn’t controlled by the seed= of generate_dataset(), so it needs its own seeded random number generator for reproducible data.
dtype: str = "Float64"
-
Float dtype. Default is
"Float64". Options: "Float32", "Float64". It’s the dtype of the column that generate_dataset() creates.
Returns
FloatField
-
A float field specification that can be passed to Schema().
Raises
ValueError
-
If
min_val is greater than max_val, if allowed is an empty list, if null_probability is not between 0.0 and 1.0, if precision is negative, or if dtype is not a valid float type.
Examples
The min_val= and max_val= parameters define the generated value ranges:
import pointblank as pb
schema = pb.Schema(
price=pb.float_field(min_val=0.01, max_val=9999.99),
probability=pb.float_field(min_val=0.0, max_val=1.0),
temperature=pb.float_field(min_val=-40.0, max_val=50.0),
)
pb.preview(pb.generate_dataset(schema, n=100, seed=23))
|
|
|
|
|
| 1 |
5938.004549741373 |
0.8799156974355079 |
-5.157722860993047 |
| 2 |
7605.283132107856 |
0.14435757239986746 |
31.296623312850457 |
| 3 |
1728.6007069298096 |
0.7470355821054965 |
39.77800136715432 |
| 4 |
8941.257026606254 |
0.7226387800366582 |
-12.968123980080339 |
| 5 |
6057.495421314872 |
0.017779160149829498 |
-2.867472818974349 |
| 96 |
8056.4659030644625 |
0.6697716258081057 |
-23.090891067448077 |
| 97 |
363.53767483767353 |
0.8729074363705923 |
25.794353646053793 |
| 98 |
8536.596555606327 |
0.10074496550443779 |
5.683426744810603 |
| 99 |
375.10627637757153 |
0.0802829629623063 |
42.06519501931237 |
| 100 |
3828.1379737802536 |
0.825305531548672 |
16.95315561462961 |
It’s also possible to restrict values to a discrete set with allowed=, which is useful for fixed pricing tiers or measurement levels:
schema = pb.Schema(
discount=pb.float_field(allowed=[0.05, 0.10, 0.15, 0.20, 0.25]),
weight_kg=pb.float_field(min_val=0.5, max_val=100.0),
)
pb.preview(pb.generate_dataset(schema, n=50, seed=23))
|
|
|
|
| 1 |
0.25 |
73.22386971863972 |
| 2 |
0.25 |
78.89100603758705 |
| 3 |
0.15 |
66.18540144593624 |
| 4 |
0.2 |
85.28332950401631 |
| 5 |
0.1 |
9.437798842836877 |
| 46 |
0.25 |
54.94434699269292 |
| 47 |
0.05 |
84.30281543783005 |
| 48 |
0.25 |
83.05195258036858 |
| 49 |
0.15 |
5.997813792849301 |
| 50 |
0.1 |
76.69053821491201 |
We can simulate missing measurements by introducing null values:
schema = pb.Schema(
reading=pb.float_field(
min_val=0.0, max_val=500.0,
nullable=True, null_probability=0.2,
),
calibration=pb.float_field(min_val=0.9, max_val=1.1),
)
pb.preview(pb.generate_dataset(schema, n=30, seed=23))
|
|
|
|
| 1 |
42.7404746224444 |
0.9839786717043394 |
| 2 |
143.7033480997308 |
1.0137963699650125 |
| 3 |
141.68548764039124 |
0.9571151553193716 |
| 4 |
320.87527875793967 |
0.9443715373140421 |
| 5 |
51.2887560208391 |
0.9744119101525103 |
| 26 |
None |
0.9649956220992375 |
| 27 |
122.9112380710341 |
1.0448877279482989 |
| 28 |
178.03479442978855 |
1.0261184992342618 |
| 29 |
118.05390826822676 |
1.0785441477257058 |
| 30 |
None |
0.937538519570002 |
Use precision= to round generated values to a fixed number of decimal places. This is useful for prices, scores, or any measurement where full floating-point precision is unwanted:
schema = pb.Schema(
price=pb.float_field(min_val=1.0, max_val=200.0, precision=2),
score=pb.float_field(min_val=0.0, max_val=100.0, precision=1),
probability=pb.float_field(min_val=0.0, max_val=1.0, precision=4),
)
pb.preview(pb.generate_dataset(schema, n=20, seed=23))
|
|
|
|
|
| 1 |
119.17 |
62.3 |
0.8799 |
| 2 |
152.35 |
27.7 |
0.1444 |
| 3 |
35.4 |
55.9 |
0.747 |
| 4 |
178.93 |
48.4 |
0.7226 |
| 5 |
121.54 |
45.2 |
0.0178 |
| 16 |
1.49 |
95.3 |
0.3973 |
| 17 |
190.14 |
92.6 |
0.4119 |
| 18 |
59.56 |
2.7 |
0.3355 |
| 19 |
169.02 |
45.2 |
0.9446 |
| 20 |
195.32 |
86.9 |
0.5298 |
A custom generator= provides full control over value generation, such as values from a distribution other than the uniform one:
import random, math
rng = random.Random(0)
schema = pb.Schema(
sensor_value=pb.float_field(min_val=-10.0, max_val=10.0),
log_value=pb.float_field(generator=lambda: math.log(rng.uniform(1, 1000))),
)
pb.preview(pb.generate_dataset(schema, n=20, seed=23))
|
|
|
|
| 1 |
-0.08615076131600574 |
6.738836419047254 |
| 2 |
-2.9847483771133065 |
6.630942519000257 |
| 3 |
2.8777641630224373 |
6.042991461173114 |
| 4 |
5.0084456481351936 |
5.559364739458459 |
| 5 |
3.4974316227831608 |
6.237862500009073 |
| 16 |
4.957328889320658 |
5.526471683068103 |
| 17 |
2.146448046995115 |
6.813264923713322 |
| 18 |
-2.9744841993093996 |
6.890408378292458 |
| 19 |
2.3890556663818057 |
6.697536613756536 |
| 20 |
8.41986500151721 |
6.804906921310479 |
The log_value column holds the logarithm of a uniform value between 1 and 1000, so its values lie between 0 and about 6.9 and are bunched toward the top of that range. The generator has its own seeded random.Random(0), since the seed= of generate_dataset() doesn’t reach it.