---
myst:
html_meta:
description: "Upload a racecar CSV to a vehicle asset, stream live data to it and watch the data arrive in a workbook."
---
# Upload and stream tutorial
{.lead}
Upload a race car's recorded telemetry to a vehicle asset, stream live data to the same asset, and watch it arrive in a workbook.
It uses two complete scripts, run from the terminal.
You need the [installed client](/guides/install.md) and a [profile](/guides/api-keys-setup.md). The scripts take the profile name with `--profile`.
## Upload a CSV to an asset
1. Download the sample data. Nominal ingests the gzipped CSV as it is:
{download}`Download racecar_dataset.csv.gz `
1. Save this script as `fsae_asset_upload.py`. It finds or creates the `FSAE CT8 Vehicle` [asset](/guides/assets.md), uploads the CSV to its dataset and sets the channels' units:
```{literalinclude} /../examples/fsae_asset_upload.py
:language: python
```
1. Run it:
```shell
python fsae_asset_upload.py --profile --file racecar_dataset.csv.gz
```
1. In the [Assets page](https://app.gov.nominal.io/assets), open `FSAE CT8 Vehicle`. The `racecar_dataset` file appears under **Data sources**:
```{video} https://res.cloudinary.com/didkpxvqu/image/upload/v1766096480/Documentation/quickstart/qq2_fast.mp4
:loop:
:alt: The uploaded racecar_dataset file under the asset's Data sources tab
```
## Stream data to the asset
1. Save this script as `stream_data_to_dataset.py`. It streams a sine wave, temperature, CPU use and a `cpu_info` struct to the same dataset until you stop it. See [Stream data](/guides/streaming/overview.md) for how streaming works.
```{literalinclude} /guides/_snippets/code/sdk/python/getting_started/stream_data_to_dataset.py
:language: python
```
1. Run it, and leave it running for the next section:
```shell
python stream_data_to_dataset.py --profile
```
It prints a session ID and tags every point with it as `tutorial_session_id`.
## Watch the data arrive
1. Open `FSAE CT8 Vehicle`, click **New workbook** and select **New empty workbook**.
1. Drag `sine_wave`, `temperature` or `cpu_utilization` from **Channel search** onto the chart.
1. Click **Go Live** in the bottom left. New points appear as the script sends them.
```{video} /guides/images/b5/stream-gif.mp4
:loop:
:alt: Streaming data flowing into a Nominal workbook
```
`cpu_info` is a struct, so a time series chart can't plot it directly.
Drag it onto a **Value grid** panel, or [transform it](https://docs.nominal.io/core/documentation/platform/workbooks/manipulating-time-series#transforming-variables) to a numeric field such as `frequency_ghz`.
If other people are running this tutorial in your workspace, show only your points with a tag filter:
1. In the workbook's **Inputs** panel, click **+** and set **Type** to **Tag filter**.
1. Set **Tag key** to `tutorial_session_id`, paste your session ID into **Tag values** and click **Save input**.
1. For channels you add later, click **+** next to the input and select **Apply to all variables**.

Press `Ctrl+C` to stop streaming.
## Clean up
Archive the asset from its options menu on the Assets page, or from Python:
```python
client.get_asset("").archive()
```
Archiving hides the asset without deleting its data. Only a workspace admin can delete the dataset.
To query the data with SQL, see the [SQL interface](https://docs.nominal.io/developers/sql/overview).