> For the complete documentation index, see [llms.txt](https://docs.termina.technology/documentation/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.termina.technology/documentation/developer-docs-ru/scenarii/generaciya-datasetov/gotovye-datasety.md).

# Готовые датасеты

#### Данные

Как и бандлы, несколько датасетов доступны в готовом виде. С ними можно анализировать качество исполнения и ликвидность на разных площадках без собственного пайплайна воспроизведения, даже если команда только знакомится с моделью программирования Solana.

Точнее, эти датасеты отвечают на такие вопросы: где котировки площадки расходятся с тем, что видят агрегаторы, какая на самом деле глубина у каждого пула при заданном объеме, какие свопы площадка проиграла и по какой цене.

| Датасет                                 | Описание                                                                                                                     | Путь для загрузки               |
| --------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | ------------------------------- |
| Ончейн-глубина                          | Глубина ликвидности по каждой площадке, рассчитанная напрямую из ончейн-состояния пулов.                                     | `datasets/depth/v2/`            |
| Глубина по данным агрегатора            | Глубина ликвидности по тем же площадкам в котировках Jupiter Metis.                                                          | `datasets/depth-diagnostic/v2/` |
| Фактические и гипотетические исполнения | Исполнения, которые произошли на самом деле, и рядом исполнения, которые получила бы каждая площадка, если бы выиграла своп. | `datasets/estimated_fills/v2/`  |

#### Схемы

Все датасеты хранятся в формате Parquet и разбиты по дате, рынку и площадке. Шаблон пути для каждого датасета указан в его разделе.

Объемы токенов указаны в базовых единицах (например, у SOL 9 знаков после запятой, у BTC 8, у USDC 6).

<details>

<summary>Ончейн-глубина</summary>

`datasets/depth/v{version_number}/date=YYYY-MM-DD/market={token_pair}/venue={venue}/part-{start_slot}-{end_slot}.parquet`

<table><thead><tr><th width="236.91796875">Колонка</th><th>Примечание</th></tr></thead><tbody><tr><td>slot</td><td></td></tr><tr><td>input_token</td><td>тикер (например, SOL)</td></tr><tr><td>output_token</td><td></td></tr><tr><td>in_amount</td><td></td></tr><tr><td>out_amount</td><td></td></tr><tr><td>price_impact_bps</td><td>курс в сравнении с уровнем 0</td></tr><tr><td>trigger</td><td><ul><li>by grid: всегда один раз за слот</li><li>by event: может быть внутри слота или раз в несколько слотов</li></ul></td></tr><tr><td>rung_index</td><td>размер уровня удваивается на каждом шаге; уровень 0 базовый</td></tr></tbody></table>

</details>

<details>

<summary>Глубина по данным агрегатора</summary>

`datasets/depth-diagnostic/v{version_number}/date=YYYY-MM-DD/market={token_pair}/venue={venue}/part-{start_slot}-{end_slot}.parquet`

<table><thead><tr><th width="223.55859375">Колонка</th><th>Примечание</th></tr></thead><tbody><tr><td>slot</td><td></td></tr><tr><td>router_slot</td><td>слот, до которого Jupiter Metis обработал данные на момент ответа (может отставать от <code>slot</code>)</td></tr><tr><td>pool</td><td>адрес пула</td></tr><tr><td>router_label</td><td>понятное название пула (например, SolFi V2)</td></tr><tr><td>input_token</td><td>тикер (например, SOL)</td></tr><tr><td>output_token</td><td></td></tr><tr><td>in_amount</td><td></td></tr><tr><td>out_amount</td><td></td></tr><tr><td>usd_value</td><td><code>in_amount</code> в USD</td></tr><tr><td>account_hashes</td><td>отпечаток каждого аккаунта, на котором Metis строил цену</td></tr><tr><td>quote_error</td><td>почему Metis был недоступен</td></tr><tr><td>error</td><td>почему Metis не вернул цену (например, в пуле не хватило ликвидности)</td></tr><tr><td>raw_entry</td><td>полный JSON-ответ Metis</td></tr></tbody></table>

</details>

<details>

<summary>Фактические и гипотетические исполнения</summary>

`datasets/estimated-fills/v1/date=YYYY-MM-DD/dex={program_id}/part-{start_slot}-{end_slot}.parquet`

<table><thead><tr><th width="284.50390625">Колонка</th><th>Описание</th></tr></thead><tbody><tr><td>slot</td><td></td></tr><tr><td>block_time</td><td>временная метка</td></tr><tr><td>swap_mode</td><td><ul><li>exact in: входной объем фиксирован, выходной меняется (например, продать ровно 10 USDC)</li><li>exact out: выходной объем фиксирован, входной меняется (например, получить ровно 1 SOL)</li></ul></td></tr><tr><td>input_mint</td><td>тикер (например, SOL)</td></tr><tr><td>output_mint</td><td></td></tr><tr><td>amount</td><td>для исходного свопа</td></tr><tr><td>l1_fill</td><td>для исходного свопа</td></tr><tr><td>l1_program</td><td>адрес DEX, который исполнил исходный своп</td></tr><tr><td>l1_venue</td><td>понятное название DEX</td></tr><tr><td>input_amount</td><td><ul><li>равен <code>l1_fill</code>, если <code>swap_mode</code> равен exact out</li><li>равен <code>amount</code>, если <code>swap_mode</code> равен exact in</li></ul></td></tr><tr><td>output_amount</td><td><ul><li>равен <code>l1_fill</code>, если <code>swap_mode</code> равен</li><li>равен <code>amount</code>, если <code>swap_mode</code> равен</li></ul></td></tr><tr><td>original_failed</td><td>прошел ли исходный своп или упал</td></tr><tr><td>quote_lag_blocks</td><td></td></tr><tr><td>estimate_fill</td><td>версия <code>l1_fill</code> для симулированной площадки</td></tr><tr><td>replay_input_amount</td><td><code>input_amount</code> симулированной площадки</td></tr><tr><td>replay_output_amount</td><td><code>output_amount</code> симулированной площадки</td></tr><tr><td>outcome</td><td><ul><li>результат симулированного свопа</li><li>один из вариантов: filled, reverted, unattributed, unsimulatable</li></ul></td></tr><tr><td>category</td><td>причина отката симулированного свопа</td></tr></tbody></table>

</details>

#### Доступ

Датасеты хранятся в S3 в формате Parquet. Запросите учетные данные по адресу авторизации ниже, а затем обращайтесь к бакету напрямую, как показано в примере кода.

<table><thead><tr><th width="170.87890625"></th><th>URL</th></tr></thead><tbody><tr><td>Авторизация для датасетов</td><td><pre><code>https://simulator.termina.technology/datasets/credentials
</code></pre></td></tr><tr><td>S3-бакет</td><td><pre><code>s3://data.termina.technology
</code></pre></td></tr></tbody></table>

<details>

<summary>example_access.py</summary>

```python
import boto3
import requests

API_KEY = ""
AUTH_URL = "https://simulator.termina.technology/datasets/credentials"
DATA_URL = "data.termina.technology"

# получить учетные данные для доступа
creds = requests.post(AUTH_URL, headers={"X-API-Key": API_KEY}).json()
print(f"creds: {creds.keys()}\n")

# создать авторизованный клиент s3
s3 = boto3.client(
    "s3",
    aws_access_key_id=creds["access_key_id"],
    aws_secret_access_key=creds["secret_access_key"],
    aws_session_token=creds["session_token"],
    region_name=creds["region"],
)

# вывести список всех parquet-файлов в датасетах
resp = s3.list_objects_v2(Bucket=DATA_URL, Prefix="datasets/")
files = [obj["Key"] for obj in resp.get("Contents", [])]
print(files)
```

</details>
