---
title: "Нормализиране на автомобилни данни: как дванадесет източника от търгове стават една схема"
description: "Как да нормализирате марка, модел, гориво, скоростна кутия и щети между търгове с различни класификации — и защо суровите данни са важни."
slug: vehicle-data-normalization
canonical: https://thecarapi.com/bg/blog/vehicle-data-normalization
category: Инженерство на данни
author: Инженерен екип на Авто Данни
published: 2026-03-14
updated: 2026-08-14
tags: [нормализиране на данни, проектиране на схеми, класификация на автомобили, ETL]
---

# Нормализиране на автомобилни данни: как дванадесет източника от търгове стават една схема

Нормализирането е мястото, където проектите с автомобилни данни от много източници успяват или тихо се провалят. Провалът не е срив; това е филтър, който връща грешните коли, без никой да може да забележи.

Дванадесет платформи за търгове, описващи една и съща кола, ще дадат дванадесет различни низа, три различни речника за горива, две валути и поне едно поле, в което едно и също име означава нещо различно от навсякъде другаде. Обединяването им в една схема е работата. Това е и работата, която се подценява с около порядък, защото всяко отделно съпоставяне изглежда тривиално, а те са няколко хиляди.

Ето практическо описание на проблемите в реда, в който ще се сблъскате с тях.

## Започнете с полетата, които изглеждат лесни

Видът гориво е класическият пример за поле, което всички смятат за изброяване с три стойности. На практика в европейските източници на едро ще срещнете всички изброени по-долу като отделни сурови стойности, означаващи припокриващи се неща:

```text
Petrol · Gasoline · Benzin · Essence · Benzina · Gasolina
Diesel · Gasoil · Gazole · Nafta
Hybrid · Hybrid (Petrol) · HEV · Full Hybrid · Mild Hybrid · MHEV
Plug-in Hybrid · PHEV · Plug-in Hybrid (Diesel) · Hybrid Rechargeable
Electric · BEV · Elektro · Électrique · Elettrica
LPG · GPL · Autogas · Petrol/LPG · Bi-fuel
CNG · Erdgas · Methane · Petrol/CNG
```

Самото съпоставяне е просто. Решенията в него не са и те са продуктови, а не инженерни:

- **Лекият хибрид** в `Hybrid` ли е или в `Petrol`? 48-волтов MHEV се кара като бензинова кола и в повечето пазари се облага като такава, но купувач, който филтрира „Хибрид“, може и да очаква да го види.
- **Плъг-ин хибридът** влиза ли в `Hybrid`, или е отделна група? Купувачите, които искат точно PHEV, не искат HEV, а ценовата разлика е съществена.
- **Двугоривният бензин/LPG** в `Petrol` ли е или в `LPG`? Наистина е и двете.

> **Решете веднъж, запишете го, покажете и двете** — Каквото и да изберете, решението е едно и също: пазете каноничен `fuel_group` за филтриране и запазвайте оригиналния низ от източника до него. Потребителите филтрират по групата; всеки, на когото му трябва разликата, може да прочете суровата стойност. Никога не презаписвайте стойността от източника.

## Марка, модел и проблемът с версията

Марката е почти решима — няколкостотин стойности, предимно с очевидни синоними (`VW` / `Volkswagen`, `Mercedes` / `Mercedes-Benz` / `MB`, `Alfa` / `Alfa Romeo`). Дори тук има капани: `DS` е била версия на Citroën, преди да стане отделна марка, и обявите отпреди разделянето още водят колите DS под Citroën.

Моделът е мястото, където става наистина трудно, защото източниците не са съгласни къде свършва моделът и къде започва версията.

| Низ от източника | Модел | Версия / вариант | Бележка |
| --- | --- | --- | --- |
| `BMW 320d Touring xDrive M Sport` | 3 Series | 320d Touring xDrive M Sport | Кодът на двигателя носи смисъл — 320d ≠ 320i |
| `VW Golf VII 1.6 TDI Comfortline` | Golf | 1.6 TDI Comfortline | Номерът на поколението е важен за оценката |
| `Mercedes C 220 d T-Modell AMG Line` | C-Class | C 220 d Estate AMG Line | `T-Modell` е „комби“ на немски, не версия |
| `Peugeot 3008 1.5 BlueHDi Allure Pack` | 3008 | 1.5 BlueHDi Allure Pack | Числовите имена на модели се сблъскват с обема на двигателя |
| `Kia Niro 1.6 GDi HEV` | Niro | 1.6 GDi HEV | Едно име съществува като HEV, PHEV и BEV |

Редът с Kia Niro е поучителният. `Niro` е едно име, покриващо хибрид, плъг-ин хибрид и изцяло електрическа кола с напълно различни задвижвания, тегла и цени. Ако нормализирате само до името, получавате „модел“, чието ценово разпределение е тривърхово, а средната му стойност е безсмислена.

### Работещата структура

Три полета вместо две, попълвани с намаляваща увереност:

1. `clean_make` — съпоставено с поддържан списък от марки със синоними. Висока увереност, почти пълно покритие.
2. `clean_model` — съпоставено с каталог на моделите за всяка марка. Добра увереност; изисква ръчно поддържане за нови модели.
3. **Суров низ на варианта** — запазен дословно. Не се опитвайте да разбивате версията на структурирани полета, освен ако клиент не плаща за това; комбинаториката е брутална, а ползата — малка.

## Цените не са числа

Полето за цена е най-опасното поле в данните, защото е число, а числата изглеждат надеждни. Преди да сравните две цени от различни източници, трябва да знаете шест неща за всяка:

- **Валутата** и за източници извън еврозоната — курсът и *кога* е приложен. Цена в корейски вони, преобразувана при импортиране, не е същата като преобразуваната при четене.
- **Третирането на ДДС** — с ДДС, без ДДС или режим на маржа. Това е разлика от над 20% и източниците наистина се различават.
- **Включването на такси** — включва ли показаната сума таксата за купувача на платформата, която често е нелинейна функция на крайната цена?
- **Видът на цената** — текущо наддаване, „купи сега“, резервна цена или оценка. Те не са взаимозаменяеми и една колона `price`, която ги смесва, е неизползваема.
- **Състоянието на резерва** — текущо наддаване под недостигнат резерв не е цена, на която колата е налична.
- **Времето на наблюдение** — при активен лот цена без време не е факт.

Решението е сравнимо поле, изчислено на една последователна база, до недокоснатата стойност от източника:

```json
{
  "current_price": 9800,          // стойност от източника, във валутата и на базата на източника
  "currency": "EUR",
  "public_price_eur": 11466.00,   // една последователна база, сравнима между източниците
  "buy_now_price": 12400,
  "buy_now": true
}
```

_Филтрирайте и сортирайте по сравнимото поле. Показвайте стойността от източника, когато потребителят разглежда самия лот. Никога не сортирайте по колона със смесени бази._

> **Най-евтината кола в търсенето ви вероятно е бъг** — Когато търсене по възходяща цена върне нещо неправдоподобно, причината почти винаги е смесване на бази — сума без ДДС, сортирана спрямо такива с ДДС, или остарял курс при източник извън еврозоната. Проверете базата, преди да проверявате колата.

## Пробег и капанът с мерните единици

Километри почти навсякъде в Европа, мили за автомобилите от Великобритания и Ирландия и понякога цяло число без единица, чиято единица извеждате от източника. Две допълнителни особености, които си струва да обработите изрично:

- Някои източници публикуват пробега в хиляди. `45` в поле, което обикновено съдържа `45000`, не е кола с 45 км; това е бъг с единиците, който чака да стигне до клиент.
- Нулата и null са различни. Нула означава, че километражът показва нула — правдоподобно при нова кола с пробег от доставката, съмнително иначе. Null означава, че източникът не е казал. Ако ги слеете, всяка кола с неизвестен пробег изглежда нова.

## Щети: полето без общ речник

Няма стандартна европейска класификация на щетите. Източник, фокусиран върху повредени коли, може да публикува структурирани щети по панели; общ източник на едро може да публикува едно изречение свободен текст; друг може да не публикува нищо освен булева стойност. Опитът да ги обедините в една богата схема дава схема, която е предимно празна.

Прагматичното разслояване, което оцелява при реални данни:

1. **Булева стойност**, надеждно попълнена за всеки източник — повредена или не. Груба, но това е филтърът, който 90% от потребителите реално искат.
2. **Ниво на тежест**, където източникът го поддържа — лека, структурна, тотална щета.
3. **Суровите данни за щетите**, непроменени, за източниците, които публикуват детайли. Всеки, който оценява ремонти, чете тях и нищо друго.

Устоявайте на изкушението да извеждате тежестта от свободен текст с евристика. Тя ще греши в крайните случаи, а крайните случаи са точно скъпите коли. [Данни за повредени и катастрофирали автомобили](/blog/salvage-damaged-vehicle-data) разглежда това по-подробно.

## Пазете суровите данни. Винаги.

Ако има едно нещо, което да вземете от тази статия: нормализирането губи информация, съпоставянето ви някъде ще е грешно и ще научите от клиент. Запазването на недокоснатите данни от източника превръща това от срив в справка.

```bash
curl -s "https://api.thecarapi.com/api/auction/schadeautos/1775437" \
  -H "X-API-Key: $API_KEY" | jq '.car_identification'
```

_Всеки нормализиран автомобил пази `car_identification` — данните от източника точно както са публикувани, така че спорно поле може да се проследи до това, което източникът реално е казал._

Това прави и нормализирането подобряемо. Когато поправите съпоставяне, можете да преработите историята от суровите данни, вместо да чакате поправените данни да се натрупат занапред.

## Проверявайте непрекъснато, не само при импортиране

Проверката на схемата при импортиране хваща грешки в типовете. Не хваща провалите, които имат значение — а те са в разпределенията. Четири наблюдения, които си струва да пускате по график:

- **Попълненост по поле и по източник.** Поле, попълнено на 95%, което за една нощ падне до 60%, е счупен извличач, каквото и да казват журналите.
- **Известия за несъпоставени стойности.** Всяка сурова стойност за гориво, скоростна кутия или купе, която не се съпостави, трябва да вдигне тревога, а не да падне тихо в кошница „Друго“, където изчезва.
- **Изместване на ценовото разпределение.** Източник, чиято медианна цена се промени с 30% за ден, е сменил базата за ДДС или валутата. Не е придобил внезапно по-евтини коли.
- **Проверка между източниците.** Една и съща марка и модел трябва да имат припокриващи се ценови диапазони в различните източници. Липсата на припокриване е бъг в нормализирането, а не пазарно прозрение.

> **Първо изградете ендпойнтите за речниците** — Предоставяйте каноничните стойности като данни — марки, модели, горива, скоростни кутии, държави — вместо да ги вграждате във фронтенда. Така речникът може да се проверява, клиентите откриват новите стойности автоматично, а нов източник добавя опции, вместо да чупи филтрите. Вижте [ендпойнтите на каталога](/docs/catalog).

## Редът на изграждане

Ако започвате от нулата, последователността, която спестява най-много преработка:

1. Първо съхранявайте суровите данни, преди да нормализирате каквото и да е. Всичко останало може да се изчисли отново от тях; нищо не може да се възстанови без тях.
2. Нормализирайте марката, после горивото, после скоростната кутия. Най-висока стойност, най-малка двусмисленост.
3. Изградете сравнимото поле за цена рано — то стои пред всеки смислен филтър и сортиране.
4. После съпоставянето на модели, като приемете, че изисква постоянна поддръжка завинаги.
5. Щетите последни, на слоеве, а не обединени.
6. Добавете наблюденията на разпределенията, преди да имате клиенти, а не след първия инцидент с лоши данни.

Ако това звучи като повече работа, отколкото искате да поемете, това е разумен извод — горе-долу това е аргументът в [разбивката „изгради или купи“](/blog/scraping-car-auction-sites-vs-api), а [речникът на данните](/docs/schema) документира схемата, описана в статията, така както реално работи.

## Frequently asked questions

### Какво означава нормализиране на автомобилни данни?

Съпоставяне на различните, специфични за всеки източник начини, по които платформите описват автомобил — марка, модел, гориво, скоростна кутия, ценова база, щети — с една последователна схема, така че данните от много източници да могат да се филтрират, сортират и сравняват заедно. Определящото ограничение е, че то трябва да губи информация, без да е разрушително: каноничните стойности стоят до оригиналните стойности от източника, никога вместо тях.

### Леките хибриди хибриди ли са или бензинови?

Няма универсално правилен отговор — това е продуктово решение. 48-волтовият лек хибрид се кара и се облага като бензинова кола, но потребителите, които филтрират „хибрид“, може да очакват да го видят. Каквото и да изберете, пазете оригиналния низ от източника, за да може разликата да се възстанови, и документирайте решението там, където потребителите на API ще го прочетат.

### Защо не мога просто да използвам VIN за съпоставяне на автомобили между източниците?

VIN е идеалният ключ, но рядко се публикува в обявите от търгове на едро — много платформи го показват само на влезли търговци, а попълнеността варира силно по източник и държава. Архитектура, която приема VIN за ключ за свързване, работи на тестови данни и се проваля в продукция. Използвайте го, когато го има, и имайте резервен вариант по нормализирани атрибути, когато го няма.

### Как се сравняват цени от източници с различно третиране на ДДС?

Изчислете едно сравнимо поле на последователна база — обща валута, определено третиране на ДДС и посочена политика за включване на таксите — и го съхранявайте до недокоснатата стойност от източника. Филтрирайте и сортирайте само по сравнимото поле. Сортирането на колона, която смесва суми без и с ДДС, е най-честата причина за неправдоподобни резултати при търсене по възходяща цена.

### Как да разбера, че нормализирането тихо се е счупило?

С наблюдение на разпределенията, а не с проверка на схемата. Следете попълнеността на всяко поле по източник, вдигайте тревога за сурови стойности, които не се съпоставят, вместо да ги слагате в „Друго“, отбелязвайте внезапни измествания на медианната цена на източник и проверявайте, че една и съща марка и модел имат припокриващи се ценови диапазони в източниците. Проверката на типовете минава, докато и четирите се провалят.
