Дванадесет платформи за търгове, описващи една и съща кола, ще дадат дванадесет различни низа, три различни речника за горива, две валути и поне едно поле, в което едно и също име означава нещо различно от навсякъде другаде. Обединяването им в една схема е работата. Това е и работата, която се подценява с около порядък, защото всяко отделно съпоставяне изглежда тривиално, а те са няколко хиляди.
Ето практическо описание на проблемите в реда, в който ще се сблъскате с тях.
Започнете с полетата, които изглеждат лесни
Видът гориво е класическият пример за поле, което всички смятат за изброяване с три стойности. На практика в европейските източници на едро ще срещнете всички изброени по-долу като отделни сурови стойности, означаващи припокриващи се неща:
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? Наистина е и двете.
Марка, модел и проблемът с версията
Марката е почти решима — няколкостотин стойности, предимно с очевидни синоними (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, която ги смесва, е неизползваема. - Състоянието на резерва — текущо наддаване под недостигнат резерв не е цена, на която колата е налична.
- Времето на наблюдение — при активен лот цена без време не е факт.
Решението е сравнимо поле, изчислено на една последователна база, до недокоснатата стойност от източника:
{
"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Суровите данни за щетите, непроменени, за източниците, които публикуват детайли. Всеки, който оценява ремонти, чете тях и нищо друго.
Устоявайте на изкушението да извеждате тежестта от свободен текст с евристика. Тя ще греши в крайните случаи, а крайните случаи са точно скъпите коли. Данни за повредени и катастрофирали автомобили разглежда това по-подробно.
Пазете суровите данни. Винаги.
Ако има едно нещо, което да вземете от тази статия: нормализирането губи информация, съпоставянето ви някъде ще е грешно и ще научите от клиент. Запазването на недокоснатите данни от източника превръща това от срив в справка.
curl -s "https://api.thecarapi.com/api/auction/schadeautos/1775437" \
-H "X-API-Key: $API_KEY" | jq '.car_identification'car_identification — данните от източника точно както са публикувани, така че спорно поле може да се проследи до това, което източникът реално е казал.Това прави и нормализирането подобряемо. Когато поправите съпоставяне, можете да преработите историята от суровите данни, вместо да чакате поправените данни да се натрупат занапред.
Проверявайте непрекъснато, не само при импортиране
Проверката на схемата при импортиране хваща грешки в типовете. Не хваща провалите, които имат значение — а те са в разпределенията. Четири наблюдения, които си струва да пускате по график:
- Попълненост по поле и по източник. Поле, попълнено на 95%, което за една нощ падне до 60%, е счупен извличач, каквото и да казват журналите.
- Известия за несъпоставени стойности. Всяка сурова стойност за гориво, скоростна кутия или купе, която не се съпостави, трябва да вдигне тревога, а не да падне тихо в кошница „Друго“, където изчезва.
- Изместване на ценовото разпределение. Източник, чиято медианна цена се промени с 30% за ден, е сменил базата за ДДС или валутата. Не е придобил внезапно по-евтини коли.
- Проверка между източниците. Една и съща марка и модел трябва да имат припокриващи се ценови диапазони в различните източници. Липсата на припокриване е бъг в нормализирането, а не пазарно прозрение.
Редът на изграждане
Ако започвате от нулата, последователността, която спестява най-много преработка:
- 1Първо съхранявайте суровите данни, преди да нормализирате каквото и да е. Всичко останало може да се изчисли отново от тях; нищо не може да се възстанови без тях.
- 2Нормализирайте марката, после горивото, после скоростната кутия. Най-висока стойност, най-малка двусмисленост.
- 3Изградете сравнимото поле за цена рано — то стои пред всеки смислен филтър и сортиране.
- 4После съпоставянето на модели, като приемете, че изисква постоянна поддръжка завинаги.
- 5Щетите последни, на слоеве, а не обединени.
- 6Добавете наблюденията на разпределенията, преди да имате клиенти, а не след първия инцидент с лоши данни.
Ако това звучи като повече работа, отколкото искате да поемете, това е разумен извод — горе-долу това е аргументът в разбивката „изгради или купи“, а речникът на данните документира схемата, описана в статията, така както реално работи.
Често задавани въпроси
Какво означава нормализиране на автомобилни данни?
Съпоставяне на различните, специфични за всеки източник начини, по които платформите описват автомобил — марка, модел, гориво, скоростна кутия, ценова база, щети — с една последователна схема, така че данните от много източници да могат да се филтрират, сортират и сравняват заедно. Определящото ограничение е, че то трябва да губи информация, без да е разрушително: каноничните стойности стоят до оригиналните стойности от източника, никога вместо тях.
Леките хибриди хибриди ли са или бензинови?
Няма универсално правилен отговор — това е продуктово решение. 48-волтовият лек хибрид се кара и се облага като бензинова кола, но потребителите, които филтрират „хибрид“, може да очакват да го видят. Каквото и да изберете, пазете оригиналния низ от източника, за да може разликата да се възстанови, и документирайте решението там, където потребителите на API ще го прочетат.
Защо не мога просто да използвам VIN за съпоставяне на автомобили между източниците?
VIN е идеалният ключ, но рядко се публикува в обявите от търгове на едро — много платформи го показват само на влезли търговци, а попълнеността варира силно по източник и държава. Архитектура, която приема VIN за ключ за свързване, работи на тестови данни и се проваля в продукция. Използвайте го, когато го има, и имайте резервен вариант по нормализирани атрибути, когато го няма.
Как се сравняват цени от източници с различно третиране на ДДС?
Изчислете едно сравнимо поле на последователна база — обща валута, определено третиране на ДДС и посочена политика за включване на таксите — и го съхранявайте до недокоснатата стойност от източника. Филтрирайте и сортирайте само по сравнимото поле. Сортирането на колона, която смесва суми без и с ДДС, е най-честата причина за неправдоподобни резултати при търсене по възходяща цена.
Как да разбера, че нормализирането тихо се е счупило?
С наблюдение на разпределенията, а не с проверка на схемата. Следете попълнеността на всяко поле по източник, вдигайте тревога за сурови стойности, които не се съпоставят, вместо да ги слагате в „Друго“, отбелязвайте внезапни измествания на медианната цена на източник и проверявайте, че една и съща марка и модел имат припокриващи се ценови диапазони в източниците. Проверката на типовете минава, докато и четирите се провалят.
- нормализиране на данни
- проектиране на схеми
- класификация на автомобили
- ETL
Един API, много източници на инвентар
Нормализирано търсене, детайли според източника, галерии в CDN, история на цените и достъп до архива — включени във всеки план.