slogan3

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

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!