slogan3

Help me met het automatiseren van Pandas DataFrame data-anomaliedetectie

description

Met deze prompt kan de gebruiker een geautomatiseerd systeem opzetten om datakwaliteitsproblemen vroegtijdig te signaleren, wat fouten in analyses voorkomt en de betrouwbaarheid van datasets verhoogt. Dit is efficiënter dan handmatige controles en biedt flexibiliteit voor diverse datatypes en anomalievormen.

prompt

Ik werk met een Pandas DataFrame dat de volgende gegevens bevat: <voer een beschrijving of voorbeeld van je DataFrame in>. Help me een Python-script te schrijven dat automatisch anomalieën detecteert, zoals uitbijters, onver ...

try_prompt

generate_helper
disclaimerOnPageApi

ai_answers

provider: openai
model: gpt-4.1-nano
no_answer_for_language
error: Generation failed [openai] prompt_id=3652 locale=nl err=OpenAI connection/timeout | Generation failed [openai] prompt_id=3652 locale=en err=OpenAI connection/timeout | Generation failed [openai] prompt_id=3652 locale=de err=OpenAI connection/timeout | Generation failed [openai] prompt_id=3652 locale=fr err=OpenAI connection/timeout | Generation failed [openai] prompt_id=3652 locale=pt err=OpenAI connection/timeout | Generation failed [openai] prompt_id=3652 locale=es err=OpenAI connection/timeout | Generation failed [openai] prompt_id=3652 locale=zh err=OpenAI connection/timeout
provider: deepseek
model: deepseek-chat
Ik help je graag met het schrijven van een Python-script voor anomaliedetectie in je Pandas DataFrame. Hier is een complete oplossing: ```python import pandas as pd import numpy as np from scipy import stats import matplotlib.pyplot as plt import seaborn as sns from datetime import datetime class AnomalieDetector: def __init__(self, df): self.df = df.copy() self.anomalieën = pd.DataFrame() def detecteer_numerieke_anomalieën(self, kolom, methode='zscore', drempel=3): """Detecteert anomalieën in numerieke kolommen""" if methode == 'zscore': z_scores = np.abs(stats.zscore(self.df[kolom].dropna())) anomalie_mask = z_scores > drempel elif methode == 'iqr': Q1 = self.df[kolom].quantile(0.25) Q3 = self.df[kolom].quantile(0.75) IQR = Q3 - Q1 anomalie_mask = (self.df[kolom] < (Q1 - 1.5 * IQR)) | (self.df[kolom] > (Q3 + 1.5 * IQR)) anomalie_data = self.df[anomalie_mask].copy() anomalie_data['AnomalieType'] = f'Numerieke uitbijter ({methode})' anomalie_data['AnomalieKolom'] = kolom self.anomalieën = pd.concat([self.anomalieën, anomalie_data]) def detecteer_categorische_anomalieën(self, kolom, zeldzaamheidsdrempel=0.01): """Detecteert zeldzame categorische waarden""" waarde_frequenties = self.df[kolom].value_counts(normalize=True) zeldzame_waarden = waarde_frequenties[waarde_frequenties < zeldzaamheidsdrempel].index anomalie_mask = self.df[kolom].isin(zeldzame_waarden) anomalie_data = self.df[anomalie_mask].copy() anomalie_data['AnomalieType'] = 'Zeldzame categorische waarde' anomalie_data['AnomalieKolom'] = kolom self.anomalieën = pd.concat([self.anomalieën, anomalie_data]) def detecteer_datum_anomalieën(self, kolom): """Detecteert anomalieën in datumkolommen""" # Controleer op toekomstige datums (indien van toepassing) huidige_datum = pd.Timestamp.now() toekomstige_datum_mask = self.df[kolom] > huidige_datum if toekomstige_datum_mask.any(): anomalie_data = self.df[toekomstige_datum_mask].copy() anomalie_data['AnomalieType'] = 'Toekomstige datum' anomalie_data['AnomalieKolom'] = kolom self.anomalieën = pd.concat([self.anomalieën, anomalie_data]) def detecteer_ontbrekende_waarden(self): """Detecteert ontbrekende waarden in alle kolommen""" ontbrekend_mask = self.df.isnull().any(axis=1) if ontbrekend_mask.any(): anomalie_data = self.df[ontbrekend_mask].copy() anomalie_data['AnomalieType'] = 'Ontbrekende waarde' anomalie_data['AnomalieKolom'] = 'Meerdere kolommen' self.anomalieën = pd.concat([self.anomalieën, anomalie_data]) def voer_complete_detectie_uit(self): """Voert complete anomaliedetectie uit voor alle kolommen""" self.anomalieën = pd.DataFrame() # Controleer kolomdatatypes for kolom in self.df.columns: dtype = self.df[kolom].dtype if np.issubdtype(dtype, np.number): self.detecteer_numerieke_anomalieën(kolom, methode='zscore') self.detecteer_numerieke_anomalieën(kolom, methode='iqr') elif dtype == 'object': self.detecteer_categorische_anomalieën(kolom) elif np.issubdtype(dtype, np.datetime64): self.detecteer_datum_anomalieën(kolom) self.detecteer_ontbrekende_waarden() return self.anomalieën def genereer_rapport(self): """Genereert een overzichtelijk rapport van alle anomalieën""" if self.anomalieën.empty: print("Geen anomalieën gedetecteerd!") return print("=" * 60) print("ANOMALIE DETECTIE RAPPORT") print("=" * 60) # Samenvatting per anomalie type print("\nSamenvatting per type:") print(self.anomalieën['AnomalieType'].value_counts()) print(f"\nTotaal aantal anomalieën: {len(self.anomalieën)}") print(f"Percentage van dataset: {len(self.anomalieën)/len(self.df)*100:.2f}%") # Gedetailleerd overzicht print("\nGedetailleerd overzicht:") for idx, anomalie in self.anomalieën.iterrows(): print(f"\nTransactieID: {anomalie['TransactieID']}") print(f"Type: {anomalie['AnomalieType']}") print(f"Kolom: {anomalie['AnomalieKolom']}") print(f"Waarde: {anomalie[anomalie['AnomalieKolom']]}") # Visualisatie (optioneel) self.visualiseer_anomalieën() def visualiseer_anomalieën(self): """Maakt visualisaties van de gedetecteerde anomalieën""" plt.figure(figsize=(12, 6)) # Boxplot voor numerieke waarden if 'Bedrag' in self.df.columns: plt.subplot(1, 2, 1) sns.boxplot(y=self.df['Bedrag']) plt.title('Boxplot van Bedrag met uitbijters') # Barplot voor categorische waarden if 'Categorie' in self.df.columns: plt.subplot(1, 2, 2) self.df['Categorie'].value_counts().plot(kind='bar') plt.title('Verdeling van Categorieën') plt.xticks(rotation=45) plt.tight_layout() plt.show() # Gebruiksvoorbeeld: # df = pd.read_csv('jouw_data.csv') # Laad je DataFrame # detector = AnomalieDetector(df) # anomalieën = detector.voer_complete_detectie_uit() # detector.genereer_rapport() ``` ## Aanpassingen voor verschillende datatypes: ### 1. **Numerieke kolommen (Bedrag)**: - **Z-score methode**: Ideaal voor normaal verdeelde data - **IQR methode**: Beter voor niet-normale verdelingen - **Aanpassen**: Wijzig de `drempel` parameter voor gevoeligheid ### 2. **Categorische kolommen (Categorie)**: - **Zeldzaamheidsdrempel**: Stel in met `zeldzaamheidsdrempel` - **Domain knowledge**: Voeg verwachte waarden toe aan whitelist ### 3. **Datumkolommen (Datum)**: - **Toekomstige datums**: Automatische detectie - **Ongebruikelijke patterns**: Voeg custom checks toe ## Beste methoden voor jouw situatie: 1. **Voor Bedrag**: Gebruik zowel Z-score als IQR voor dubbele zekerheid 2. **Voor Categorie**: Stel zeldzaamheidsdrempel in op 1-5% afhankelijk van datasetgrootte 3. **Combineer methoden**: Gebruik domeinkennis voor extra validatieregels ## Extra aanbevelingen: ```python # Domeinspecifieke checks toevoegen: def voeg_custom_checks_toe(self): # Bijvoorbeeld: bedragen onder €0.01 of boven €10.000 bedrag_anomalie = (self.df['Bedrag'] < 0.01) | (self.df['Bedrag'] > 10000) # Onverwachte categorieën verwachte_categorieën = ['Voedsel', 'Transport', 'Wonen', 'Entertainment'] categorie_anomalie = ~self.df['Categorie'].isin(verwachte_categorieën) ``` Dit script geeft je een complete oplossing die je eenvoudig kunt aanpassen voor jouw specifieke dataset!