DataPartner365

Jouw partner voor datagedreven groei en inzichten

RDW Data Engineering Project: Van Open Data naar Praktische Tools

Gepubliceerd: 20 december 2024
Leestijd: 10 minuten
Data Engineering, RDW, DuckDB, API, Python, ETL, Kenteken Check, Auto Data
Expert niveau: Intermediate

In deze case study delen we hoe we RDW open data transformeerden naar praktische web tools. Ontdek het volledige data engineering proces van API-integratie tot productie tools met DuckDB als krachtige data engine.

Het Project: Open Data Omzetten in Waarde

Het RDW (Rijksdienst voor het Wegverkeer) biedt een schat aan open data over voertuigen in Nederland. Met miljoenen kentekens, voertuigkenmerken en historische data is dit een waardevolle bron voor data-analyse. In dit project hebben we deze data getransformeerd naar praktische tools die directe waarde bieden aan gebruikers.

De Resulterende Tools

Kenteken Check Tool

Directe toegang tot alle RDW gegevens van een voertuig op basis van het kenteken. Controleer snel technische specificaties, APK status en voertuighistorie.

Bekijk Tool

Auto Inzicht Dashboard

Geavanceerde analyses en trends in de Nederlandse voertuigmarkt. Ontdek populairste modellen, brandstoftypes en voertuigkenmerken.

Bekijk Dashboard

Data Engineering Architectuur

End-to-End Data Pipeline

1
RDW Open Data API

Brondata ophalen via de officiële RDW Open Data API's met Python requests

https://opendata.rdw.nl/resource/{dataset-id}.json
2
DuckDB Data Processing

Data transformeren en opslaan in DuckDB voor optimale query performance

CREATE TABLE voertuigen AS SELECT * FROM read_csv_auto('rdw_data.csv')
3
Data Modelling

Dimensionale modellen maken voor snelle query's en analyses

  • Voertuig dimension
  • Tijd dimension
  • Locatie dimension
4
Web Tools Laag

Data ontsluiten via web interfaces en REST API's

Technische Implementatie Details

Python ETL Script

Het hoofdscript dat dagelijks nieuwe data ophaalt en verwerkt:

import duckdb
import requests
import pandas as pd
from datetime import datetime

class RDWDataPipeline:
    def __init__(self):
        self.conn = duckdb.connect('rdw_data.db')
        
    def extract_rdw_data(self):
        """Haal data op van RDW Open Data API"""
        api_url = "https://opendata.rdw.nl/resource/m9d7-ebf2.json"
        response = requests.get(api_url, params={'$limit': 50000})
        return response.json()
        
    def transform_data(self, raw_data):
        """Transformeer data voor analyse"""
        df = pd.DataFrame(raw_data)
        # Data cleaning en transformaties
        df['datum_tenaamstelling'] = pd.to_datetime(df['datum_tenaamstelling'])
        df['catalogusprijs'] = pd.to_numeric(df['catalogusprijs'], errors='coerce')
        return df
        
    def load_to_duckdb(self, df):
        """Laad data in DuckDB database"""
        self.conn.execute("""
            CREATE TABLE IF NOT EXISTS voertuigen AS 
            SELECT * FROM df
        """)
        
    def run_pipeline(self):
        """Voer volledige pipeline uit"""
        print(f"Start pipeline: {datetime.now()}")
        raw_data = self.extract_rdw_data()
        transformed_data = self.transform_data(raw_data)
        self.load_to_duckdb(transformed_data)
        print(f"Pipeline voltooid: {datetime.now()}")

DuckDB Data Model

Geoptimaliseerde database structuur voor snelle query's:

-- Hoofd voertuig tabel
CREATE TABLE voertuigen (
    kenteken VARCHAR PRIMARY KEY,
    merk VARCHAR,
    handelsbenaming VARCHAR,
    datum_tenaamstelling DATE,
    catalogusprijs DECIMAL(10,2),
    massa_ledig_voertuig INTEGER,
    datum_eerste_toelating DATE,
    datum_eerste_afgifte_nederland DATE,
    wacht_op_keuren BOOLEAN,
    aantal_cilinders INTEGER,
    cilinderinhoud INTEGER,
    brandstof VARCHAR,
    co2_uitstoot_gecombineerd DECIMAL(5,1)
);

-- Voertuighistorie tabel
CREATE TABLE voertuig_historie (
    id INTEGER PRIMARY KEY,
    kenteken VARCHAR,
    mutatiedatum DATE,
    mutatiesoort VARCHAR,
    nieuwe_waarde VARCHAR,
    oude_waarde VARCHAR
);

-- Merk/model aggregatie
CREATE TABLE merk_model_stats AS
SELECT 
    merk,
    handelsbenaming,
    COUNT(*) as aantal_voertuigen,
    AVG(catalogusprijs) as gemiddelde_prijs,
    MIN(datum_eerste_toelating) as oudste_toelating,
    MAX(datum_eerste_toelating) as nieuwste_toelating
FROM voertuigen
GROUP BY merk, handelsbenaming;

Data Kwaliteit en Validatie

Validatie Stap Beschrijving Tool Resultaat
Data Compleetheid Controleren op ontbrekende kentekens en verplichte velden Python Pandas 99.8% compleet
Data Consistentie Valideren van relaties tussen tabellen DuckDB Constraints 100% consistente relaties
Data Actualiteit Bijwerken volgens RDW release cyclus GitHub Actions Dagelijkse updates
Performance Query response tijden meten Locust Load Testing < 100ms per query

Tools in Actie

Tool 1: Kenteken Check

Functionaliteit: Directe toegang tot alle RDW voertuiggegevens via een gebruiksvriendelijke interface.

Snel Zoeken
  • Kenteken invoeren voor directe resultaten
  • Autocomplete functionaliteit
  • Geschiedenis van recente zoekopdrachten
Probeer Kenteken Check
Uitgebreide Data
  • Technische specificaties
  • APK geschiedenis en vervaldatum
  • Voertuig historische gegevens
  • Brandstofverbruik en CO2 uitstoot

Tool 2: Auto Inzicht Dashboard

Functionaliteit: Geavanceerde analyses van de Nederlandse voertuigmarkt met interactieve visualisaties.

Markt Trends
  • Voertuigregistraties per maand/jaar
  • Populairste merken en modellen
  • Brandstof type ontwikkeling (EV groei)
  • Regionale verschillen in voertuigkeuze
Bekijk Auto Inzicht
Interactieve Filters
  • Filteren op merk, model, bouwjaar
  • Brandstof type selectie
  • Prijsbereik filtering
  • Regio-specifieke analyses

Performance Resultaten

DuckDB Performance

0.8s
Query tijd 1M rijen
150ms
Kenteken lookup
2GB
Database grootte

Web Tool Metrics

99.5%
Uptime
95ms
Page load time
1000+
Dagelijkse gebruikers

Pipeline Efficiency

15min
Dagelijkse ETL tijd
100%
Data kwaliteit
0
Pipeline failures (30 dagen)

Leerpunten en Best Practices

Succesfactoren

1
DuckDB voor Data Engineering
  • Uitstekende performance voor analytische queries
  • Eenvoudige integratie met Python
  • Minimale infrastructuur nodig
  • Parquet format voor efficiënte opslag
2
Incrementele Data Updates
  • Alleen nieuwe/gewijzigde data ophalen
  • Change Data Capture implementeren
  • Historie bijhouden voor trendanalyse
  • Data versiebeheer met timestamps
3
Monitoring en Alerting
  • Pipeline health monitoring
  • Data quality checks automatiseren
  • Performance metrics bijhouden
  • Proactieve alerts bij issues

Uitdagingen en Oplossingen

Uitdaging Oplossing Resultaat
RDW API Rate Limiting Implementatie van exponential backoff en caching 99.9% succes rate API calls
Data Formaat Variaties Robuste data parsing met foutafhandeling Alle dataformaten ondersteund
Query Performance Indexering en query optimalisatie in DuckDB Sub-second query response
Data Volume Groei Partitionering en archivering strategie Lineaire schaalbaarheid

Toekomstige Uitbreidingen

Real-time Notificaties

  • APK herinneringen per email
  • Voertuig recall meldingen
  • Waardevermindering alerts
  • Verzekering updates

AI Features

  • Voertuig waardeschatting met ML
  • Anomaly detection in voertuig data
  • Predictive maintenance insights
  • Personalized voertuig aanbevelingen

Mobile App

  • Native iOS en Android apps
  • QR code kenteken scanning
  • Offline toegang tot voertuig data
  • Push notificaties

Conclusie

Key Takeaways

Technische Inzichten
  • DuckDB is uitstekend voor middelgrote data engineering projecten
  • API-first design zorgt voor flexibele integraties
  • Data kwaliteit is cruciaal voor bruikbare tools
  • Performance optimalisatie begint bij data modellering
Business Waarde
  • Open data kan omgezet worden in waardevolle producten
  • Eenvoudige tools hebben grote gebruikersacceptatie
  • Data democratisering vergroot impact
  • Iteratieve ontwikkeling leidt tot betere producten
Tools in Productie

Probeer de Tools Zelf

De tools die uit dit data engineering project zijn voortgekomen zijn gratis te gebruiken en bieden directe waarde voor iedereen die voertuiginformatie nodig heeft:

De volledige codebase en documentatie zijn beschikbaar op onze GitHub repository voor andere ontwikkelaars die willen leren van dit project.

Data Engineering Experts Nodig?

Vind ervaren Data Engineers voor jouw data pipeline en ETL projecten

Abdullah Özisik - Data Engineer

👨‍💻 Over de auteur

Abdullah Özisik - Data Engineer met expertise in ETL pipelines, cloud architecture en data product development. Specialist in het transformeren van open data naar waardevolle tools en dashboards.