Automotivo e trabalho com dados

Verifique primeiro o eixo de tempo e as unidades de um CSV de teste

Verifique unidades, valores ausentes, números finitos e timestamps duplicados ou invertidos em dados sintéticos de demonstração e depois salve os resultados da verificação e um gráfico.

Ver o sumário

A tradução foi feita com IA. Confira o código, as unidades e os valores junto com o original. A revisão por falantes nativos de cada idioma ainda não foi concluída. English

Para quem éEngenheiros e iniciantes lendo pela primeira vez um CSV de teste de veículo com Python

Preparação
  • Tenha Python 3.12 e um terminal prontos. Verifique a versão com python --version.
  • Extraia todo o ZIP baixado e abra um terminal na pasta que contém example.py.
  • Comece com os dados de prática incluídos e depois compare os resultados com os arquivos originais.
  • O synthetic_test.csv incluído é um conjunto de dados sintéticos de demonstração. Ele usa s para tempo e km/h para velocidade.

01Quatro coisas para verificar antes de criar o gráfico

Primeiro verifique file structure, numbers, units e time order dos synthetic demonstration data. Conseguir ler os values não significa que as units estão corretas nem que os times estão certos. Este exemplo verifica se s e km/h estão declarados em cada input row e se time aumenta na original row order.

02Leia o CSV de entrada

ColumnValores incluídos e significado
dataset_noteSynthetic demonstration data
timeElapsed time de 0.0 a 1.0
time_units
speedSpeed values de 0 a 22
speed_unitkm/h

Não anexe unit strings às numeric cells. Registre as units em uma column separada. time não pode ser negative e são necessários pelo menos dois samples. Este code não define um physically normal range para speed.

03Prepare os arquivos e execute o exemplo

  1. Extraia o ZIP e verifique se o input file listado em README.txt está na mesma pasta que example.py. Não execute o exemplo de dentro do arquivo ZIP.
  2. Execute os commands abaixo, uma linha por vez, na pasta que contém example.py. No Windows, se python não estiver disponível, mas py estiver, substitua python em cada command por py -3.12.
  3. Depois que a completion message aparecer, abra a nova pasta outputs. Se outputs já existir, primeiro renomeie-a para manter os previous results e depois execute o exemplo novamente.
bash
python --version
python -m pip install -r requirements.txt
python example.py

A installation exige internet connection. BASE no code define os input e output paths em relação a example.py, e não à current terminal folder.

04Código completo e condições de parada

Ao ler cada row do CSV, ele verifica missing values e units. math.isfinite rejeita NaN e infinity. Se o current time for menor ou igual ao previous time, ele para, portanto não esconde problemas por meio de sorting nem exclui arbitrariamente duplicate samples. outputs é criado somente depois que o input check termina.

example.py
"""Check time order and declared units in explanatory synthetic test data.

This demonstrates file checks only. It makes no vehicle safety assessment.
"""
import csv
import json
import math
from pathlib import Path

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt

BASE = Path(__file__).resolve().parent
HEADERS = ["dataset_note", "time", "time_unit", "speed", "speed_unit"]
NOTE = "설명용 합성 데이터"


def read_samples():
    samples = []
    with (BASE / "synthetic_test.csv").open(encoding="utf-8-sig", newline="") as file:
        reader = csv.DictReader(file)
        if reader.fieldnames != HEADERS:
            raise ValueError(f"Expected headers: {HEADERS}")
        for line, row in enumerate(reader, start=2):
            if None in row or any(value is None or not value.strip() for value in row.values()):
                raise ValueError(f"Row {line}: missing or extra field.")
            if row["dataset_note"] != NOTE:
                raise ValueError(f"Row {line}: explanatory synthetic-data label is required.")
            if row["time_unit"] != "s" or row["speed_unit"] != "km/h":
                raise ValueError(f"Row {line}: expected units s and km/h; no automatic conversion.")
            time, speed = float(row["time"]), float(row["speed"])
            if not math.isfinite(time) or not math.isfinite(speed):
                raise ValueError(f"Row {line}: NaN and infinite values are not supported.")
            if time < 0:
                raise ValueError(f"Row {line}: elapsed time must be nonnegative.")
            if samples and time <= samples[-1][0]:
                raise ValueError(f"Row {line}: duplicate or decreasing time; check the source.")
            samples.append((time, speed))
    if len(samples) < 2:
        raise ValueError("At least two samples are required.")
    return samples


def main():
    destination = BASE / "outputs"
    if destination.exists():
        raise ValueError("outputs already exists; rename it before running again.")
    samples = read_samples()
    times, speeds = zip(*samples)
    intervals = [right - left for left, right in zip(times, times[1:])]
    report = {
        "dataset_note": NOTE,
        "scope": "File structure and numeric checks only; no vehicle safety assessment.",
        "sample_count": len(samples), "time_unit": "s", "speed_unit": "km/h",
        "start_time": times[0], "end_time": times[-1],
        "min_interval_s": min(intervals), "max_interval_s": max(intervals),
        "min_speed_kmh": min(speeds), "max_speed_kmh": max(speeds),
        "time_strictly_increasing": True,
    }
    figure, axis = plt.subplots(figsize=(8, 4.6), layout="constrained")
    axis.plot(times, speeds, "o-", color="#2B6578", linewidth=2)
    axis.set(title="Speed trace | Explanatory synthetic data", xlabel="Elapsed time (s)", ylabel="Speed (km/h)")
    axis.spines[["top", "right"]].set_visible(False)
    axis.grid(alpha=0.2)
    destination.mkdir(exist_ok=False)
    with (destination / "data_check.json").open("x", encoding="utf-8") as file:
        json.dump(report, file, ensure_ascii=False, indent=2)
    figure.savefig(destination / "synthetic_speed.png", dpi=160)
    plt.close(figure)
    print(f"Explanatory synthetic data: {len(samples)} samples, {times[0]:g}-{times[-1]:g} s.")
    print(f"Sample interval: {min(intervals):g}-{max(intervals):g} s; units: s, km/h.")
    print("Created outputs/data_check.json and outputs/synthetic_speed.png.")


if __name__ == "__main__":
    try:
        main()
    except (OSError, ValueError, csv.Error) as error:
        raise SystemExit(f"Stopped: {error}") from error

05Verifique os resultados e o gráfico

outputs/data_check.json registra units, number of samples, time range e os minimum e maximum sampling interval. outputs/synthetic_speed.png é um chart dos mesmos synthetic demonstration data.

ItemResultados dos dados sintéticos de demonstração incluídos
Samples6
Time range0.0~1.0 s
Sampling intervalAbout 0.2 s
Speed minimum / maximum0 / 22 km/h
Time increasingtrue
Speed curve of synthetic demonstration data. Time 0–1 s, speed 0–22 km/h.
Speed curve of synthetic demonstration data. Time 0–1 s, speed 0–22 km/h.

Por causa de floating-point representation, o sampling interval no JSON pode aparecer como 0.19999999999999996. Isso não é um número que reivindica precision adicional dos input values ou da measurement resolution.

06Insira erros você mesmo para testar

  1. Verifique se sample_count no normal result é 6 e time_unit é s.
  2. Em uma practice folder recém-extraída, altere time da terceira data row para ser igual ao previous value, 0.2. Ao executar, deve parar com a mensagem duplicate or decreasing time.
  3. Em outra fresh copy, altere um speed_unit para m/s. Verifique se a expected units message aparece e outputs não é criado.
  4. Mantenha o original input file e faça error experiments apenas em copies.

07O que observar quando a verificação para

MessageO que verificar no original
expected units s and km/hVerifique se os export settings correspondem às units em cada row. O code não converte automaticamente.
duplicate or decreasing timeVerifique se o time order mudou durante um restart, duplicate samples ou file merging.
NaN and infinite valuesVerifique o original quanto a missing samples ou calculation errors.
synthetic-data label is requiredMantenha a label que marca os dados como synthetic demonstration data somente para este tutorial.
missing or extra fieldVerifique o número de commas, blank cells e column names.

08O que ainda precisa ser verificado depois que a checagem passa

  • Ele não impõe uma rule de que o time interval deve ser constante. Se min_interval_s e max_interval_s diferirem, verifique separadamente o sampling period do original.
  • Ele não realiza filtering, interpolation, unit conversion, sensor calibration, time synchronization ou noise judgments.
  • Ele verifica apenas a notation nas unit columns. Não consegue confirmar se os actual values foram realmente medidos nessa unit nem se o sensor está no channel correto.
  • Esta é uma prática de file handling limitada aos data incluídos. Não a interprete como uma validation tool que possa ser usada em real vehicle test procedures ou safety judgments.

Registro de execução e verificação

Windows 11 (10.0.26200), CPython 3.12.14 (64-bit). openpyxl 3.1.5, Matplotlib 3.10.8. As libraries usadas por cada exemplo estão fixadas em requirements.txt.

  • Foram verificados 6 samples de synthetic demonstration data, time range, units e intervals
  • Foram verificados errors de unit mismatch, duplicate or reversed times, NaN e missing values
  • Foi verificado que o original hash permanece inalterado, existing results são recusados e o PNG é criado
Limites da verificação
  • Apenas synthetic demonstration data foram verificados. Real measurement data e vehicle safety não foram avaliados.

Princípios de redação e verificação de todo o site

Arquivos de exemplo para executar

Inclui código, dados de entrada e instruções de execução. Extraia o ZIP e leia primeiro o README.txt.

Baixar ZIP de exemplo

O código de exemplo, os nomes de arquivos e as chaves de entrada são mantidos como no original. Consulte também os comandos e os procedimentos de conferência do texto traduzido.

Material de prática original · Guarde os arquivos originais separadamente antes de executar.

Fontes de referência

As explicações e os exemplos são de elaboração própria. Os comportamentos e conceitos relacionados podem ser consultados nas fontes oficiais abaixo.