slogan3

Help me bij het automatiseren van data cleaning workflows met Pandas

description

Met deze prompt kan de gebruiker een efficiënte, herbruikbare data cleaning workflow opzetten die handmatige fouten vermindert en tijd bespaart. Het behandelt geavanceerde schoonmaakstappen die verder gaan dan standaard methoden, waardoor de data betrouwbaarder en consistenter wordt voor analyse. Dit is beter dan losse, handmatige schoonmaak omdat het schaalbaar en reproduceerbaar is.

prompt

Ik wil een geautomatiseerde workflow bouwen om mijn Pandas DataFrame te reinigen en voor te bereiden voor analyse. Mijn DataFrame bevat: <beschrijf de inhoud of geef een voorbeeld van je DataFrame>. Help me een Python-script te schrijven dat geavanceerde ...

try_prompt

generate_helper
disclaimerOnPageApi

ai_answers

provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een Python-script dat je kan gebruiken om je DataFrame te reinigen en voor te bereiden voor analyse. Het script bevat de volgende stappen: 1. Detectie en correctie van afwijkende waarden (outliers). 2. Standaardisering van tekstkolommen. 3. Uniformering van datatypes. 4. Automatisering en herbruikbaarheid voor soortgelijke datasets. ```python import pandas as pd import numpy as np from scipy import stats # Functie om outliers te detecteren en te corrigeren met z-score def corrigeer_outliers(df, kolom, z_threshold=3): z_scores = np.abs(stats.zscore(df[kolom].dropna())) outliers = np.where(z_scores > z_threshold) # Vervang outliers door NaN of de median median = df[kolom].median() df.loc[outliers, kolom] = median return df # Functie om tekstkolommen te standaardiseren def standaardiseer_tekst(df, kolom): df[kolom] = df[kolom].astype(str).str.strip().str.lower() # Optioneel: verwijder speciale tekens, accenten, etc. # Bijvoorbeeld, met unicodedata import unicodedata df[kolom] = df[kolom].apply(lambda x: ''.join( c for c in unicodedata.normalize('NFKD', x) if not unicodedata.combining(c) )) return df # Functie om datatypes te uniformeren def uniformeer_datatypes(df): df['Leeftijd'] = pd.to_numeric(df['Leeftijd'], errors='coerce') df['Inkomensgegevens'] = pd.to_numeric(df['Inkomensgegevens'], errors='coerce') return df # Algemene reinigingsworkflow def reinig_data(df): # 1. Datatype uniformeren df = uniformeer_datatypes(df) # 2. Tekstkolommen standaardiseren for kolom in ['Naam', 'Opmerkingen']: df = standaardiseer_tekst(df, kolom) # 3. Outliers detecteren en corrigeren df = corrigeer_outliers(df, 'Leeftijd') df = corrigeer_outliers(df, 'Inkomensgegevens') # 4. Missende waarden opvullen of verwijderen df['Naam'].fillna('onbekend', inplace=True) df['Opmerkingen'].fillna('', inplace=True) df['Leeftijd'].fillna(df['Leeftijd'].median(), inplace=True) df['Inkomensgegevens'].fillna(df['Inkomensgegevens'].median(), inplace=True) return df # Voorbeeld gebruik # df = pd.read_csv('jouw_data.csv') # df_clean = reinig_data(df) # df_clean.to_csv('jouw_data_schoon.csv', index=False) ``` **Hoe automatiseer en hergebruik je deze workflow?** - **Modulariseren:** Gebruik functies voor elke stap zodat je ze gemakkelijk kunt aanpassen of uitbreiden. - **Parameterisatie:** Bied opties (bijvoorbeeld z-score drempel) als parameters aan functies. - **Script integratie:** Plaats het script in een Python-bestand en voer het uit met je dataset als input. - **Pipeline gebruik:** Maak een pipeline met bijvoorbeeld sklearn's `Pipeline` of andere workflowtools voor meer geavanceerde automatisering. - **Batchverwerking:** Loop over meerdere bestanden met een script dat automatisch alle datasets reinigt volgens dezelfde stappen. Door deze aanpak te volgen, wordt je data cleaning consistent, herhaalbaar en makkelijk aanpasbaar voor verschillende datasets.
provider: deepseek
model: deepseek-chat
Zeker! Ik help je met een geautomatiseerd Python-script voor geavanceerde data cleaning. Hier is een complete oplossing: ```python import pandas as pd import numpy as np import re from scipy import stats import logging class DataCleaner: def __init__(self): self.logger = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO) def clean_dataframe(self, df): """Hoofdfunctie voor het reinigen van de DataFrame""" try: # Stap 1: Basisinspectie self._log_data_info(df) # Stap 2: Datatype uniformering df = self._uniform_datatypes(df) # Stap 3: Tekstkolommen standaardiseren df = self._clean_text_columns(df) # Stap 4: Ontbrekende waarden afhandelen df = self._handle_missing_values(df) # Stap 5: Uitschieters detecteren en corrigeren df = self._handle_outliers(df) # Stap 6: Finale validatie self._validate_clean_data(df) return df except Exception as e: self.logger.error(f"Fout tijdens data cleaning: {str(e)}") raise def _log_data_info(self, df): """Logt basisinformatie over de dataset""" self.logger.info(f"Dataset vorm: {df.shape}") self.logger.info(f"Kolommen: {list(df.columns)}") self.logger.info(f"Datatypes:\n{df.dtypes}") self.logger.info(f"Ontbrekende waarden:\n{df.isnull().sum()}") def _uniform_datatypes(self, df): """Zet datatypes om naar consistente formaten""" # Numerieke kolommen numeric_cols = ['Leeftijd', 'Inkomensgegevens'] for col in numeric_cols: if col in df.columns: df[col] = pd.to_numeric(df[col], errors='coerce') # Tekstkolommen text_cols = ['Naam', 'Opmerkingen'] for col in text_cols: if col in df.columns: df[col] = df[col].astype(str) return df def _clean_text_columns(self, df): """Standaardiseert tekstkolommen""" if 'Naam' in df.columns: # Naam kapitaliseren en whitespace verwijderen df['Naam'] = df['Naam'].str.strip().str.title() if 'Opmerkingen' in df.columns: # Speciale tekens verwijderen en consistent maken df['Opmerkingen'] = df['Opmerkingen'].apply(self._standardize_text) return df def _standardize_text(self, text): """Standaardiseert tekstinvoer""" if pd.isna(text) or text == 'nan': return None # Converteer naar string en verwijder overbodige whitespace text = str(text).strip() # Verwijder speciale tekens behalve letters, cijfers en leestekens text = re.sub(r'[^\w\s.,!?-]', '', text) # Eerste letter hoofdletter, rest kleine letters if len(text) > 0: text = text[0].upper() + text[1:].lower() return text if text != '' else None def _handle_missing_values(self, df): """Behandelt ontbrekende waarden op kolomspecifieke manier""" # Voor numerieke kolommen: mediaan imputatie if 'Leeftijd' in df.columns: median_age = df['Leeftijd'].median() df['Leeftijd'] = df['Leeftijd'].fillna(median_age) if 'Inkomensgegevens' in df.columns: median_income = df['Inkomensgegevens'].median() df['Inkomensgegevens'] = df['Inkomensgegevens'].fillna(median_income) # Voor tekstkolommen: placeholder of lege string text_cols = ['Naam', 'Opmerkingen'] for col in text_cols: if col in df.columns: df[col] = df[col].fillna('Onbekend') return df def _handle_outliers(self, df): """Detecteert en corrigeert uitschieters met Z-score""" numeric_cols = ['Leeftijd', 'Inkomensgegevens'] for col in numeric_cols: if col in df.columns: # Bereken Z-scores z_scores = np.abs(stats.zscore(df[col].dropna())) # Identificeer uitschieters (Z-score > 3) outliers = z_scores > 3 if outliers.any(): self.logger.warning(f"{outliers.sum()} uitschieters gevonden in {col}") # Vervang uitschieters met mediaan median_val = df[col].median() df.loc[df[col].index[outliers], col] = median_val return df def _validate_clean_data(self, df): """Valideert de gereinigde data""" # Controleer op ontbrekende waarden missing_values = df.isnull().sum().sum() if missing_values > 0: self.logger.warning(f"Nog {missing_values} ontbrekende waarden na cleaning") # Controleer datatypes expected_dtypes = { 'Naam': 'object', 'Leeftijd': 'float64', 'Inkomensgegevens': 'float64', 'Opmerkingen': 'object' } for col, expected_type in expected_dtypes.items(): if col in df.columns and str(df[col].dtype) != expected_type: self.logger.warning(f"Onverwacht datatype voor {col}: {df[col].dtype}") # Gebruiksvoorbeeld en automatisering def automated_cleaning_pipeline(input_file, output_file): """ Volledig geautomatiseerde cleaning pipeline """ try: # Stap 1: Data inladen df = pd.read_csv(input_file) # of pd.read_excel() voor Excel # Stap 2: Cleaning uitvoeren cleaner = DataCleaner() cleaned_df = cleaner.clean_dataframe(df) # Stap 3: Schoon data opslaan cleaned_df.to_csv(output_file, index=False) print(f"Gereinigde data opgeslagen als: {output_file}") return cleaned_df except Exception as e: print(f"Fout in cleaning pipeline: {str(e)}") return None # Hoe te gebruiken: if __name__ == "__main__": # Voor eenmalig gebruik df = pd.read_csv('jouw_data.csv') cleaner = DataCleaner() cleaned_data = cleaner.clean_dataframe(df) # Voor geautomatiseerde workflow result = automated_cleaning_pipeline('input_data.csv', 'cleaned_data.csv') ``` **Automatisering en hergebruik tips:** 1. **Configuratiebestand**: Maak een JSON/YAML-bestand voor kolomspecifieke instellingen 2. **Parameterisering**: Gebruik functieparameters voor aanpasbare thresholds 3. **Logging**: Implementeer uitgebreide logging voor debugging 4. **Unit tests**: Schrijf tests voor elke cleaning functie 5. **Docker-container**: Packageer als container voor consistentie 6. **Airflow/Luigi**: Integreer in workflow management tools **Voor hergebruik met andere datasets:** ```python # Pas eenvoudig kolomnamen en regels aan class CustomDataCleaner(DataCleaner): def __init__(self, column_mapping, cleaning_rules): super().__init__() self.column_mapping = column_mapping self.cleaning_rules = cleaning_rules def custom_clean_method(self, df): # Implementeer aangepaste cleaning logic pass ``` Dit script biedt een robuuste basis die je eenvoudig kunt aanpassen voor verschillende datasets!