Datasets documentation

Carregar dados TsFile

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v4.8.4).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Carregar dados TsFile

TsFile é um formato de arquivo colunar projetado para dados de séries temporais e usado como a camada de armazenamento nativa do Apache IoTDB. Em comparação com formatos colunares de uso geral, como Parquet, o TsFile é consciente do modelo de dados de séries temporais (timestamps, dispositivos e medições) e mantém um índice de tempo interno que permite a poda por intervalo de tempo sem varrer arquivos inteiros.

Este loader é fornecido como um guia separado porque não segue a convenção tabular usual de uma linha por registro: cada linha de saída corresponde a um device, e os valores por medição são retornados como colunas list<...> do Arrow. O mapeamento é descrito em detalhes abaixo.

Instalação

O carregador depende do pacote Python tsfile:

pip install "tsfile>=2.3.0"

Modelo de dados e layout de saída

O carregador segue o modelo de tabela do TsFile. Cada coluna da tabela é uma das seguintes:

  • TAG — um identificador do tipo string; a tupla de valores de TAG identifica de forma única um device (ou seja, uma única fonte de série temporal).
  • CAMPO — uma medição cujo valor evolui ao longo do tempo.
  • HORA — a coluna de timestamp, nomeada time por padrão.

O loader emite uma linha de dataset por dispositivo. Dentro de uma linha, a coluna time e todas as colunas FIELD são colunas Arrow list<...> contendo a série temporal completa daquele dispositivo, ordenada em ordem crescente de tempo. As colunas TAG aparecem como colunas escalares string.

Concretamente, o esquema de saída tem a forma:

<tag_1>:    string
<tag_2>:    string                       # one column per TAG
...
time:       list<timestamp[unit, tz]>
<field_1>:  list<original_type>          # one column per FIELD
<field_2>:  list<original_type>
...

Quando o mesmo dispositivo aparece em vários arquivos de entrada de uma divisão, seus blocos por arquivo são concatenados e ordenados por timestamp antes de serem emitidos como uma única linha. Timestamps duplicados para o mesmo dispositivo geram ValueError.

Uso básico

Carregue um único TsFile:

>>> from datasets import load_dataset
>>> dataset = load_dataset("tsfile", data_files="my_data.tsfile")

Mapeie arquivos para splits explicitamente:

>>> dataset = load_dataset(
...     "tsfile",
...     data_files={"train": "train_data.tsfile", "test": "test_data.tsfile"},
... )

Conjunto de dados de exemplo no Hub

Um exemplo pronto para uso está disponível em tsfile/lotsa_data. Como os arquivos .tsfile são reconhecidos automaticamente, você pode carregá-lo pelo id do repositório sem especificar data_files:

>>> from datasets import load_dataset
>>> dataset = load_dataset("tsfile/lotsa_data")
>>> dataset
DatasetDict({
    train: Dataset({
        features: ['timeseries_id', 'time', 'value'],
        num_rows: 91
    })
})

Cada linha é um dispositivo. A coluna TAG timeseries_id identifica o dispositivo, enquanto time e value são colunas list<...> que contêm a série completa daquele dispositivo:

>>> row = dataset["train"][0]
>>> row["timeseries_id"]
'Bear_assembly_Angel'
>>> len(row["time"]), len(row["value"])
(8760, 8760)
>>> row["time"][:3]
[datetime.datetime(2017, 1, 1, 0, 0), datetime.datetime(2017, 1, 1, 1, 0), datetime.datetime(2017, 1, 1, 2, 0)]

Selecionando uma tabela

Um arquivo TsFile pode conter várias tabelas. Quando table_name é omitido, a primeira tabela encontrada no primeiro arquivo válido é utilizada. As buscas não diferenciam maiúsculas de minúsculas.

>>> dataset = load_dataset("tsfile", data_files="my_data.tsfile", table_name="sensor_data")

Selecionando colunas

columns restringe as colunas FIELD que são lidas. As colunas TAG e a coluna time são sempre retornadas, pois identificam o dispositivo e sua linha do tempo. Nomes em columns que se referem a uma TAG ou à coluna time são ignorados silenciosamente (eles são emitidos como de costume, apenas uma vez); nomes que correspondem a um campo ausente em todos os arquivos tornam-se colunas de lista com todos os valores nulos.

>>> dataset = load_dataset(
...     "tsfile",
...     data_files="my_data.tsfile",
...     columns=["temperature", "humidity"],
... )

Filtrando por intervalo de tempo

start_time e end_time são limites inclusivos; qualquer um deles pode ser omitido. Os limites são propagados para o índice de tempo interno do TsFile, de modo que apenas os blocos de dados correspondentes são lidos do disco. Ambos os limites aceitam qualquer um dos seguintes:

  • int — epoch bruto em timestamp_unit (padrão: milissegundos);
  • datetime.datetime — valores sem fuso horário são interpretados como UTC, valores com fuso horário são convertidos para UTC;
  • datetime.date;
  • ISO-8601 str, por exemplo, "2024-01-01T00:00:00";
  • pyarrow.TimestampScalar.
>>> from datetime import datetime
>>> dataset = load_dataset(
...     "tsfile",
...     data_files="my_data.tsfile",
...     start_time=datetime(2023, 11, 14),
...     end_time="2023-11-15T00:00:00",
... )

Evolução de esquema entre arquivos

Quando diferentes arquivos expõem colunas diferentes — por exemplo, um novo campo de sensor é introduzido posteriormente — o loader assume a união de todas as colunas FIELD e preenche os valores ausentes com nulos. Os tipos numéricos FIELD são promovidos seguindo as regras de alargamento do IoTDB (INT32 → INT64 → DOUBLE, INT32 → FLOAT → DOUBLE).

>>> dataset = load_dataset("tsfile", data_files=["day1.tsfile", "day2.tsfile"])

Tratando arquivos ilegíveis

Por padrão, uma entrada ilegível ou não-TsFile gera um erro. Defina on_bad_files como "warn" para registrar e continuar, ou "skip" para descartar o arquivo silenciosamente.

>>> dataset = load_dataset("tsfile", data_files="data/*.tsfile", on_bad_files="skip")

Unidade de timestamp e fuso horário

timestamp_unit (padrão "ms", compatível com IoTDB) controla a resolução da coluna time e a interpretação dos limites de tempo inteiros. timestamp_tz associa um fuso horário ao tipo de timestamp do Arrow; None (o padrão) resulta em um tipo sem fuso horário.

>>> dataset = load_dataset(
...     "tsfile",
...     data_files="my_data.tsfile",
...     timestamp_unit="us",
...     timestamp_tz="UTC",
... )

Memória e lotes

Dois parâmetros controlam o uso de memória:

  • input_batch_size (padrão 65_536) — número máximo de linhas obtidas por lote Arrow de TsFileReader.query_table. Limita a memória de pico durante o streaming de um único dispositivo.
  • output_batch_size (padrão 32) — número de dispositivos agrupados em cada lote de registros Arrow enviado ao escritor. Valores menores resultam em relatórios de progresso mais responsivos; valores maiores reduzem a sobrecarga por lote.
>>> dataset = load_dataset(
...     "tsfile",
...     data_files="large_data.tsfile",
...     input_batch_size=32_768,
...     output_batch_size=128,
... )

A memória de pico é limitada pela carga útil de um único dispositivo ao longo da divisão, não pelo tamanho da divisão como um todo.

Veja TsFileConfig para a lista completa de parâmetros.

Update on GitHub