rastriq. Talk to us →
Rastriq / Data normalization

Data normalization: one common schema for sources that look nothing alike.

Three car makers publish the same kind of price with three different structures. We turn it into a single table you can load, join and audit. Below, the real rows before and after.

Quick answer: Rastriq turns sources with different structures, such as the configurators of three car makers, into one common schema with documented types, source URL, capture date and quality flags that mark doubtful rows without filtering them out. Delivery is as CSV or JSON, to an S3 bucket or as an Apify dataset with API access.

3
Source schemas
1
Common schema
0
Rows dropped by QA

Three schemas, one table

BMW publishes gross and net price with VAT in its own field. Kia mixes price, discount and a net-price flag. Volvo returns a base amount with a tax flag. All three describe the same concept using different names, types and semantics.

Before · BMW (25 fields per row)

marketmodel_nameline_namefuel_typecurrencygross_list_pricenet_list_pricevat_percentage
esBMW 118dPaquete M Sport ProDEUR42768.134010.40.21
esBMW 118dM Sport DesignDEUR36673.729164.010.21

Before · Kia (31 fields per row)

countrymodel_nametrim_namepropulsioncurrencypriceis_net_pricenet_pricediscount_amount
SpainEV6AirElectricEUR35530.01false29363.6413465
GermanyEV6AirElectricEUR44990false449900

Before · Volvo (13 fields per row)

countrymodelNamepowertrainbasePriceAmountbasePriceCurrencypriceIncludesTaxpriceStatus
ESEX30BEV35800EURtrueok
SEEX30BEV429000SEKtrueok

After · common schema

brandmarketmodeltrimpowertraincurrencyprice_grossprice_netdiscount_amountqa_flags
BMWES118dPaquete M Sport ProdieselEUR42768.134010.4——
BMWES118dM Sport DesigndieselEUR36673.729164.01——
KiaESEV6AirbevEUR35530.0129363.6413465—
KiaDEEV6AirbevEUR44990449900net_equals_gross
VolvoESEX30—bevEUR35800——net_price_unavailable
VolvoSEEX30—bevSEK429000——net_price_unavailable | non_eur_currency

Real rows from the BMW, Kia and Volvo samples. Amounts keep the source currency; values missing at the source stay empty and are flagged in qa_flags.

How each field is translated

The mapping is documented field by field and versioned. If a manufacturer changes its structure, the change is recorded and the common schema does not break.

ConceptBMWKiaVolvoCommon schema
Brandconstant per actorconstant per actorconstant per actorbrand
Marketmarket (es)country (Spain)country (ES)market (ISO 3166)
Modelmodel_namemodel_namemodelNamemodel
Trimline_nametrim_nameeditiontrim
Powertrainfuel_type (D)propulsion (Electric)powertrain (BEV)powertrain
Price incl. taxesgross_list_pricepricebasePriceAmount + priceIncludesTaxprice_gross
Price excl. taxesnet_list_pricenet_pricenot publishedprice_net
Discountnot publisheddiscount_amountdiscountSavingAmountdiscount_amount

Four steps to unify sources

Normalization is not a one-off clean-up: it is a set of explicit rules that run on every delivery.

Taxonomy
We define closed lists for powertrain (diesel, petrol, bev, phev, hev), body type and drive, and map every source value. In the example, D becomes diesel and Electric or BEV become bev.
Entity matching
The same model shows up under different names: in the Volkswagen actor the same range is published as "Der Golf", "GOLF" and "Golf". We resolve those variants into a single entity with rules and review of doubtful cases.
Deduplication
We define a natural key (brand, market, model, trim, powertrain and capture date) and keep a single row per key. Repeats across runs do not inflate your series.
QA that flags and does not filter
Quality rules add a label in qa_flags but never remove rows. In the example, net_price_unavailable, non_eur_currency and net_equals_gross warn without hiding the data; you decide what to do with them.

Where we apply normalization

The same method works for any vertical with several sources. These are the cases with a public sample today.

OEM configurators
28 brands
Prices by market, trim and powertrain under a common schema across brands.
See coverage →
Spain used cars
Coches.net · Wallapop · Milanuncios
Year, mileage, fuel type, price and province aligned across three portals.
See coverage →
Other sources
Under project
Machinery, tenders, reviews or directories: we define the common schema with you.
See custom projects →

What you receive

The delivery includes data, documentation and rules. For the conceptual side, read the guide on normalizing configurator pricing.

Load-ready table
CSV or JSON in the common schema, plus a field dictionary with type, example and calculation rule.
Formats: CSV, JSON
Recurring delivery
Every scheduled run is already normalized and published to your S3 bucket or an Apify dataset with API access.
Channels: S3, Apify, API
Traceability
Each row keeps its source URL and capture date, and the mapping is versioned so you can reproduce any figure.
Fields: source_url, scraped_at

Frequently asked questions about normalization

What is the difference between cleaning and normalizing?

Cleaning fixes isolated errors. Normalizing defines a schema, categories and stable rules so that different sources produce the same structure on every delivery and can be joined without manual work.

Do you remove rows during QA?

No. QA tags rows with labels in qa_flags and lets them through. You decide on filtering, because a row that looks suspicious for one use case may be valid for another.

Do you convert currencies?

By default we keep the source currency on every row. If you need a common currency, we add a converted column with a fixed, documented exchange rate, without replacing the original amount.

Can you normalize my own files?

Yes, as long as they are product or market data that can be shared. We review a sample, define the target schema and apply the rules on every delivery.

What happens if the source changes its structure?

We detect the change, update the mapping and version the rule. The common schema stays the same, so your loads do not break even if the manufacturer redesigns its configurator.

Request a normalized sample

Tell us which sources you want to unify and we will return an extract in the common schema with the field dictionary.

  • Normalized extract with qa_flags
  • Field dictionary and per-source mapping
  • No commitment
Could not send. Please use the contact form instead.
Received. Meanwhile, download the real samples at /en/samples/.

Shall we talk about your schema?

Tell us which sources you handle and what table you need at the end.

Keep exploring