Help me met het maken van aangepaste datavalidatieregels voor mijn Pandas DataFrame
description
Maakt het mogelijk om hoge datakwaliteit te waarborgen door op maat gemaakte validatieregels te implementeren, fouten te verminderen vóór analyse of modellering, en specifieke controles te automatiseren. Deze prompt helpt bij het maken van robuuste validatiescripts met duidelijke rapportage, wat datavoorbereiding betrouwbaarder en efficiënter maakt dan generieke methoden.
prompt
Ik heb een Pandas DataFrame met de volgende data: <voer een beschrijving of voorbeeld van je DataFrame in>. Help me met het maken van aangepaste datavalidatieregels om specifieke voorwaarden te controleren zoals waarde-intervall ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
no_answer_for_language
error: Generation failed [openai] prompt_id=3653 locale=nl err=OpenAI connection/timeout | Generation failed [openai] prompt_id=3653 locale=en err=OpenAI connection/timeout | Generation failed [openai] prompt_id=3653 locale=de err=OpenAI connection/timeout | Generation failed [openai] prompt_id=3653 locale=fr err=OpenAI connection/timeout | Generation failed [openai] prompt_id=3653 locale=pt err=OpenAI connection/timeout | Generation failed [openai] prompt_id=3653 locale=es err=OpenAI connection/timeout | Generation failed [openai] prompt_id=3653 locale=zh err=OpenAI connection/timeout
provider: deepseek
model: deepseek-chat
Zeker! Hier is een uitgebreide handleiding voor datavalidatie in Pandas met praktische voorbeelden:
## Basis DataFrame (voorbeeld)
```python
import pandas as pd
import numpy as np
import re
# Voorbeeld DataFrame
data = {
'klant_id': [101, 102, 103, 104, 105],
'naam': ['Jan Jansen', 'Piet.Pieters', 'Marie', 'Klaas@Klaassen', 'Anna Janssen'],
'email': ['jan@email.nl', 'piet@mail.com', 'ongeldig', 'klaas@bedrijf.nl', 'anna@email.nl'],
'leeftijd': [25, 17, 35, 150, 42],
'saldo': [1000.50, -200.75, 3000.00, 500.25, 750.00],
'postcode': ['1234AB', '9876ZX', '1234AB', 'invalid', '5678CD'],
'registratie_datum': pd.date_range('2023-01-01', periods=5),
'status': ['actief', 'inactief', 'actief', 'actief', 'pending']
}
df = pd.DataFrame(data)
```
## Aangepaste Validatieregels
### 1. Waarde-intervallen controleren
```python
def valideer_waarden(df):
fouten = []
# Leeftijd tussen 18 en 120
leeftijd_fout = df[~df['leeftijd'].between(18, 120)]
if not leeftijd_fout.empty:
fouten.append(f"Ongeldige leeftijd: {leeftijd_fout.index.tolist()}")
# Saldo niet negatief
saldo_fout = df[df['saldo'] < 0]
if not saldo_fout.empty:
fouten.append(f"Negatief saldo: {saldo_fout.index.tolist()}")
return fouten
```
### 2. Regex-patroonmatching
```python
def valideer_format(df):
fouten = []
# Email validatie
email_pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
email_fout = df[~df['email'].str.match(email_pattern, na=False)]
if not email_fout.empty:
fouten.append(f"Ongeldig email formaat: {email_fout.index.tolist()}")
# Postcode NL formaat (1234AB)
postcode_pattern = r'^\d{4}[A-Z]{2}$'
postcode_fout = df[~df['postcode'].str.match(postcode_pattern, na=False)]
if not postcode_fout.empty:
fouten.append(f"Ongeldige postcode: {postcode_fout.index.tolist()}")
# Naam zonder speciale tekens
naam_pattern = r'^[a-zA-Z\s]+$'
naam_fout = df[~df['naam'].str.match(naam_pattern, na=False)]
if not naam_fout.empty:
fouten.append(f"Ongeldige naam: {naam_fout.index.tolist()}")
return fouten
```
### 3. Consistentie tussen kolommen
```python
def valideer_consistentie(df):
fouten = []
# Actieve klanten moeten positief saldo hebben
consistentie_fout = df[(df['status'] == 'actief') & (df['saldo'] <= 0)]
if not consistentie_fout.empty:
fouten.append(f"Inconsistente status/saldo: {consistentie_fout.index.tolist()}")
# Unieke klant IDs
duplicate_ids = df[df.duplicated('klant_id', keep=False)]
if not duplicate_ids.empty:
fouten.append(f"Duplicaat klant IDs: {duplicate_ids.index.tolist()}")
return fouten
```
### 4. Domeinspecifieke validaties
```python
def valideer_domein(df):
fouten = []
# Geldige statuswaarden
geldige_statussen = ['actief', 'inactief', 'pending', 'geblokkeerd']
status_fout = df[~df['status'].isin(geldige_statussen)]
if not status_fout.empty:
fouten.append(f"Ongeldige status: {status_fout.index.tolist()}")
# Registratiedatum in het verleden
toekomstige_datum = df[df['registratie_datum'] > pd.Timestamp.now()]
if not toekomstige_datum.empty:
fouten.append(f"Toekomstige registratiedatum: {toekomstige_datum.index.tolist()}")
return fouten
```
## Complete Validatie Uitvoering
```python
def voer_complete_validatie_uit(df):
alle_fouten = []
alle_fouten.extend(valideer_waarden(df))
alle_fouten.extend(valideer_format(df))
alle_fouten.extend(valideer_consistentie(df))
alle_fouten.extend(valideer_domein(df))
return alle_fouten
# Uitvoeren van validatie
fouten = voer_complete_validatie_uit(df)
if fouten:
print("⚠️ Validatiefouten gevonden:")
for fout in fouten:
print(f" - {fout}")
else:
print("✅ Geen validatiefouten gevonden!")
```
## Geavanceerde Foutrapportage
```python
def gedetailleerde_foutrapportage(df):
rapport = {
'fouten_per_rij': {},
'fout_categorieën': {
'waarden': [], 'formaat': [],
'consistentie': [], 'domein': []
}
}
# Per rij fouten bijhouden
for idx in df.index:
rij_fouten = []
# Waarden check
if not df.loc[idx, 'leeftijd'] in range(18, 121):
rij_fouten.append('leeftijd buiten bereik')
rapport['fout_categorieën']['waarden'].append(idx)
# Voeg andere checks toe...
if rij_fouten:
rapport['fouten_per_rij'][idx] = rij_fouten
return rapport
# Gebruik:
rapport = gedetailleerde_foutrapportage(df)
print(f"Totaal rijen met fouten: {len(rapport['fouten_per_rij'])}")
```
## Alternatief met Pandera (recommended)
```python
# pip install pandera
import pandera as pa
from pandera import Column, Check, DataFrameSchema
schema = DataFrameSchema({
"leeftijd": Column(int, Check.in_range(18, 120)),
"email": Column(str, Check.str_matches(r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$')),
"saldo": Column(float, Check.greater_than_or_equal_to(0)),
"postcode": Column(str, Check.str_matches(r'^\d{4}[A-Z]{2}$')),
"status": Column(str, Check.isin(['actief', 'inactief', 'pending', 'geblokkeerd']))
})
try:
schema.validate(df, lazy=True)
except pa.errors.SchemaErrors as err:
print("Validatiefouten gevonden:")
print(err.failure_cases) # Gedetailleerd overzicht
```
## Tips voor Effectieve Afhandeling:
1. **Logging**: Gebruik Python's logging module voor gestructureerde foutrapportage
2. **Fouten verzamelen**: Bewaar fouten in een apart DataFrame voor analyse
3. **Automatisering**: Maak een validatiepipeline voor regelmatige checks
4. **Rapportage**: Genereer samenvattingsrapporten met aantallen en typen fouten
```python
# Voorbeeld fouten DataFrame
def maak_fouten_dataframe(df, fouten_rapport):
fouten_df = df.loc[list(fouten_rapport['fouten_per_rij'].keys())].copy()
fouten_df['fout_types'] = fouten_df.index.map(
lambda x: fouten_rapport['fouten_per_rij'].get(x, [])
)
return fouten_df
```
Deze aanpak geeft je een robuust validatiesysteem dat gemakkelijk aan te passen is aan je specifieke requirements!