Skip to content

models

formatting.models ¤

Classes¤

Classification ¤

Bases: PermissionsBase

Contains instructions on how to classify the data into a specific variable.

In particular, it links a format to a variable, and provides the column indices for the value, maximum, and minimum columns, as well as the validator columns. It also contains information on whether the data is accumulated, incremental, and the resolution of the data.

Attributes:

Name Type Description
cls_id AutoField

Primary key.

format ForeignKey

The format of the data file.

variable ForeignKey

The variable to which the data belongs.

value PositiveSmallIntegerField

Index of the value column, starting in 0.

maximum PositiveSmallIntegerField

Index of the maximum value column, starting in 0.

minimum PositiveSmallIntegerField

Index of the minimum value column, starting in 0.

value_validator_column PositiveSmallIntegerField

Index of the value validator column, starting in 0.

value_validator_text CharField

Value validator text.

maximum_validator_column PositiveSmallIntegerField

Index of the maximum value validator column, starting in 0.

maximum_validator_text CharField

Maximum value validator text.

minimum_validator_column PositiveSmallIntegerField

Index of the minimum value validator column, starting in 0.

minimum_validator_text CharField

Minimum value validator text.

accumulate PositiveSmallIntegerField

If set to a number of minutes, the data will be accumulated over that period.

resolution DecimalField

Resolution of the data. Only used if it is to be accumulated.

incremental BooleanField

Whether the data is an incremental counter. If it is, any value below the previous one will be removed.

decimal_comma BooleanField

Whether the data uses a comma as a decimal separator.

Functions¤
__str__() ¤

Return the string representation of the object.

Source code in formatting/models.py
415
416
417
def __str__(self) -> str:
    """Return the string representation of the object."""
    return str(self.cls_id)
clean() ¤

Validate the model instance.

It checks that the column indices are different, and that the accumulation period is greater than zero if it is set. It also checks that the resolution is set if the data is accumulated.

Source code in formatting/models.py
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
def clean(self) -> None:
    """Validate the model instance.

    It checks that the column indices are different, and that the accumulation
    period is greater than zero if it is set. It also checks that the resolution is
    set if the data is accumulated.
    """
    if self.accumulate and self.resolution is None:
        raise ValidationError(
            {
                "resolution": "The resolution must be set if the data is "
                "accumulated."
            }
        )

    col_names = [
        "value",
        "maximum",
        "minimum",
        "value_validator_column",
        "maximum_validator_column",
        "minimum_validator_column",
    ]
    unique = defaultdict(list)
    for name in col_names:
        if getattr(self, name) is not None:
            unique[getattr(self, name)].append(name)
    for _, names in unique.items():
        if len(names) != 1:
            msg = "The columns must be different."
            raise ValidationError({field: msg for field in names})
get_absolute_url() ¤

Get the absolute URL of the object.

Source code in formatting/models.py
419
420
421
def get_absolute_url(self) -> str:
    """Get the absolute URL of the object."""
    return reverse("format:classification_detail", kwargs={"pk": self.pk})

Date ¤

Bases: PermissionsBase

Date format.

Format string for the date column. It is used to parse the date column in the data file. The format string must be compatible with the datetime module in Python. See the datetime documentation for more information on valid format codes.

Attributes:

Name Type Description
date_id AutoField

Primary key.

date_format CharField

The format string for the date column in human readable form, eg. DD-MM-YYYY.

code CharField

The code used to parse the date column, eg. %d-%m-%Y.

Functions¤
__str__() ¤

Return the string representation of the object.

Source code in formatting/models.py
115
116
117
def __str__(self) -> str:
    """Return the string representation of the object."""
    return str(self.date_format)
get_absolute_url() ¤

Get the absolute URL of the object.

Source code in formatting/models.py
119
120
121
def get_absolute_url(self) -> str:
    """Get the absolute URL of the object."""
    return reverse("format:date_detail", kwargs={"pk": self.pk})

Delimiter ¤

Bases: PermissionsBase

Delimiter between columns in the data file.

One or more characters that separate columns in a text file. The most common values are ,, ;, and \t (tab).

Attributes:

Name Type Description
delimiter_id AutoField

Primary key.

name CharField

The name of the delimiter. eg. comma, semicolon, tab.

character CharField

The character used as a delimiter. eg. ,, ;, \t.

Functions¤
__str__() ¤

Return the string representation of the object.

Source code in formatting/models.py
78
79
80
def __str__(self) -> str:
    """Return the string representation of the object."""
    return str(self.name)
get_absolute_url() ¤

Get the absolute URL of the object.

Source code in formatting/models.py
82
83
84
def get_absolute_url(self) -> str:
    """Get the absolute URL of the object."""
    return reverse("format:delimiter_index")

Extension ¤

Bases: PermissionsBase

Extension of the data file.

It is mostly used to choose the tool to be employed to ingest the data. While it can take any value, there is currently explicit support only for xlsx and xlx. Anything else will be interpreted as a text file and loaded using pandas.read_csv.

Attributes:

Name Type Description
extension_id AutoField

Primary key.

value CharField

The extension value. eg. xlsx, xlx, txt.

Functions¤
__str__() ¤

Return the string representation of the object.

Source code in formatting/models.py
44
45
46
def __str__(self) -> str:
    """Return the string representation of the object."""
    return str(self.value)
get_absolute_url() ¤

Get the absolute URL of the object.

Source code in formatting/models.py
48
49
50
def get_absolute_url(self) -> str:
    """Get the absolute URL of the object."""
    return reverse("format:extension_index")

Format ¤

Bases: PermissionsBase

Details of the data file format, describing how to read the file.

It combines several properties, such as the file extension, the delimiter, the date and time formats, and the column indices for the date and time columns, instructing how to read the data file and parse the dates. It is mostly used to ingest data from text files, like CSV.

Attributes:

Name Type Description
format_id AutoField

Primary key.

name CharField

Short name of the format entry.

description TextField

Description of the format.

extension ForeignKey

The extension of the data file.

delimiter ForeignKey

The delimiter between columns in the data file. Only required for text files.

first_row PositiveSmallIntegerField

Index of the first row with data, starting in 0.

footer_rows PositiveSmallIntegerField

Number of footer rows to be ignored at the end.

date ForeignKey

Format for the date column. Only required for text files.

date_column PositiveSmallIntegerField

Index of the date column, starting in 0.

time ForeignKey

Format for the time column. Only required for text files.

time_column PositiveSmallIntegerField

Index of the time column, starting in 0.

Attributes¤
datetime_format: str property ¤

Obtain the datetime format string.

Functions¤
__str__() ¤

Return the string representation of the object.

Source code in formatting/models.py
249
250
251
def __str__(self) -> str:
    """Return the string representation of the object."""
    return str(self.name)
datetime_columns(delimiter) ¤

Column indices that correspond to the date and time columns in the dataset.

Parameters:

Name Type Description Default
delimiter str

The delimiter used to split the date and time codes.

required

Returns:

Type Description
list[int]

list[int]: A list of column indices.

Source code in formatting/models.py
262
263
264
265
266
267
268
269
270
271
272
273
274
275
def datetime_columns(self, delimiter: str) -> list[int]:
    """Column indices that correspond to the date and time columns in the dataset.

    Args:
        delimiter (str): The delimiter used to split the date and time codes.

    Returns:
        list[int]: A list of column indices.
    """
    date_items = self.date.code.split(delimiter)
    date_cols = list(range(self.date_column, self.date_column + len(date_items)))
    time_items = self.time.code.split(delimiter)
    time_cols = list(range(self.time_column, self.time_column + len(time_items)))
    return date_cols + time_cols
get_absolute_url() ¤

Get the absolute URL of the object.

Source code in formatting/models.py
253
254
255
def get_absolute_url(self) -> str:
    """Get the absolute URL of the object."""
    return reverse("format:format_detail", kwargs={"pk": self.pk})

Time ¤

Bases: PermissionsBase

Time format.

Format string for the time column. It is used to parse the time column in the data file. The format string must be compatible with the datetime module in Python. See the datetime documentation for more information on valid format codes.

Attributes:

Name Type Description
date_id AutoField

Primary key.

date_format CharField

The format string for the date column in human readable form, eg. HH:MM:SS 24H.

code CharField

The code used to parse the date column, eg. %H:%M:%S.

Functions¤
__str__() ¤

Return the string representation of the object.

Source code in formatting/models.py
151
152
153
def __str__(self) -> str:
    """Return the string representation of the object."""
    return str(self.time_format)
get_absolute_url() ¤

Get the absolute URL of the object.

Source code in formatting/models.py
155
156
157
def get_absolute_url(self) -> str:
    """Get the absolute URL of the object."""
    return reverse("format:time_detail", kwargs={"pk": self.pk})

Variable ¤

Bases: PermissionsBase

A variable with a physical meaning.

Such as precipitation, wind speed, wind direction, soil moisture, including the associated unit. It also includes metadata to help identify what is a reasonable value for the data, to flag outliers and to help with the validation process.

The nature of the variable can be one of the following:

  • sum: Cumulative value over a period of time.
  • average: Average value over a period of time.
  • value: One-off value.

Attributes:

Name Type Description
variable_id AutoField

Primary key.

variable_code CharField

Code of the variable, eg. airtemperature.

name CharField

Human-readable name of the variable, eg. Air temperature.

unit ForeignKey

Unit of the variable.

maximum DecimalField

Maximum value allowed for the variable.

minimum DecimalField

Minimum value allowed for the variable.

diff_error DecimalField

If two sequential values in the time-series data of this variable differ by more than this value, the validation process can mark this with an error flag.

outlier_limit DecimalField

The statistical deviation for defining outliers, in times the standard deviation (sigma).

null_limit DecimalField

The max % of null values (missing, caused by e.g. equipment malfunction) allowed for hourly, daily, monthly data. Cumulative values are not deemed trustworthy if the number of missing values in a given period is greater than the null_limit.

nature CharField

Nature of the variable, eg. if it represents a one-off value, the average over a period of time or the cumulative value over a period

Attributes¤
is_cumulative: bool property ¤

Return True if the nature of the variable is sum.

Functions¤
__str__() ¤

Return the string representation of the object.

Source code in variable/models.py
165
166
167
def __str__(self) -> str:
    """Return the string representation of the object."""
    return str(self.name)
clean() ¤

Validate the model fields.

Source code in variable/models.py
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
def clean(self) -> None:
    """Validate the model fields."""
    if self.maximum < self.minimum:
        raise ValidationError(
            {
                "maximum": "The maximum value must be greater than the minimum "
                "value."
            }
        )
    if not self.variable_code.isidentifier():
        raise ValidationError(
            {
                "variable_code": "The variable code must be a valid Python "
                "identifier. Only letters, numbers and underscores are allowed, and"
                " it cannot start with a number."
            }
        )
    return super().clean()
get_absolute_url() ¤

Get the absolute URL of the object.

Source code in variable/models.py
169
170
171
def get_absolute_url(self) -> str:
    """Get the absolute URL of the object."""
    return reverse("variable:variable_detail", kwargs={"pk": self.pk})