Gegevens inlezen en opslaan

Leer gegevens in pandas in te lezen uit formaten die analisten dagelijks tegenkomen en ze weer op te slaan zonder informatie te verliezen. Lees CSV- en andere tekstbestanden met de juiste scheidingstekens, getalnotaties, markeringen voor ontbrekende waarden, datums en tekencoderingen, waaronder rapporten met titelregels en afsluitende rapportregels. Lees Excel-werkmappen en JSON-bestanden in, haal gegevens op uit web-API's, sla resultaten op als CSV, Excel en Parquet en lees en schrijf gegevens met veilige, geparametriseerde query's uit en naar SQL-databases.

GemiddeldLes 3 van 8 in Cursus Data-analyse met Python: NumPy, pandas en visualisatie

Wat je leert

  1. Lees CSV- en andere tekstbestanden met scheidingstekens in met pd.read_csv, bepaal hoe pandas de kolommen splitst, benoemt en van een datatype voorziet en controleer het resultaat voordat je het analyseert.
    • Lees een CSV-bestand in en inspecteer het resultaat in pandas
      Lees een bestand met komma's als scheidingsteken in een DataFrame in, kies de kopregel, kolomnamen, index en te behouden kolommen en controleer de datatypes die pandas heeft afgeleid.
    • Verwerk scheidingstekens en regionale getalnotaties
      Herken het scheidingsteken, decimaalteken en scheidingsteken voor duizendtallen in een bestand en stel sep, decimal en thousands zo in dat getallen als getallen worden ingelezen.
    • Bepaal bij het inlezen hoe ontbrekende waarden, kolomtypes en datums worden verwerkt
      Geef pandas aan welke markeringen “ontbrekend” betekenen, behoud identificatiecodes als tekst, kies numerieke types en lees datums in met een expliciet formaat.
    • Lees bestanden met een onregelmatige indeling in
      Sla titelregels, commentaar en afsluitende rapportregels over, lees kopregels over meerdere rijen en kolommen met vaste veldbreedtes in en bepaal wat je met onjuist opgebouwde regels doet.
  2. Begrijp hoe tekst als bytes wordt opgeslagen, los coderingsfouten en verminkte tekens op en lees bestanden die te groot zijn of te langzaam laden om ze in één keer in te lezen.
    • Begrijp hoe tekens als bytes worden weergegeven
      Leg uit wat een tekencodering is en herken ASCII, UTF-8, Latin-1, Windows-1252, UTF-16 en de bytevolgordemarkering.
    • Stel coderingsproblemen vast en los ze op
      Herken een decoderingsfout en verminkte tekst, vind de juiste tekencodering en schrijf bestanden die andere programma's correct lezen.
    • Lees grote en gecomprimeerde tekstbestanden efficiënt in
      Verminder het geheugengebruik bij het inlezen, verwerk een bestand in gegevensblokken, combineer deelresultaten correct en lees gecomprimeerde bestanden rechtstreeks in.
  3. Lees gegevens uit werkbladen met titels, samengevoegde cellen en formules en schrijf een of meer DataFrames naar een werkmap voor anderen.
    • Lees werkbladen uit Excel-werkmappen in
      Kies het werkblad en de rijen en kolommen die je wilt inlezen en weet wat pandas doet met datums, formules, samengevoegde cellen en opmaak.
    • Schrijf DataFrames naar Excel-werkmappen
      Sla een of meer tabellen op in een werkmap die collega's kunnen openen en voorkom dat je gegevens overschrijft of verkeerd benoemt.
  4. Lees en schrijf JSON, zet geneste records om in tabellen en vraag betrouwbaar en veilig gegevens op bij web-API's.
    • Lees en schrijf JSON-gegevens
      Ken de syntaxis van JSON en de omzetting naar Python-objecten en lees en schrijf JSON en JSON Lines met Python en pandas.
    • Zet geneste JSON om in een platte tabel
      Zet geneste objecten en lijsten met pd.json_normalize om in kolommen en rijen en bepaal wat één rij voorstelt.
    • Vraag gegevens op bij een web-API
      Roep een API aan met de bibliotheek requests, controleer het antwoord, verwerk sleutels, pagina's en verzoeklimieten en lees tabellen van webpagina's.
  5. Schrijf opgeschoonde resultaten naar CSV, vergelijk tekstuele en binaire formaten en gebruik Parquet om gegevens tussen analysestappen compact en met de juiste types te bewaren.
    • Schrijf DataFrames naar CSV- en tekstbestanden
      Bepaal de index, ontbrekende waarden, getal- en datumnotaties en tekencodering van geschreven bestanden en bewaar ruwe gegevens veilig.
    • Vergelijk tekstuele en binaire opslagformaten
      Leg uit hoe tekstformaten en rijgeoriënteerde en kolomgeoriënteerde binaire formaten verschillen en kies CSV, Excel, JSON, Parquet, Feather, pickle of een database voor een bepaalde taak.
    • Lees en schrijf Parquet-bestanden
      Sla DataFrames met hun types op als Parquet, lees geselecteerde kolommen in en orden gegevens als een gepartitioneerde dataset.
  6. Verbind pandas met een database, lees queryresultaten in met parameters en de juiste types en schrijf DataFrames veilig naar tabellen.
    • Maak verbinding met een database en lees queryresultaten in
      Open een verbinding met SQLite of een andere database, voer vanuit pandas een gegeven SQL-query uit en beheer toegangsgegevens en verbindingen.
    • Geef queryparameters veilig door en bepaal de datatypes van de resultaten
      Voeg waarden met parameters aan query's toe in plaats van met tekenreeksopmaak en zorg voor de juiste datums, gehele getallen en blokgroottes in het resultaat.
    • Schrijf DataFrames naar databasetabellen
      Maak tabellen met to_sql, voeg er rijen aan toe en vervang ze, kies kolomtypes en controleer en herhaal schrijfbewerkingen veilig.

Gegevens inlezen en opslaan: uitleg

6 hoofdstukken

1

Lees tekstbestanden met scheidingstekens in met pandas

Tekstbestanden kunnen op tabellen lijken terwijl belangrijke keuzes niet zijn vastgelegd. Je leest records in pandas in, controleert de resulterende rijen en kolommen en kiest opties voor kopregels, velden tussen aanhalingstekens, getalnotaties, markeringen voor ontbrekende waarden en datums. Ook zoek je de werkelijke waarnemingen op in rapporten met titels, commentaar en totalen, zodat je na het inlezen de bedoelde tabel en waarden krijgt.

Gebruik je Excel in het Engels? Typ dan komma's in plaats van puntkomma's en deze namen: SOM is SUM.

1.1 Van CSV-records naar een gecontroleerde tabel

Een CSV-bestand is gewone tekst die is ingedeeld in records en velden. Komma's scheiden meestal de velden en het eerste record levert vaak kolomnamen. Het bestand bevat tekens, geen pandas-gegevensschema, dus bij het inlezen bepaal je ook wat die tekens voorstellen.

Lees een klein bestand in en inspecteer het

Stel dat een bestand dit bevat:

order_id,date,region,units,price
1001,2026-03-02,North,3,4.50
1002,2026-03-02,South,1,12.00
1003,2026-03-03,North,2,7.25

Lees het in en inspecteer het resultaat:

import pandas as pd

df = pd.read_csv("sales.csv")
print(df.head())
print(df.shape)
print(df.dtypes)
df.info()

De vorm is (3, 5): drie gegevensrijen en vijf kolommen. pandas leidt int64 af voor order_id en units en float64 voor price. De kolom date bevat nog tekst. In pandas 3 tonen afgeleide tekstkolommen normaal str; oudere pandas-versies tonen vaak object.

Elke inspectie beantwoordt een andere vraag. head() laat zien of velden bij hun labels passen. shape brengt ontbrekende rijen of een onverwachte extra kolom aan het licht. dtypes controleert de interpretatie en info() voegt het aantal aanwezige waarden toe. Als een kolom die voor getallen is bedoeld als tekst wordt ingelezen, bekijk dan de ruwe waarden: een eenheid, een plaatsaanduiding of een andere decimale notatie kan verhinderen dat een numeriek type wordt afgeleid.

Laat labels bij records passen

Gebruik voor een bestand zonder kopregel waarvan de eerste regel 1001,North,3 is:

df = pd.read_csv(
    "orders.txt",
    header=None,
    names=["id", "region", "units"]
)

Zonder die keuze neemt pandas het eerste record als kopregel. De waarden worden kolomnamen en het record verdwijnt uit de gegevens. Gebruik index_col="order_id" als een bestaande kolom de rijen moet labelen. Gebruik usecols=["region", "units"] om alleen die kolommen in te lezen, of nrows=1000 om de eerste 1.000 gegevensrijen te inspecteren voordat je een groot bestand inleest.

Laat de CSV-leesfunctie aanhalingstekens verwerken

Het record "Smith, Jane",Boston,10 heeft drie velden. De komma binnen de naam tussen aanhalingstekens hoort bij die naam. Twee dubbele aanhalingstekens binnen een veld tussen aanhalingstekens stellen één letterlijk dubbel aanhalingsteken voor: "O'Neil ""Red""" wordt O'Neil "Red". Een veld tussen aanhalingstekens kan zelfs een regeleinde bevatten, dus records en fysieke regels komen niet altijd overeen.

De aanroep line.split(",") splitst de naam en kan deze regels niet verwerken. read_csv verwerkt ze tijdens het inlezen. pd.read_table gebruikt standaard een tab als scheidingsteken; pd.read_fwf verwerkt velden die zijn gedefinieerd door tekenposities.

Zoek het bestand dat Python probeert te vinden

Een relatief pad wordt bepaald vanuit de huidige werkmap van het programma. Als "data/sales.csv" niet kan worden gevonden, inspecteer de werkmap dan met Path.cwd() na from pathlib import Path. Je kunt ook een absoluut pad, een Path-object, een URL of een tekstbestand in het geheugen zoals StringIO aan read_csv doorgeven. Controleer de locatie voordat je inleesopties wijzigt: een ontbrekend bestand en een verkeerd ingelezen bestand zijn verschillende problemen.

Belangrijkste punten

  • CSV slaat tekens op; pandas leidt bij het inlezen de kolomtypes af.
  • Controleer na het inlezen de eerste rijen, vorm, types en aantallen aanwezige waarden.
  • Gebruik header=None en names als het bestand geen kopregel heeft.
  • Scheidingstekens en regeleinden tussen aanhalingstekens horen bij velden; gebruik een CSV-parser.
  • Relatieve paden beginnen vanuit de huidige werkmap.

1.2 Scheidingstekens en getallen correct inlezen

Een scheidingsteken scheidt velden; een decimaalteken scheidt het gehele en het decimale deel van een getal. Een scheidingsteken voor duizendtallen groepeert cijfers. Deze drie functies vereisen aparte instellingen, ook als hetzelfde symbool in verschillende bestanden een andere functie heeft.

Inspecteer tekens voordat je opties kiest

Bekijk enkele ruwe regels in een editor. Een .csv-extensie garandeert geen komma's en .txt duidt geen bepaalde indeling aan. Veelgebruikte instellingen zijn:

BestandsindelingInleesoptie
Velden gescheiden door tabssep="\t"
Velden gescheiden door verticale strepen`sep="
Velden gescheiden door reeksen spatiessep=r"\s+"
Velden gescheiden door puntkomma'ssep=";"

Je kunt het begin inspecteren zonder het hele bestand in te lezen:

with open("products.csv", encoding="utf-8") as f:
    print(f.readline())
    print(f.readline())
Doorloop een regionale export

Bekijk deze tekst:

product;price;qty
Tea;3,50;1.200
Coffee;12,90;850

De puntkomma's scheiden velden, de komma is het decimaalteken en de punt groepeert duizendtallen. Geef alle drie de conventies expliciet op bij het inlezen:

df = pd.read_csv(
    "products.csv",
    sep=";",
    decimal=",",
    thousands="."
)

De prijzen worden 3,5 en 12,9. De aantallen worden 1200 en 850. Met de standaardkomma als scheidingsteken beschrijft deze kopregel geen drie door komma's gescheiden kolommen. Zelfs nadat je sep=";" hebt gekozen, ben je nog niet klaar: de prijzen blijven tekst en "1.200" kan het decimale getal 1,2 worden. Dat laatste resultaat is een geldig getal met de verkeerde betekenis, dus voor een ernstige fout hoeft geen inleesuitzondering op te treden.

Vergelijk enkele ingelezen waarden met hun brontekst en inspecteer describe() op onwaarschijnlijke bereiken. Een aantal dat je in de duizenden verwacht en dat rond één uitkomt, wijst op een probleem met de getalnotatie. Alleen het scheidingsteken wijzigen lost dat niet op.

Houd veldgrenzen gescheiden van de groepering van getallen

In een bestand met komma's als scheidingsteken moet een gegroepeerd getal zoals "1,234.50" tussen aanhalingstekens staan. De komma binnen het getal maakt er deel van uit. Met thousands="," kan pandas het veld tussen aanhalingstekens lezen als 1234,5. Zonder aanhalingstekens maakt de komma ook een veldgrens; thousands kan de verloren recordstructuur niet herstellen.

Kies een geschikte parser

De standaardparser in C verwerkt veelvoorkomende indelingen snel. De Python-parser ondersteunt detectie van het scheidingsteken met sep=None, reguliere expressies als scheidingsteken en skipfooter. De detectie onderzoekt een deel van het bestand en kan bij een onregelmatig rapport verkeerd kiezen, dus geef een bekend scheidingsteken direct op.

Een scheidingsteken van meer dan één teken wordt doorgaans als reguliere expressie behandeld en vereist de Python-parser; r"\s+" is een bijzonder geval dat ook door de C-parser wordt ondersteund. De PyArrow-parser kan met parallelle threads lezen, maar ondersteunt andere opties. Zo wordt chunksize niet ondersteund met engine="pyarrow". Kies de parser op basis van de opties die je bestand nodig heeft en controleer vervolgens de structuur en waarden van het resultaat.

Belangrijkste punten

  • Kies sep, decimal en thousands elk voor hun eigen functie.
  • Een resultaat dat op een getal lijkt, kan er nog steeds een factor 1.000 naast zitten.
  • Zet een veld tussen aanhalingstekens als de inhoud het scheidingsteken bevat.
  • De Python-parser ondersteunt detectie en skipfooter; de opties verschillen per parser.

1.3 Ontbrekende waarden, identificatiecodes en datums

Automatische typeafleiding kan niet weten of 999 een meting is of een code voor een onbekende waarde. Ook kan die niet weten of voorloopnullen betekenis hebben. Gebruik de definities van de gegevens om inleesopties in te stellen voordat de typeafleiding die waarden verandert.

Geef aan waar markeringen voor ontbrekende waarden gelden

pandas herkent lege velden en ingebouwde markeringen zoals "NA", "N/A", "n/a", "NULL", "NaN" en "None". Een bron kan extra markeringen gebruiken. Stel dat score 88, "n/a", "-" en 999 bevat, waarbij 999 als onbekend is gedefinieerd:

df = pd.read_csv(
    "scores.csv",
    na_values={"score": ["-", "999"]}
)

De scorekolom bevat nu 88,0 en drie ontbrekende waarden. Zonder de markeringen op te geven kan "-" ervoor zorgen dat de kolom tekst blijft; een niet-opgegeven numerieke signaalwaarde kan in berekeningen terechtkomen. Het gemiddelde van 88 en 999 is 543,5, hoewel de enige bekende score 88 is.

Een dictionary beperkt een markering tot de bijbehorende kolom. Een na_values=["999"] voor het hele bestand zou ook een echte productcode 999 verwijderen. Als "NA" een echt label is, gebruik dan keep_default_na=False om de ingebouwde lijst met markeringen uit te schakelen en geef expliciet de markeringen op die wel ontbreken betekenen. Neem bij die instelling "" op als lege velden nog steeds als ontbrekend moeten tellen.

Behoud waarden volgens hun functie

Lees identificatiecodes als tekst:

df = pd.read_csv(
    "visits.csv",
    dtype={"site_code": str, "visits": "Int64"}
)

Een code zoals "00501" moet vijf tekens lang blijven. Als je die als geheel getal inleest, krijg je 501; als je dat gehele getal later naar tekst converteert, krijg je "501", niet de oorspronkelijke code. Gebruik een numeriek type voor waarden waarmee je rekent.

Gewone NumPy-kolommen met gehele getallen kunnen geen NaN bevatten, dus wordt een telkolom met een ontbrekende waarde vaak float64. Het pandas-type "Int64", met een hoofdletter I, ondersteunt ontbrekende waarden, behoudt gehele getallen en geeft een ontbrekende waarde weer met <NA>. dtype_backend="numpy_nullable" vraagt voor het hele resultaat om types met ondersteuning voor ontbrekende waarden. Voor een kleine, herhaalde verzameling labels slaat dtype={"region": "category"} de labels op als categorieën en kan dit het geheugengebruik verminderen.

Geef op hoe datums zijn geschreven

Tekst die op een datum lijkt, blijft tekst totdat die als datum wordt ingelezen. Gebruik voor datums met de dag eerst, zoals "03/04/2026" en "13/04/2026":

df = pd.read_csv(
    "events.csv",
    parse_dates=["day"],
    date_format="%d/%m/%Y"
)

Deze waarden worden 3 april en 13 april. Zonder formaat kan een keuze voor de maand eerst geldige dagen en maanden verwisselen of kan de conversie van de kolom mislukken. dayfirst=True geeft een voorkeur aan; een expliciet formaat legt de verwachte structuur vast. ISO-datums zoals "2026-04-03" voorkomen dubbelzinnigheid over dag en maand.

Inspecteer na het inlezen dtypes, isna().sum() en het aantal rijen. Controleer een datum waarvan de interpretatie de conventies van elkaar onderscheidt. Als een kolom nog tekst toont, zijn bij het inlezen niet de bedoelde datum-tijdwaarden ontstaan; een onverwachte stijging van het aantal ontbrekende waarden kan aangeven dat een echt label voor een markering is aangezien.

Belangrijkste punten

  • Geef bronspecifieke markeringen voor ontbrekende waarden op, bij voorkeur per kolom.
  • Gebruik keep_default_na=False als een ingebouwde markering een echte gegevenswaarde is.
  • Lees identificatiecodes die alleen uit cijfers bestaan als tekst om voorloopnullen te behouden.
  • Gebruik Int64 met ondersteuning voor ontbrekende waarden voor tellingen met ontbrekende waarden.
  • Geef dubbelzinnige datums een expliciet formaat en controleer hun datatype.
  • Vergelijk de aantallen ontbrekende waarden met de bron.

1.4 Tabellen in rapporten en bestanden met vaste veldbreedtes

Een rapport kan een tabel combineren met titels, lege regels, commentaar, totalen en bronvermeldingen. Zoek eerst de kopregel en de grenzen van de gegevens. Anders kan een leesfunctie een titel voor kolomnamen aanzien of een totaal als gewone waarneming opnemen.

Lees alleen de tabel in

Een rapport bevat deze negen fysieke regels:

Monthly sales report
Exported 2026-04-01

region,jan,feb
North,120,135
# test row below
South,98,101
Total,218,236
Source: internal system

De eerste drie regels staan vóór de kopregel. De laatste twee zijn geen waarnemingen. Lees het rapport zo in:

df = pd.read_csv(
    "report.csv",
    skiprows=3,
    comment="#",
    skipfooter=2,
    engine="python"
)

Het resultaat heeft twee rijen. Het totaal voor januari is 218 uit North en South. Als je de totaalrij behoudt, komt daar nog eens 218 bij en rapporteer je 436. Met de standaardinstellingen kan de titel met één veld daarentegen de kopregel worden en tot een inleesfout leiden wanneer records met drie velden volgen.

skiprows=3 telt de eerste drie fysieke regels, inclusief de lege regel. Een lijst zoals skiprows=[0, 2] verwijdert specifieke regelposities, geteld vanaf nul. Lege regels worden standaard overgeslagen en comment="#" verwijdert commentaartekst. skipfooter vereist de Python-parser. Stem deze instellingen af op de werkelijke indeling; een vast aantal over te slaan regels kan onjuist worden als een exportprogramma een titelregel toevoegt.

Onderzoek onjuist opgebouwde records

Een record met te veel velden kan on_bad_lines="error", de standaardinstelling, activeren. "warn" slaat het record over met een waarschuwing, terwijl "skip" het zonder melding verwijdert. Inspecteer het ruwe record voordat je een van beide kiest. Een komma binnen een naamveld zonder aanhalingstekens of een verkeerd scheidingsteken kan extra velden maken; als je het record dan overslaat, verlies je een geldige waarneming in plaats van de oorzaak op te lossen.

Te weinig velden gedragen zich anders. Onder id,name,score wordt het record 2,Ben ingelezen met een ontbrekende score. Dat hoeft geen fout te geven. Controleer zowel het aantal ontbrekende waarden als het aantal rijen en vergelijk de behouden records met de bron als je onjuist opgebouwde regels uitsluit.

Lees kopregels op meerdere rijen of tekenposities

Twee rijen met kolomlabels kunnen een MultiIndex vormen. Met de groepslabels region,sales,sales boven ,2025,2026 geeft header=[0, 1] labels zoals ("sales", "2025"). Als platte labels beter bij de analyse passen, sla dan beide kopregels over en geef names=["region", "sales_2025", "sales_2026"] op.

Tekst met vaste veldbreedtes heeft geen scheidingsteken. Kolomgrenzen zijn tekenposities:

df = pd.read_fwf(
    "readings.txt",
    colspecs=[(0, 4), (4, 11), (11, 16)]
)

Deze halfopen bereiken omvatten elk beginpunt en sluiten het eindpunt uit. Het eerste veld beslaat de posities 0 tot en met 3 en het volgende begint bij 4. widths=[4, 7, 5] beschrijft dezelfde indeling. Automatische afleiding is handig bij regelmatige voorbeelden; expliciete grenzen voorkomen dat een korte waarde aan het begin de verkeerde breedte bepaalt.

Belangrijkste punten

  • Zoek de kopregel, waarnemingen en afsluitende rapportregels voordat je opties kiest om regels over te slaan.
  • Totaalrijen die als waarnemingen worden opgenomen, kunnen een som verdubbelen.
  • Als je onjuiste regels overslaat, verlies je records; onderzoek eerst extra velden.
  • Korte records kunnen worden ingelezen met ontbrekende waarden aan het einde.
  • Gebruik bij deze indelingen kopregels over meerdere rijen of expliciete grenzen voor vaste veldbreedtes.
2

Lees tekst correct en efficiënt in

Correcte tekst hangt af van de regel waarmee de bytes worden gedecodeerd en efficiënt inlezen hangt af van wat het programma in het geheugen bewaart. Je onderscheidt coderingsfouten van verminkte tekst, kiest op basis van aanwijzingen een tekencodering en behoudt tekens tijdens uitwisseling. Daarna verminder je het geheugengebruik bij grote bestanden door kolommen te selecteren, geschikte types te kiezen en gegevens in blokken te verwerken, waarbij je ook leert deelresultaten correct te combineren.

2.1 Hoe tekst als bytes wordt opgeslagen

Een bestand slaat bytes op, elk met een waarde van 0 tot en met 255. Een tekencodering bepaalt hoe tekens door die bytes worden weergegeven. Coderen zet Python-tekst om in bytes; decoderen zet bytes terug om in tekst. Dezelfde bytes kunnen volgens verschillende decoderingsregels verschillende tekens betekenen.

Tel tekens en bytes afzonderlijk
text = "café"
raw = text.encode("utf-8")
print(len(text))  # 4 characters
print(len(raw))   # 5 bytes
print(raw.decode("utf-8"))  # café

Het accent maakt hier geen tweede zichtbaar teken. De letter "é" heeft in UTF-8 twee bytes nodig, dus nemen vier tekens vijf bytes in. Het aantal bytes en het aantal tekens beantwoorden verschillende vragen.

ASCII definieert 128 tekens, waaronder Engelse basisletters, cijfers, leestekens en besturingscodes. Hun bytewaarden komen overeen in ASCII, UTF-8, Latin-1 en Windows-1252. Dit gedeelde begin verklaart waarom een voorbeeld met alleen Engelse tekst correct kan lijken, ook als de tekencodering verkeerd is ingesteld.

Herken de belangrijkste coderingsfamilies
TekencoderingWeergave van tekstHandige aanwijzing
UTF-8Eén tot vier bytes per Unicode-tekenASCII-letters gebruiken één byte; "é" gebruikt er twee
Latin-1Eén byte per teken in het beperkte repertoireElke bytewaarde kan worden gedecodeerd
Windows-1252Eén byte per ondersteund tekenBevat extra afdrukbare symbolen zoals "€"
UTF-16Meestal twee bytes per teken, vier voor andereDe bytevolgorde is van belang

UTF-8 geeft elk Unicode-teken weer en is de gebruikelijke keuze voor uitgewisselde tekst. Latin-1 en Windows-1252 geven een kleinere verzameling tekens weer. Ze komen overeen voor veel letters met accenten, maar verschillen in een deel van het bytebereik: Windows-1252 gebruikt byte 0x80 voor "€", waar Latin-1 een besturingsteken heeft. Het zijn geen uitwisselbare namen voor één codering.

Lees bytevolgordemarkeringen correct

Een bytevolgordemarkering, of BOM, is een markering aan het begin van sommige bestanden. UTF-16 kan beginnen met FF FE voor de little-endianvolgorde of FE FF voor de big-endianvolgorde. encoding="utf-16" gebruikt de BOM om de volgorde te kiezen. Zonder BOM geef je "utf-16-le" of "utf-16-be" op, afhankelijk van de bron.

Een UTF-8-BOM is EF BB BF. open(..., encoding="utf-8-sig") van Python verwijdert die tijdens het decoderen. Gewoon "utf-8" in open() behoudt die als \ufeff, wat onverwacht deel kan worden van de eerste kolomnaam. De CSV-leesfunctie van pandas verwerkt een UTF-8-BOM aan het begin ook, maar met utf-8-sig maak je de bedoelde bestandsconventie duidelijk.

Geef de tekencodering expliciet op
with open("notes.txt", encoding="utf-8") as f:
    text = f.read()

De standaardwaarde van open() hangt af van de Python-versie en de UTF-8-modus. Python 3.11–3.14 kan de codering van de landinstellingen gebruiken; Python 3.15 schakelt standaard de UTF-8-modus in, die je kunt uitschakelen. Met een expliciete codering blijft het script op verschillende computers afgestemd op het werkelijke bestandsformaat. Ook voorkom je dat een platformstandaard ongemerkt verandert hoe dezelfde bytes worden gelezen.

Belangrijkste punten

  • Coderen zet tekst om in bytes; decoderen zet bytes om in tekst.
  • Het aantal tekens en het aantal bytes kunnen verschillen.
  • Voorbeelden met alleen ASCII-tekens kunnen een verkeerde coderingskeuze verhullen.
  • Latin-1 en Windows-1252 verschillen, hoewel ze veel tekens delen.
  • Gebruik informatie over de BOM en bytevolgorde bij het lezen van UTF-16.
  • Geef de bedoelde tekencodering expliciet door aan open().

2.2 Vind de oorzaak van verminkte tekst

Een verkeerde tekencodering kan duidelijk misgaan met een UnicodeDecodeError, of ongemerkt leesbaar ogende onzin opleveren: mojibake. Beide problemen beginnen bij het interpreteren van bytes volgens de verkeerde regel. Bewaar het oorspronkelijke bestand zodat je het opnieuw kunt decoderen.

Stel de oorzaak van een fout vast

Een als Windows-1252 opgeslagen CSV bevat plaatsnamen waaronder "Zürich" en "Málaga". Als je het als UTF-8 leest, kan het misgaan bij byte 0xfc, die in Windows-1252 voor "ü" wordt gebruikt. Zodra de exportinstellingen van de bron de codering bevestigen, lees je het bestand zo in:

df = pd.read_csv("cities.csv", encoding="cp1252")
print(df["city"].head())

Inspecteer namen met accenten of symbolen. Een voorbeeld dat volledig uit ASCII-tekens bestaat, kan deze coderingen niet onderscheiden. Een bepaalde ongeldige byte in UTF-8 wijst op een mogelijke oudere codering, maar bepaalt niet eenduidig welke oudere codering het bestand heeft voortgebracht.

Herken een fout zonder foutmelding

Bytes in UTF-8 die als Windows-1252 worden gedecodeerd, kunnen "café" veranderen in "café" en "São Paulo" in "São Paulo". De leesfunctie heeft met succes tekens geproduceerd, maar het zijn de verkeerde tekens. Lees de oorspronkelijke bytes opnieuw met UTF-8:

df = pd.read_csv("cities.csv", encoding="utf-8")

Met zoeken en vervangen herstel je telkens één zichtbaar symptoom en kun je andere beschadigde letters missen. Ook loop je het risico een werkelijk voorkomend teken te veranderen. Correct decoderen pakt de oorzaak voor het hele bestand aan.

Verzamel aanwijzingen voor de tekencodering

Begin bij de documentatie of exportinstellingen van de leverancier. Inspecteer zo nodig een klein voorbeeld van de bytes:

with open("cities.csv", "rb") as f:
    sample = f.read(200)
print(sample)

De binaire modus behoudt de bytes zonder ze te decoderen. Een BOM kan een directe aanwijzing geven. Een detectieprogramma zoals charset-normalizer schat een waarschijnlijke codering, maar een kort voorbeeld kan bij meerdere mogelijkheden passen. Controleer het resultaat aan de hand van bekende namen met accenten en symbolen.

Latin-1 kent aan elke byte een teken toe en kan daardoor elke bytereeks zonder fout decoderen. Dat dit lukt, zegt op zichzelf niets over de juistheid van de tekens. Windows-1252 gebruikt ook tekens van één byte, maar laat enkele bytewaarden ongedefinieerd en kan een decoderingsfout geven.

Gooi de aanwijzingen niet weg

encoding_errors="replace" vervangt bytes die de decoder niet kan lezen door "�". encoding_errors="ignore" verwijdert ze. Deze opties kunnen helpen om beschadigde invoer te inspecteren, maar ze leiden tot informatieverlies en vervangen het zoeken naar de juiste codering niet. Een naam die is veranderd in "Zrich" kan een overeenkomst net zo goed verhinderen als zichtbaar verminkte tekst.

Voor uitvoer verwerkt UTF-8 de grootste verscheidenheid aan tekens. Sommige spreadsheetprogramma's herkennen die codering betrouwbaarder als er een BOM aanwezig is:

df.to_csv("cities_export.csv", index=False, encoding="utf-8-sig")

Open de export opnieuw in het ontvangende programma en inspecteer dezelfde waarden met accenten. Het doel is correcte tekst aan beide kanten van de uitwisseling.

Belangrijkste punten

  • Controleer zowel decoderingsfouten als zichtbaar verminkte tekens.
  • Lees de oorspronkelijke bytes opnieuw met de juiste tekencodering om mojibake te herstellen.
  • Als decoderen met Latin-1 lukt, staat daarmee niet vast dat de tekst correct is.
  • De modi voor vervangen en negeren laten tekeninformatie verloren gaan.
  • Gebruik UTF-8 met een BOM als het ontvangende spreadsheetprogramma die nodig heeft.

2.3 Lees grote bestanden zonder elke rij te bewaren

De grootte van een bestand op schijf is niet gelijk aan de hoeveelheid geheugen die het nodig heeft. pandas bouwt arrays, indexen en tekstwaarden op in het geheugen en hun types beïnvloeden de benodigde ruimte. Meet met df.memory_usage(deep=True) of df.info(memory_usage="deep") voordat je beslist hoe je meer gegevens inleest.

Verminder de gegevens die je in het geheugen inleest

Lees geselecteerde kolommen met usecols, inspecteer een eerste steekproef met nrows en kies geschikte types met dtype. Een categorie kan herhaalde regionamen compact opslaan. float32 gebruikt minder ruimte dan float64, maar biedt ongeveer zeven significante cijfers, dus kies dit type alleen als die precisie bij de metingen past. Een kleine voorvertoning helpt types te herkennen, maar bewijst niet dat elke latere rij hetzelfde patroon volgt.

Verwerk gegevensblokken en bewaar een klein resultaat

chunksize verandert de teruggegeven waarde van een DataFrame in een iterator van DataFrames. Voor een totaal en een gemiddelde:

total = 0.0
count = 0
with pd.read_csv(
    "measurements.csv",
    usecols=["amount"],
    chunksize=100_000
) as reader:
    for chunk in reader:
        total += chunk["amount"].sum()
        count += chunk["amount"].count()
mean = total / count if count else float("nan")

De lus houdt een cumulatieve som en het aantal aanwezige waarden bij. Elk gegevensblok kan na gebruik worden vrijgegeven. Als je alle blokken in een lijst verzamelt en later aaneenvoegt, heb je opnieuw evenveel geheugen nodig als voor het geheel; blokgewijze verwerking bespaart alleen geheugen als het werk een kleiner resultaat bewaart of verwerkte delen wegschrijft.

Een bestand van tien rijen dat je met chunksize=4 inleest, levert delen van 4, 4 en 2 rijen op. Bij bedragen van 1 tot en met 10 met afwisselend de regio's N, S en E tel je de regionale deeltotalen op tot N 22, S 15 en E 18. Samen is dat 55.

Combineer de juiste grootheden

Sommen en aantallen kun je optellen. Combineer minima door het kleinste deelminimum te nemen; combineer maxima door het grootste deelmaximum te nemen. Gemiddelden hebben gewichten nodig, omdat blokken verschillende aantallen geldige waarnemingen kunnen bevatten.

Voor de waarden 1, 2 en 3 in het ene blok en 10 in het andere zijn de blokgemiddelden 2 en 10. Het gemiddelde van die gemiddelden is 6, waarbij het blok met één waarde even zwaar meetelt als het blok met drie waarden. Tel in plaats daarvan de sommen en aantallen op: een totaal van 16 over vier waarnemingen geeft een gemiddelde van 4. Blokmedianen bevatten niet genoeg informatie om een totale mediaan te reconstrueren.

Lees gecomprimeerde bestanden rechtstreeks in

read_csv leidt compressie normaal af uit herkende extensies zoals .gz, .bz2, .zip, .xz en .zst. Tijdens het inlezen wordt gedecomprimeerd:

with pd.read_csv("measurements.csv.gz", chunksize=100_000) as reader:
    for chunk in reader:
        print(len(chunk))

Een ZIP-archief dat je zo gebruikt, moet precies één gegevensbestand bevatten. df.to_csv("out.csv.gz", index=False) schrijft met gzip gecomprimeerde CSV. Compressie vermindert de schijfruimte en de hoeveelheid over te dragen gegevens, maar neemt het geheugengebruik van de gedecodeerde tabel niet weg. Voor herhaalde analyse voorkomt het converteren van een gecontroleerde dataset naar Parquet ook dat tekst steeds opnieuw moet worden ingelezen en worden de opgeslagen kolomtypes hersteld.

Belangrijkste punten

  • Meet het geheugengebruik inclusief objectinhoud en lees alleen benodigde kolommen in.
  • Leesfuncties met gegevensblokken leveren DataFrames op; bewaar kleinere resultaten om geheugen te besparen.
  • Combineer sommen en aantallen aanwezige waarden voordat je een totaalgemiddelde berekent.
  • Blokmedianen kunnen niet tot de totale mediaan worden gecombineerd.
  • Gecomprimeerde tekst wordt tijdens het inlezen gedecomprimeerd; een ZIP heeft één gegevensbestand nodig.
  • Parquet is geschikt voor datasets die herhaaldelijk worden ingelezen.
3

Werk met Excel-werkmappen

Werkmappen combineren gegevens met een presentatie voor mensen: meerdere werkbladen, titels, formules, samengevoegde labels en weergaveopmaak. Je zoekt een tabel binnen die indeling en maakt onderscheid tussen opgeslagen waarden en wat een cel weergeeft. Daarna schrijf je rapporten met één of meer werkbladen, bepaal je hoe een bestaande werkmap wordt bijgewerkt en controleer je of de opgeslagen werkbladen de bedoelde rijen en waarden bevatten.

3.1 Zoek en lees de tabel op een werkblad

Een Excel-werkmap kan meerdere werkbladen, titels en berekende totalen bevatten. Cellen hebben opgeslagen waarden en types, maar ook weergaveopmaak. Om een werkblad in te lezen, zoek je de gegevenstabel en begrijp je welke onderdelen van de werkmap DataFrame-waarden worden.

Kies het werkblad en de grenzen
df = pd.read_excel(
    "quarterly.xlsx",
    sheet_name="Q1",
    skiprows=2,
    usecols="A:C",
    nrows=2
)

Stel dat rij 1 een samengevoegde titel is, rij 2 leeg is, rij 3 region, date en sales bevat en rijen 4–5 de waarnemingen bevatten. skiprows=2 maakt van rij 3 de kopregel; nrows=2 stopt vóór het totaal in rij 6. Voor North 1200 en South 950 tellen de twee waarnemingen op tot 2150. Als je een opgeslagen totaal van 2150 als derde waarneming opneemt, verdubbelt dat bedrag.

Excel toont rijnummers vanaf 1; rijposities in pandas beginnen bij 0. Ook header=2 selecteert Excel-rij 3 als kopregel. usecols="A,C,E:F" selecteert afzonderlijke kolommen en een bereik. De standaardinstelling sheet_name=0 leest het eerste werkblad; een naam selecteert een specifiek werkblad en sheet_name=1 selecteert het tweede.

sheet_name=None geeft een dictionary terug die werkbladnamen aan DataFrames koppelt. Selecteer een sleutel of doorloop .items() in een lus; de dictionary zelf is niet één DataFrame. Voor meerdere leesbewerkingen uit één werkmap:

with pd.ExcelFile("quarterly.xlsx") as xf:
    print(xf.sheet_names)
    q1 = pd.read_excel(xf, sheet_name="Q1")
Weet wat de cel werkelijk opslaat

Een percentage dat wordt weergegeven als "15%" slaat 0,15 op. Een getal dat met vijf cijfers wordt weergegeven, kan 2139 opslaan, ook al toont het scherm "02139". Geen enkele inleesoptie kan een nul terughalen die alleen in de opmaak bestaat. Sla identificatiecodes als tekst op in de werkmap en geef bij het inlezen ook dtype={"zip": str} door; anders kan pandas zelfs uit tekstcellen met alleen cijfers gehele getallen afleiden.

De numerieke precisie van Excel is beperkt tot 15 significante cijfers. Een identificatiecode van 16 cijfers die als getal is ingevoerd, kan al beschadigd zijn voordat Python die inleest. Sla zulke waarden op als tekst. Een werkblad heeft maximaal 1.048.576 rijen en 16.384 kolommen, dus een zeer grote dataset heeft een ander formaat nodig.

Ga zorgvuldig om met formules en samengevoegde cellen

pandas berekent geen formules. Het leest opgeslagen resultaten uit de werkmap. Een spreadsheetprogramma kan actuele resultaten opslaan; een door een script gemaakt bestand kan ontbrekende, voorlopige of verouderde opgeslagen resultaten bevatten. openpyxl berekent geen resultaat en XlsxWriter schrijft normaal een nul als plaatsaanduiding, tenzij een waarde wordt opgegeven. Bereken belangrijke waarden opnieuw in pandas of open en sla de werkmap op in een spreadsheetprogramma voordat je op de opgeslagen totalen vertrouwt.

Alleen de cel linksboven in een samengevoegd celbereik slaat het label op. Een samengevoegd landlabel kan daardoor lege waarden in de rijen eronder achterlaten. Als de indeling bevestigt dat het label voor die rijen geldt, vult df["country"] = df["country"].ffill() het naar beneden aan. Inspecteer de tabelgrens voordat je aanvult.

Voor het inlezen is een Excel-bibliotheek nodig. openpyxl verwerkt .xlsx en .xlsm; xlrd verwerkt .xls, pyxlsb verwerkt .xlsb, odf verwerkt .ods en calamine ondersteunt meerdere spreadsheetformaten. Een ontbrekende bibliotheek geeft een ImportError met de naam van de benodigde afhankelijkheid. Kleuren, opmerkingen en andere vormgeving worden niet als DataFrame-gegevens ingelezen.

Belangrijkste punten

  • Selecteer het werkblad, de kopregel, kolommen en rijen met waarnemingen expliciet.
  • sheet_name=None geeft een dictionary met DataFrames terug.
  • Opgeslagen waarden kunnen verschillen van weergegeven percentages of identificatiecodes met voorloopnullen.
  • pandas berekent geen formules; de opgeslagen resultaten kunnen verouderd zijn of ontbreken.
  • Samengevoegde labels staan in de cel linksboven.
  • Sla lange identificatiecodes als tekst op voordat Excel ze kan afronden.
  • Installeer een leesbibliotheek die geschikt is voor het werkmapformaat.

3.2 Schrijf één werkmap met meerdere werkbladen

Excel is handig wanneer mensen een rapport in een spreadsheetprogramma moeten openen en inspecteren. Een DataFrame kan één werkblad worden, of meerdere DataFrames kunnen een werkmap delen. Kies vóór het schrijven het doelpad en de werkbladnamen, zodat elke tabel op de bedoelde plaats terechtkomt.

Schrijf één of meerdere tabellen
weather.to_excel(
    "weather.xlsx",
    sheet_name="Weather",
    index=False
)

index=False houdt de standaardrijnummers buiten het werkblad. Zonder die optie verschijnen ze als een extra eerste kolom en kunnen ze bij later inlezen terugkomen als "Unnamed: 0". Behoud een index alleen als die betekenisvolle labels bevat die in het rapport thuishoren.

Een to_excel-aanroep met een pad schrijft een werkmap op dat pad en vervangt een bestaand bestand. Als je de aanroep één keer voor Weather en daarna voor Counts op hetzelfde pad uitvoert, blijft mogelijk alleen de tweede tabel over. Gebruik één schrijver voor beide:

with pd.ExcelWriter("report.xlsx") as writer:
    weather.to_excel(writer, sheet_name="Weather", index=False)
    counts.to_excel(writer, sheet_name="Counts", index=False)

De contextmanager sluit en voltooit de werkmap wanneer het blok eindigt. Als je die met pd.read_excel("report.xlsx", sheet_name=None) inleest, krijg je een dictionary met beide werkbladnamen. Voor het schrijven van .xlsx is openpyxl of XlsxWriter nodig.

Werk een werkblad in een bestaande werkmap bij

Gebruik een schrijver in toevoegmodus om één werkblad te vervangen en de andere te behouden:

with pd.ExcelWriter(
    "report.xlsx",
    mode="a",
    engine="openpyxl",
    if_sheet_exists="replace"
) as writer:
    counts.to_excel(writer, sheet_name="Counts", index=False)

if_sheet_exists bepaalt wat er bij een naamconflict gebeurt. "error" stopt, "new" maakt een ander werkblad, "replace" vervangt dat werkblad en "overlay" schrijft in de bestaande cellen. Bij schrijven over een bestaand werkblad worden oude cellen buiten de nieuwe tabel niet gewist, zodat een kortere update oude rijen kan achterlaten. Bepaal of het rapport een volledige vervanging van het werkblad nodig heeft of zorgvuldig gepositioneerde nieuwe inhoud over bestaande cellen.

Maak de uitvoer gemakkelijk opnieuw te openen

Werkbladnamen mogen maximaal 31 tekens bevatten en mogen geen :, \, /, ?, *, [ of ] bevatten. Een korte naam zoals "Q1 Summary" werkt; "Q1/Q2" bevat een verboden schuine streep. Sommige bibliotheken waarschuwen bij een te lange naam in plaats van te stoppen, dus kies zelf geschikte namen.

startrow en startcol positioneren een tabel met verschuivingen die bij nul beginnen. na_rep geeft ontbrekende waarden een zichtbare markering. float_format="%.2f" rondt geschreven getallen af en autofilter=True voegt in pandas 3 filterknoppen aan de kopregel toe. Datum-tijdkolommen worden als Excel-datums geschreven.

Afronden bij de uitvoer verandert opgeslagen getallen, niet alleen hun weergave. Bewaar een analysebestand met volledige precisie apart wanneer een afgerond rapport nodig is. Open de werkmap opnieuw en controleer de lijst met werkbladen, tabelafmetingen en representatieve waarden. Excel inlezen is relatief langzaam en opslaan en opnieuw inlezen kan pandas-datatypes veranderen, dus gebruik Parquet voor tussentabellen in de analyse wanneer behoud van types belangrijk is.

Belangrijkste punten

  • Gebruik één ExcelWriter om meerdere tabellen in een nieuwe werkmap te plaatsen.
  • Een schrijfbewerking met een pad vervangt een bestaande werkmap.
  • Toevoegmodus en if_sheet_exists bepalen hoe bestaande werkbladen worden bijgewerkt.
  • Kies geldige werkbladnamen en controleer de opnieuw geopende werkmap.
4

Haal gegevens op uit JSON-bestanden en web-API's

JSON en web-API's leveren records in vormen die niet altijd bij een tabel passen. Je leest en schrijft JSON, kiest een passende tabelindeling en zet geneste objecten of lijsten om in een platte tabel, terwijl je bijhoudt wat elke rij voorstelt. Ook controleer je HTTP-antwoorden, doorloop je pagina's en verwerk je toegangsgegevens en verzoeklimieten, zodat de resulterende dataset de records bevat die je wilde verzamelen.

4.1 JSON-objecten, tabellen en records per regel

JSON slaat geneste gegevens op als tekst. Objecten bevatten naam-waardeparen, arrays bevatten geordende waarden en tekenreeksen gebruiken dubbele aanhalingstekens. De overige waarden zijn getallen, true, false en null. De module json van Python zet deze syntaxis om in Python-objecten voordat je een tabel maakt.

Lees en schrijf geldige JSON
import json

text = '{"station":"Oslo","active":true,"temp_c":[3.5,null,4.0]}'
data = json.loads(text)
print(data["active"])   # True
print(data["temp_c"])   # [3.5, None, 4.0]

Objecten worden dictionaries, arrays worden lijsten en null wordt None. json.loads leest een tekenreeks in; json.load leest een open bestand. De schrijffuncties werken in de omgekeerde richting: json.dumps geeft tekst terug en json.dump schrijft naar een bestand.

with open("station.json", "w", encoding="utf-8") as f:
    json.dump(data, f, ensure_ascii=False, indent=2)

ensure_ascii=False laat tekens zoals "ü" leesbaar. De standaardinstelling kan hetzelfde teken schrijven als \u00fc; beide vormen stellen dezelfde tekenreeks voor. Een afgedrukte Python-dictionary is geen JSON: enkele aanhalingstekens, True, None en afsluitende komma's zijn ongeldige JSON-syntaxis. Standaard-JSON heeft ook geen NaN. De encoder van Python staat dit standaard toe, maar allow_nan=False wijst het af; pandas schrijft ontbrekende waarden als null.

Stem af op de tabelindeling

Een JSON-tabel heeft een oriëntatie nodig: de indeling van rijen, labels en waarden. orient="records" geeft één object per rij:

[{"city":"Lyon","temp_c":21.5},{"city":"Osaka","temp_c":null}]

De standaardoriëntatie voor DataFrames, "columns", groepeert waarden onder kolomnamen en daarna rijlabels. "split" slaat kolommen, index en gegevens afzonderlijk op. Geef een oriëntatie op die bij het ontvangende programma past in plaats van aan te nemen dat elke JSON-tabel dezelfde vorm heeft.

from io import StringIO
import pandas as pd

df = pd.read_json(
    StringIO('[{"code":"0042","amount":9.5}]'),
    orient="records",
    dtype={"code": str}
)

In pandas 3 is een gewone tekenreeks die aan read_json wordt doorgegeven een pad, dus plaats echte JSON-tekst in StringIO. Zelfs uit JSON-tekenreeksen met alleen cijfers kunnen getallen worden afgeleid; het expliciete datatype behoudt "0042".

Gebruik JSON Lines voor opeenvolgende records

JSON Lines heeft één volledig JSON-object per regel, zonder omringende array of komma's tussen records:

{"id":1,"amount":9.5}
{"id":2,"amount":12.0}

Lees het in met pd.read_json(path, lines=True) en schrijf het met df.to_json(path, orient="records", lines=True). De opties chunksize en nrows van de leesfunctie vereisen lines=True, waardoor afzonderlijke records na elkaar beschikbaar komen.

Stel bij het exporteren van datums date_format="iso" in voor leesbare ISO-tijdstempels. pandas 3.1 gebruikt voor gewone DataFrame-uitvoer naar JSON nog standaard milliseconden sinds het epochtijdstip, maar die standaardinstelling verandert. Expliciete datumuitvoer voorkomt dat een leesprogramma moet raden wat een groot geheel getal voorstelt.

Belangrijkste punten

  • JSON-syntaxis verschilt van een afgedrukte Python-dictionary.
  • load en dump gebruiken bestanden; loads en dumps gebruiken tekenreeksen.
  • Kies een oriëntatie die bij de tabelindeling past.
  • Plaats JSON-tekst voor read_json in StringIO en behoud de types van identificatiecodes.
  • JSON Lines gebruikt één object per regel en ondersteunt blokgewijs inlezen.
  • Gebruik ISO-datumuitvoer voor leesbare uitgewisselde tijdstempels.

4.2 Kies wat één rij geneste gegevens voorstelt

Geneste JSON kan een bestelling, de klant en meerdere artikelen in één object beschrijven. Bepaal vóór het omzetten naar een platte tabel het detailniveau per rij: wat één rij voorstelt. Dat detailniveau bepaalt welke bedragen je kunt optellen.

Zet eerst geneste objecten om naar een platte tabel

Bekijk twee bestellingen. Bestelling 501 hoort bij Ana en heeft de artikelen A1 (aantal 2, prijs 3,5) en B7 (aantal 1, prijs 10,0). Bestelling 502 hoort bij Ben en heeft A1 (aantal 4, prijs 3,5). De klantgegevens zijn geneste objecten en de artikelen zijn lijsten.

orders = [
    {"order_id": 501,
     "customer": {"name": "Ana", "country": "PT"},
     "items": [{"sku": "A1", "qty": 2, "price": 3.5},
               {"sku": "B7", "qty": 1, "price": 10.0}]},
    {"order_id": 502,
     "customer": {"name": "Ben", "country": "CA"},
     "items": [{"sku": "A1", "qty": 4, "price": 3.5}]}
]
order_rows = pd.json_normalize(orders)

Dit levert twee rijen en vier kolommen op: order_id, items, customer.name en customer.country. De geneste klantvelden worden kolommen met namen waarin punten staan. De artikellijsten blijven in cellen; normalisatie zet niet automatisch elke lijst om in rijen.

Vouw een lijst uit met informatie van het bovenliggende object
items = pd.json_normalize(
    orders,
    record_path="items",
    meta=["order_id", ["customer", "name"]]
)

record_path kiest de lijst waarvan de elementen rijen worden. meta kopieert waarden van het bovenliggende object naar elke rij, met een lijst van sleutels voor een genest pad. Het resultaat heeft drie artikelrijen: twee voor Ana's bestelling en één voor die van Ben. De omzet is aantal maal prijs: 7,0; 10,0 en 14,0, samen 31,0.

Als de verzendkosten op bestelniveau 4,00 zijn, worden ze op beide artikelrijen van bestelling 501 herhaald. Als je die herhaalde kosten optelt, krijg je 8,00 voor één bestelling. Bewaar bedragen op bestelniveau in een aparte bestellingentabel als je ook een artikelentabel nodig hebt; behoud order_id om ze te koppelen.

Bepaal namen en verwerk ontbrekende velden

sep="_" maakt namen zoals customer_name. record_prefix="item_" onderscheidt artikelvelden van velden met dezelfde naam in het bovenliggende object. max_level=0 laat geneste dictionaries intact.

Een gewoon genest veld dat bij één record ontbreekt, wordt een ontbrekende waarde in de uitvoerkolom. Een ontbrekend veld dat via meta wordt opgevraagd, geeft standaard KeyError; errors="ignore" staat ontbrekende metadata toe en vult die met NaN. Een ontbrekende lijst die door record_path wordt aangeduid, moet nog steeds worden gecorrigeerd.

Haal API-antwoorden uit hun omhulsel vóór het omzetten

Een API kan een omsluitend object met count, next en results teruggeven. Geef data["results"] door aan pd.json_normalize om de records om te zetten naar een platte tabel. Als je het omsluitende object zelf doorgeeft, wordt één omhullend object genormaliseerd en blijft de resultatenlijst in een cel staan. Houd pagineringsmetadata beschikbaar om latere pagina's op te halen, maar maak de analysetabel uit de werkelijke recordlijst.

Belangrijkste punten

  • Bepaal of elke rij een bovenliggend object of een lijstelement voorstelt.
  • json_normalize vouwt geneste objecten uit; record_path vouwt een gekozen lijst uit.
  • meta herhaalt velden van het bovenliggende object op elke onderliggende rij.
  • Bedragen op het bovenliggende niveau kunnen na het uitvouwen van een lijst dubbel worden geteld.
  • Zet de records binnen een omsluitend API-object om naar een platte tabel, niet het omhulsel.

4.3 Vraag een volledig en gecontroleerd API-resultaat op

Een web-API ontvangt een HTTP-verzoek bij een eindpunt en geeft een statuscode, headers en een berichtinhoud terug. Veel API's gebruiken JSON als berichtinhoud, maar een succesvol ontvangen antwoord betekent niet dat het de gegevens of alle benodigde records bevat.

Verstuur parameters en controleer het antwoord
import requests

resp = requests.get(
    url,
    params={"city": "Lima", "units": "metric"},
    timeout=10
)
resp.raise_for_status()
data = resp.json()
df = pd.json_normalize(data["results"])

Hier is url het gedocumenteerde eindpunt van de API. params codeert de querytekenreeks, zodat spaties en speciale tekens in waarden correct worden verwerkt. Requests heeft standaard geen wachttijdlimiet. Eén waarde voor de wachttijdlimiet bepaalt de wachttijd voor verbinden en lezen; het is geen uiterste tijd voor het downloaden van het volledige antwoord.

Roep raise_for_status() aan voordat je de berichtinhoud gebruikt. Bij 4xx- en 5xx-antwoorden geeft de methode een HTTP-fout. Een JSON-foutmelding kan met succes worden ingelezen en toch een mislukt verzoek beschrijven; omgekeerd kan een 200-antwoord tekst bevatten die geen JSON is, waardoor resp.json() mislukt. Inspecteer resp.text als het formaat van het antwoord onverwacht is.

StatusBetekenis om te onderzoeken
200Verzoek geslaagd
400Verzoekgegevens zijn ongeldig
401Toegangsgegevens ontbreken of zijn ongeldig
403Toegang is verboden
404Opgevraagde bron is niet gevonden
429Te veel verzoeken in korte tijd
5xxFout aan de serverzijde
Houd toegangsgegevens apart

Gebruik de authenticatiemethode die de API documenteert. Lees voor een bearer-token een sleutel uit een omgevingsvariabele en stuur die in een header:

import os

key = os.environ["WEATHER_API_KEY"]
headers = {"Authorization": "Bearer " + key}

Houd sleutels buiten opgeslagen code en notebooks. Als een sleutel is gedeeld of aan versiebeheer is toegevoegd, trek die dan in en vervang die. Een sleutel geeft toegang; een getoonde waarde later verbergen maakt het bekend worden niet ongedaan.

Ga door totdat alle pagina's zijn ingelezen

Volg de gedocumenteerde methode van de API voor de volgende pagina, of die nu paginanummers, offsets of een URL voor de volgende pagina gebruikt. Verzamel de records van elke pagina en stop bij de opgegeven eindvoorwaarde. Een totaal van 230 records met 100 per pagina vereist pagina's van 100, 100 en 30. De eerste pagina kan volledig geldig zijn terwijl de dataset onvolledig is.

Vergelijk het verzamelde aantal met een gerapporteerd totaal als dat beschikbaar is. Houd je aan verzoeklimieten: 429 vraagt om wachten vóór een volgend verzoek en Retry-After kan de wachttijd opgeven. Die header kan seconden of een HTTP-datum bevatten. Sla ruwe antwoorden op voor reproduceerbare analyse en om te voorkomen dat je bij elke nieuwe uitvoering dezelfde gegevens downloadt.

Herken andere formaten voor webtabellen

pd.read_html(url) geeft een lijst met DataFrames terug, één voor elke passende HTML-tabel. match="Population" beperkt tabellen op basis van hun tekst. De functie heeft een afhankelijkheid voor het verwerken van HTML nodig, zoals lxml of BeautifulSoup met html5lib. pd.read_xml leest herhaalde XML-elementen als rijen met lxml of parser="etree". Controleer de voorwaarden van een site voordat je gegevens verzamelt en geef de voorkeur aan een officiële download of API als die beschikbaar is.

Belangrijkste punten

  • Verstuur querywaarden met params en stel een expliciete wachttijdlimiet in.
  • Controleer de HTTP-status voordat je de verwachte berichtinhoud verwerkt.
  • Bewaar sleutels in omgevingsvariabelen en vervang sleutels die bekend zijn geworden.
  • Volg de paginering tot het einde en controleer het verzamelde aantal.
  • Houd je aan verzoeklimieten en sla ruwe antwoorden op voor reproduceerbaarheid.
  • read_html geeft een lijst met tabellen terug; XML heeft een aparte leesfunctie.
5

Sla gegevens op in het juiste bestandsformaat

Bij het opslaan van een tabel kies je hoe die hierna wordt gebruikt. Een collega heeft misschien een leesbare CSV of werkmap nodig, terwijl je volgende analyse exacte types en volledige precisie vereist. Je bepaalt de CSV-uitvoer, vergelijkt veelgebruikte uitwisselingsformaten en binaire formaten en gebruikt Parquet voor tabellen met vastgelegde types. Ook selecteer je kolommen en partities tijdens het inlezen en houd je datasetbestanden consistent wanneer meer gegevens worden toegevoegd.

5.1 Schrijf CSV zonder onbedoelde extra gegevens

Een CSV-export moet de waarden behouden die de ontvanger nodig heeft en de gebruikte conventies duidelijk maken. Kies of de rij-index gegevens bevat, hoe ontbrekende waarden verschijnen en of de uitvoer bedoeld is voor precieze analyse of afgeronde weergave.

Kies wat een kolom wordt
df.to_csv("weather_processed.csv", index=False)

Standaard wordt de index geschreven. Voor een tabel met een gewone genummerde index voegt dit een naamloos eerste veld toe; een latere read_csv kan dat tonen als "Unnamed: 0". index=False laat die rijnummers weg. Als de index betekenisvolle labels bevat, behoud die dan en lees de index opnieuw in met index_col=0.

Ontbrekende waarden worden normaal lege velden. na_rep="NA" maakt ze zichtbaar, maar de ontvangende leesfunctie moet die markering correct interpreteren. In een stedentabel met Lyon op 21,5 °C en Osaka op 18,25 °C moet een ontbrekende neerslagwaarde voor Osaka onderscheiden blijven van nul neerslag.

Stem af op de tekstconventie van de ontvanger
df.to_csv(
    "weather_export.csv",
    index=False,
    sep=";",
    decimal=",",
    na_rep="NA",
    date_format="%Y-%m-%d",
    encoding="utf-8"
)

De opties voor het scheidingsteken en decimaalteken leveren waarden op zoals Lyon;21,5;0,0. ISO-datumuitvoer houdt dag en maand ondubbelzinnig. Gebruik encoding="utf-8-sig" als een ontvangend spreadsheetprogramma een BOM nodig heeft om UTF-8 te herkennen.

float_format="%.1f" schrijft één decimaal. De waarde 18,25 wordt bij deze opmaak "18.2" en de verloren precisie kan niet uit de CSV worden teruggehaald. Behoud volledige precisie voor analysegegevens; maak zo nodig een apart afgerond rapport.

Controleer wat behouden blijft bij opslaan en opnieuw inlezen

CSV slaat tekens op zonder metadata over pandas-datatypes. Bekijk vier kolommen: een identificatiecode "02139", een datum-tijdwaarde, een geordende categorische variabele A < B < C en gehele getallen met ondersteuning voor ontbrekende waarden en een ontbrekende waarde. Bij standaard inlezen van CSV kun je het gehele getal 2139, datumtekst, gewone categorielabels zonder hun volgorde en drijvendekommagetallen voor de tellingen terugkrijgen.

Als het inlezen slaagt, betekent dat dus niet noodzakelijk dat het oorspronkelijke DataFrame is hersteld. Bewaar de opties die nodig zijn om de gegevens te reconstrueren, waaronder tekstuele identificatiecodes, het inlezen van datums en markeringen voor ontbrekende waarden. Ook de categorievolgorde moet opnieuw worden gedefinieerd. Voor herhaalde analyse waarbij deze types belangrijk zijn, kan Parquet ze direct behouden.

Voeg records toe en bescherm ruwe invoer
df.to_csv(
    "daily_results.csv",
    mode="a",
    header=False,
    index=False
)

Dit voegt rijen toe aan een bestaand bestand. Houd de kolomvolgorde en conventies consistent met dat bestand. Met header=True schrijft een toevoeging nog een kopregel in het midden en kan de volgende leesfunctie die als record behandelen. Schrijf bij een nieuw bestand de kopregel één keer voordat je later rijen toevoegt.

Bewaar ontvangen of gedownloade bestanden ongewijzigd op een locatie voor ruwe gegevens. Schrijf afgeleide resultaten afzonderlijk onder beschrijvende namen. Controleer bij het opnieuw openen van een verwerkte export het aantal rijen, de kolommen, ontbrekende waarden en representatieve waarden, waaronder voorloopnullen en datums.

Belangrijkste punten

  • Laat een standaardrij-index weg met index=False.
  • Kies markeringen voor ontbrekende waarden, tekencodering en getalnotaties voor de ontvanger.
  • Afronden bij de uitvoer verwijdert precisie blijvend.
  • Bij opslaan als CSV en opnieuw inlezen zijn expliciete inleesopties nodig om types te herstellen.
  • Voeg rijen toe zonder herhaalde kopregels en houd ruwe bestanden ongewijzigd.

5.2 Kies een formaat voor het volgende gebruik

Het beste opslagformaat hangt af van wie de gegevens hierna leest en wat bij de uitwisseling behouden moet blijven. Een tabel voor een collega, een genest API-antwoord en een analysedataset met vastgelegde types hebben verschillende behoeften.

Vergelijk tekstuele en binaire opslag

Tekstformaten coderen zichtbare tekens. CSV is gemakkelijk te inspecteren en wordt breed ondersteund; JSON geeft geneste objecten en arrays op natuurlijke wijze weer. CSV heeft geen schema met kolomtypes en gewone JSON-waardetypes behouden niet elk pandas-datatype. Opnieuw inlezen vereist verwerking van de tekst en kan expliciete typekeuzes nodig maken.

Binaire formaten coderen gegevens zodat software die rechtstreeks kan lezen. Formaten zoals Parquet en Feather slaan een schema op dat kolommen en types beschrijft, waardoor het minder nodig is types opnieuw af te leiden. Ondersteuning voor types hangt nog steeds af van het formaat en de leesfunctie: willekeurige Python-objecten worden niet zomaar uitwisselbaar omdat het bestand binair is.

Een rijgeoriënteerde indeling houdt de velden van een record bij elkaar. Een kolomgeoriënteerde indeling houdt waarden uit dezelfde kolom bij elkaar. Bij analyse zijn vaak enkele kolommen van veel rijen nodig, zodat kolomgeoriënteerde leesfuncties onnodige kolommen kunnen overslaan. Vergelijkbare aangrenzende waarden laten zich ook goed comprimeren. Bestandsgrootte en snelheid hangen af van de gegevens; een compressieresultaat voor één tabel is geen vaste verhouding voor alle tabellen.

Kies voor elke taak een passend formaat
FormaatEen geschikte taakBelangrijkste aandachtspunt
CSVEenvoudige tabeluitwisselingTypes reconstrueren bij het inlezen
ExcelRapporten voor gebruik in spreadsheetsIndeling en spreadsheetlimieten zijn van belang
JSONGeneste records en webdienstenKies de object- en tabelindeling
ParquetOpgeslagen analysedatasetsTypes vastgelegd, kolomgeoriënteerd, gecomprimeerd en breed ondersteund
FeatherSnelle uitwisseling van DataFramesOpslag op basis van Arrow voor geschikte hulpmiddelen
pickleEigen tijdelijke Python-objectenVertrouwen en versiecompatibiliteit zijn van belang
HDF5Meerdere grote wetenschappelijke datasetsHiërarchische organisatie; PyTables voor pandas
DatabaseGedeelde query's en updatesVerbindingen, rechten en transacties

Parquet is een open formaat dat wordt gebruikt door pandas, R, Spark en DuckDB. Feather gebruikt Arrow IPC en is handig voor snelle uitwisseling tussen Python en R of tussen lokale stappen. to_feather en read_feather bieden die mogelijkheid. HDF5 groepeert meerdere datasets in één bestand; to_hdf van pandas vereist PyTables.

Begrijp de vertrouwensgrens van pickle

pickle kan Python-objecten buiten gewone tabellen opslaan, maar bij het inlezen kan code worden uitgevoerd. Lees nooit een pickle van een onbetrouwbare bron in. Gebruik het voor je eigen tijdelijke objecten en verwacht compatibiliteitsbeperkingen als Python en bibliotheken veranderen. Zo ondersteunt pandas 3 het lezen van pickles die met pandas-versies van vóór 1.0 zijn gemaakt niet meer.

Beslis op basis van het gewenste resultaat

Als een ontvanger een kleine tabel zonder speciale hulpmiddelen moet inspecteren, is CSV praktisch. Gebruik Excel als de ontvanger benoemde werkbladen nodig heeft. Kies Parquet als je identificatiecodes, categorieën en types met ondersteuning voor ontbrekende waarden tussen analysesessies moet behouden. Als meerdere programma's gedeelde records moeten bevragen en bijwerken, past een database beter dan kopieën van een bestand rondsturen. De formaatkeuze volgt uit het volgende gebruik, niet uit de extensie van de oorspronkelijke invoer.

Belangrijkste punten

  • Kies een formaat op basis van de ontvanger, gegevensstructuur en het vereiste behoud van types.
  • Kolomgeoriënteerde formaten ondersteunen het inlezen van geselecteerde kolommen en effectieve compressie.
  • Parquet is geschikt voor opgeslagen analysetabellen; Excel voor spreadsheetrapporten.
  • Feather ondersteunt snelle uitwisseling; HDF5 groepeert wetenschappelijke datasets.
  • Pickles uit onbetrouwbare bron kunnen bij het inlezen code uitvoeren.
  • Databases ondersteunen gedeelde query's en updates.

5.3 Bewaar tabellen met vastgelegde types in Parquet

Parquet slaat een tabel met de kolomtypes op in een open, kolomgeoriënteerd formaat. Dit is handig wanneer een gecontroleerd DataFrame herhaaldelijk wordt ingelezen of aan andere analysehulpmiddelen wordt doorgegeven. pandas gebruikt PyArrow voor de onderstaande voorbeelden.

Schrijf en controleer een tabel met vastgelegde types
df.to_parquet("sales.parquet", engine="pyarrow")
restored = pd.read_parquet("sales.parquet", engine="pyarrow")
print(restored.dtypes)

Een tekstuele identificatiecode "02139", een datum-tijdkolom, een geordende categorische variabele en gehele getallen met ondersteuning voor ontbrekende waarden kunnen bij deze opslag van pandas via PyArrow en terug naar pandas allemaal met hun types behouden blijven. Anders dan bij het inlezen van CSV hoeft pandas de functie van de identificatiecode niet te raden of de categorievolgorde opnieuw te maken. Inspecteer types en representatieve waarden wanneer je een nieuwe schrijf- of leesfunctie gaat gebruiken.

De standaardinstelling index=None slaat een RangeIndex compact op als metadata. Een andere index wordt als kolommen geschreven en bij het inlezen hersteld. Gebruik index=False als de index niet nodig is. Die keuze gaat over rijlabels, los van de gewone kolommen van de tabel.

Lees minder in en kies compressie
small = pd.read_parquet(
    "sales.parquet",
    columns=["zip", "amount"]
)

De leesfunctie kan alleen die kolommen uit de opslag ophalen. Dat verschilt van de volledige tabel inlezen en daarna selecteren: dan heb je de volledige leestijd al besteed. Kolomselectie is vooral handig voor brede tabellen.

Snappy is de standaardcompressiecodec. compression="zstd" of "gzip" kost vaak meer schrijfwerk maar levert kleinere bestanden op, terwijl compression=None ongecomprimeerde gegevens schrijft. Meet de afweging met representatieve gegevens; herhaalde labels en willekeurige metingen worden niet op dezelfde manier gecomprimeerd. Installeer PyArrow; de alternatieve fastparquet-engine is in pandas 3.1 verouderd.

Deel een dataset in partities in
df.to_parquet(
    "sales_dataset",
    engine="pyarrow",
    partition_cols=["year"],
    index=False
)
recent = pd.read_parquet(
    "sales_dataset",
    filters=[("year", "==", 2026)]
)

De bestemming is een map met submappen zoals year=2025 en year=2026. Als je de map inleest, wordt de dataset geladen; een filter kan niet-relevante partities overslaan. Bij deze indeling leidt PyArrow de waarden voor year af uit mapnamen en ontvangt pandas de partitiekolom doorgaans als categorische kolom.

Kies een partitiekolom met een kleine verzameling bruikbare waarden waarop je vaak filtert. Een unieke record-ID maakt duizenden kleine partities, wat meer werk voor bestanden en mappen oplevert. Een jaar of een kleine verzameling regio's biedt vaak een praktischere indeling.

Voeg gegevens toe zonder de dataset te beschadigen

Eén Parquet-bestand ondersteunt via pandas geen toevoeging van rijen zoals CSV. Schrijf nieuwe bestanden of partities naar de datasetmap, of lees, combineer en herschrijf één bestand. Bestanden in dezelfde dataset hebben compatibele gegevensschema's nodig. Als het ene bestand een code als tekst opslaat en het andere als geheel getal, kan het inlezen mislukken of kunnen waarden worden geconverteerd. Stel consistente datatypes in voordat je elk deel schrijft en controleer of een toegevoegde partitie geen overlappende kopieën van dezelfde records maakt.

Belangrijkste punten

  • Parquet behoudt ondersteunde kolomtypes bij gebruik van compatibele leesfuncties.
  • columns leest alleen benodigde kolommen; filters beperkt de gegevens tot passende waarden.
  • De opslag van de index wordt afzonderlijk van gewone kolommen bepaald.
  • Partitioneer op enkele waarden waarop je vaak filtert en vermijd kleine bestanden.
  • Voeg datasetbestanden met compatibele gegevensschema's toe; voeg geen bytes toe aan één bestand.
6

Lees gegevens uit SQL-databases en schrijf er gegevens naartoe

Bij het werken met databases maak je twee keuzes: welk resultaat je opvraagt en welke wijziging je opslaat. Je opent en sluit verbindingen, leest gegeven SQL-query's in pandas in en bindt veranderende waarden zonder de querystructuur te wijzigen. Daarna bepaal je de resultaattypes en blokgrootte, kies je een modus om naar een tabel te schrijven en controleer je het effect, waaronder het verschil tussen volledig opnieuw inlezen en herhaald toevoegen.

6.1 Open een databaseverbinding en lees een resultaat in

Een relationele database slaat records op in tabellen met benoemde kolommen. Een programma verstuurt een SQL-query via een verbinding en ontvangt een resultaat dat pandas kan omzetten in een DataFrame. De database kan alleen de benodigde gegevens selecteren voordat ze naar Python worden verstuurd.

Begin met een SQLite-bestand
import sqlite3
import pandas as pd

con = sqlite3.connect("shop.db")
try:
    df = pd.read_sql_query(
        "SELECT region, amount FROM sales", con
    )
finally:
    con.close()

SQLite werkt zonder afzonderlijke server en slaat een database op in een bestand. Bij het verbinden wordt het bestand aangemaakt als het niet bestaat, dus een verkeerd getypt pad kan een nieuwe, lege database openen in plaats van de bedoelde. ":memory:" maakt een tijdelijke database in het geheugen. De bovenstaande query geeft de kolommen region en amount uit een bestaande tabel sales terug; de kolomnamen van het resultaat worden DataFrame-labels.

Een with-blok van een SQLite-verbinding beheert een transactie, maar sluit de verbinding niet. Roep expliciet close() aan als je klaar bent. Een try/finally-blok sluit de verbinding ook als het inlezen een fout geeft.

Gebruik een engine voor een serverdatabase

SQLAlchemy biedt engines voor systemen zoals PostgreSQL, MySQL en SQL Server, met een bijbehorend geïnstalleerd stuurprogramma. Een verbindings-URL geeft het dialect, stuurprogramma, de server en database aan. Bewaar die URL in een omgevingsvariabele:

import os
from sqlalchemy import create_engine

engine = create_engine(os.environ["ANALYSIS_DB_URL"])
try:
    with engine.connect() as conn:
        df = pd.read_sql_query(
            "SELECT region, amount FROM sales", conn
        )
finally:
    engine.dispose()

De verbindingscontext geeft de verbinding terug aan de verbindingenpool van de engine. dispose() geeft de middelen in de pool vrij wanneer de engine niet meer nodig is. Gebruik voor analyse een account met alleen leesrechten en houd toegangsgegevens buiten notebooks en versiebeheer. Een engine-URL voor een lokaal SQLite-bestand kan "sqlite:///shop.db" zijn.

Kies de leesfunctie die bij de invoer past
LeesfunctieInvoer
read_sql_queryEen SQL-query en verbinding
read_sql_tableEen tabelnaam en SQLAlchemy-verbinding of -engine
read_sqlEen query of, bij ondersteunde verbindingen, een tabelnaam

Geef bij een gewone sqlite3-verbinding een volledige query door. pd.read_sql("sales", con) verstuurt sales als SQL en mislukt; gebruik in plaats daarvan pd.read_sql_query("SELECT * FROM sales", con). pandas ondersteunt SQLAlchemy-, ADBC- en SQLite-verbindingen; een willekeurige rechtstreekse verbinding via een stuurprogramma is geen ondersteund alternatief enkel omdat het stuurprogramma SQL kan uitvoeren.

Verplaats het resultaat dat je nodig hebt

Een query die geselecteerde rijen en kolommen teruggeeft, draagt minder gegevens over dan een hele tabel inlezen en het grootste deel in pandas weggooien. De gegeven query SELECT SUM(amount) AS total FROM sales geeft één aggregatiewaarde terug, met het label total. Het inlezen van een queryresultaat verandert de opgeslagen tabel niet. Controleer na het inlezen het aantal rijen en de types, net als bij een bestand; de gedeclareerde databasetypes en de teruggegeven pandas-types hangen samen maar zijn niet identiek.

Belangrijkste punten

  • SQLite is een lokale bestandsdatabase; serverdatabases hebben een verbinding en stuurprogramma nodig.
  • Gebruik volledige query's met een gewone SQLite-verbinding.
  • Laat een query de rijen en kolommen beperken die naar pandas worden overgedragen.
  • Houd toegangsgegevens apart en gebruik voor analyse alleen leestoegang.
  • Sluit SQLite-verbindingen en geef SQLAlchemy-middelen vrij.

6.2 Houd querywaarden gescheiden van SQL

Veranderende waarden horen in queryparameters. De SQL-instructie bepaalt de bewerking; gebonden parameters leveren de regio, grenswaarde of andere waarde die voor deze uitvoering wordt gebruikt. Zo blijft de querystructuur behouden, ook als een waarde een aanhalingsteken bevat.

Bind waarden met de syntaxis van de verbinding

Voor SQLite:

query = "SELECT region, amount, sold_on FROM sales WHERE amount > ? ORDER BY amount DESC"
df = pd.read_sql_query(query, con, params=(70,))

Voor de verkoopbedragen 120,0, 75,5, 60,0 en 210,0 geeft dit 210,0, 120,0 en 75,5 terug in aflopende volgorde. De tuple (70,) heeft één element; (70) is alleen het getal 70. SQLite accepteert ook benoemde plaatsaanduidingen, bijvoorbeeld WHERE region = :r met params={"r": "North"}.

De regels voor plaatsaanduidingen hangen af van de interface. psycopg gebruikt %s of %(name)s. Met SQLAlchemy plaats je een instructie in text en gebruik je benoemde parameters:

from sqlalchemy import text

query = text("SELECT region, amount FROM sales WHERE amount >= :m")
with engine.connect() as conn:
    df = pd.read_sql_query(query, conn, params={"m": 100})

Geef waarden door via params; gebruik geen Python-opmaak om ze in de instructie in te voegen.

Begrijp waartegen parametrisering beschermt

Stel dat code een voorwaarde bouwt met een f-string en de invoer "x' OR '1'='1". Als je die tussen aanhalingstekens plakt, verandert de voorwaarde in region = 'x' OR '1'='1', die op elke rij van toepassing is. Dit is SQL-injectie: een waarde is uitvoerbare querystructuur geworden.

Een gebonden parameter wordt als één waarde vergeleken, zodat dezelfde tekenreeks alleen overeenkomt met een regio die letterlijk die tekst heeft. Binden verwerkt ook gewone namen met apostroffen zonder dat je zelf escapes voor aanhalingstekens hoeft te maken. De regel geldt voor invoer uit bestanden én uit gebruikersformulieren.

Parameters vertegenwoordigen waarden, geen tabel- of kolomnamen. Een parameter op de plaats van een tabelnaam selecteert die tabel niet. Als een programma een variabele identificatie nodig heeft, kies die dan uit een vaste lijst die door de code wordt beheerd.

Bepaal de types in het resultaat

SQLite slaat datums vaak op als tekst. Vraag pandas om ze als datums in te lezen:

df = pd.read_sql_query(
    "SELECT sold_on, visits FROM observations", con,
    parse_dates=["sold_on"],
    dtype={"visits": "Int64"}
)

De datumkolom krijgt datum-tijdwaarden en een telling met SQL NULL gebruikt gehele getallen met ondersteuning voor ontbrekende waarden, in plaats van alleen daarvoor drijvendekommagetallen te worden. Inspecteer het resultaat om de conversie te controleren.

Onderscheid gegevensblokken van buffering door het stuurprogramma

chunksize=1000 geeft een iterator van DataFrames terug die elk maximaal 1.000 rijen bevatten. Een resultaat van vier rijen geeft met chunksize=3 delen van drie en één rij. Houd de verbinding open terwijl je ze verwerkt. Sommige databasestuurprogramma's bufferen nog steeds het hele resultaat voordat pandas blokken oplevert; een cursor aan de serverzijde of een streaminginstelling kan ook nodig zijn om het geheugenverbruik over het volledige verbindingstraject te beperken.

Belangrijkste punten

  • Bind veranderende waarden via params met de stijl voor plaatsaanduidingen van de interface.
  • Een positionele tuple met één waarde heeft een afsluitende komma nodig.
  • Parameters voorkomen dat een waarde de querystructuur verandert.
  • Kies variabele tabel- en kolomnamen uit een vaste, toegestane lijst.
  • Lees datums als datums in en vraag expliciet om resultaattypes voor gehele getallen met ondersteuning voor ontbrekende waarden.
  • De blokgrootte in pandas bepaalt niet hoe het stuurprogramma gegevens buffert.

6.3 Schrijf tabellen en controleer de bedoelde wijziging

to_sql maakt een databasetabel uit een DataFrame of schrijft rijen naar een bestaande tabel. De opties bepalen of bestaande gegevens behouden blijven, of de index een kolom wordt en hoe een groep schrijfbewerkingen wordt bevestigd.

Kies het gedrag bij een bestaande tabel
df.to_sql("sales", con, index=False)

De standaardinstelling if_exists="fail" stopt als sales al bestaat. Kies alleen een andere modus als het effect past bij de bedoelde invoer:

ModusGedrag bij bestaande tabel
failStoppen zonder gegevens in die tabel in te voegen
appendRijen toevoegen aan de bestaande inhoud
replaceDe tabel verwijderen en opnieuw maken
delete_rowsAlle rijen verwijderen, de tabel behouden en daarna invoegen

delete_rows is beschikbaar in pandas 3. Een tabel vervangen verwijdert de oude definitie, inclusief sleutels, indexen en beperkingen; ook databasespecifieke rechten kunnen worden beïnvloed. Rijen verwijderen behoudt de definitie, maar wist nog steeds elk bestaand record. Gebruik dit als je de tabel volledig opnieuw wilt vullen, niet als het DataFrame alleen een nieuwe groep records bevat.

Stel kolommen in en schrijf binnen een transactie

Standaard wordt de DataFrame-index als kolom geschreven. Een naamloze index wordt index; een benoemde index behoudt zijn naam. index_label geeft de index een expliciete naam en index=False sluit die uit. Als een ID al een gewone kolom is, voegt het schrijven van standaardrijnummers meestal geen bruikbare informatie toe.

Met SQLAlchemy kan dtype databasetypes kiezen:

from sqlalchemy import types

with engine.begin() as conn:
    df.to_sql(
        "sales", conn,
        if_exists="append",
        index=False,
        dtype={"sold_on": types.Date()},
        chunksize=1000
    )

engine.begin() bevestigt de transactie bij succesvolle afsluiting en draait die terug bij een uitzondering. Voor een bestaande tabel bepaalt het opgeslagen gegevensschema nog steeds welke waarden kunnen worden ingevoegd; dtype is geen opdracht om de kolommen opnieuw te ontwerpen. Transactiegaranties hangen ook af van de ondersteuning van de database voor de gebruikte bewerkingen. Toevoegen binnen een SQLAlchemy-transactie houdt de invoegbewerking van het voorbeeld bij elkaar.

chunksize groepeert rijen in partijen. method="multi" plaatst meerdere rijen in één INSERT-instructie waar dat wordt ondersteund. Dit kan de prestaties verbeteren of verslechteren, afhankelijk van de database en partijgrootte, dus meet dit met representatieve gegevens.

Controleer de groei, niet alleen de voltooiing
check = pd.read_sql_query("SELECT COUNT(*) AS n FROM sales", con)
print(check["n"].iloc[0])

Vergelijk voor een nieuwe of volledig opnieuw gevulde tabel het aantal met len(df). Vergelijk bij toevoegen de toename: een tabel met vier rijen die twee rijen erbij krijgt, moet er zes bevatten. Het aantal rijen dat to_sql teruggeeft, komt uit de rapportage van het stuurprogramma; controleer de opgeslagen gegevens rechtstreeks.

Als je toevoegen twee keer uitvoert, worden de records herhaald, tenzij de database duplicaten afwijst of het programma alleen nieuwe records selecteert. Bepaal voordat je de bewerking opnieuw uitvoert of het gaat om een tabel volledig opnieuw vullen of het toevoegen van nieuwe records. Een transactie voorkomt een gedeeltelijke invoer bij een fout; die maakt herhaald succesvol toevoegen niet uniek.

Belangrijkste punten

  • append voegt rijen toe; replace verwijdert de tabel; delete_rows behoudt de definitie.
  • Gebruik index=False, tenzij de index bij de opgeslagen gegevens hoort.
  • Gebruik een SQLAlchemy-transactie om een invoer als geheel te bevestigen of terug te draaien.
  • Controleer toevoegen aan de hand van de verwachte toename van opgeslagen rijen.
  • Een succesvolle toevoeging herhalen kan records dupliceren.
  • De prestaties van partijen en INSERT-instructies met meerdere rijen hangen af van de database.

Gegevens inlezen en opslaan: voorbeelden

6 Walkthroughs

1

Maak een betrouwbare tabel uit tekst

17 stappen
Werk van ruwe records naar een gecontroleerd DataFrame en kies kopregels, getalnotaties, types en rapportgrenzen.
  1. 1
    IntroductieLees de structuur vóór de waarden

    Een tekstexport laat belangrijke keuzes aan de lezer over. Een komma kan velden scheiden of binnen een naam tussen aanhalingstekens voorkomen; een getal kan een meting of een identificatiecode zijn.

    Je bepaalt eerst de records en kolommen, interpreteert daarna hun waarden en verwijdert ten slotte rapportmateriaal buiten de tabel. Inspecteer het resultaat na elke keuze, zodat succesvol inlezen geen gewijzigde gegevens verhult.

  2. 2
    VoorbeeldLees drie verkooprecords in

    Het verkoopbestand heeft een kopregel en drie waarnemingen:

    order_id,date,region,units,price
    1001,2026-03-02,North,3,4.50
    1002,2026-03-02,South,1,12.00
    1003,2026-03-03,North,2,7.25
    

    df = pd.read_csv("sales.csv") levert vorm (3, 5) op. units is een kolom met gehele getallen en price bevat drijvendekommagetallen. De tekenreeksen die op datums lijken, moeten nog als datums worden ingelezen.

  3. 3
    UitlegGeef elke inspectie een doel

    Gebruik head() om te controleren of velden onder de bedoelde namen staan, shape om afmetingen te vergelijken en dtypes om de interpretatie te inspecteren. info() voegt aantallen aanwezige waarden toe.

    Als een numerieke kolom tekst is, inspecteer dan ruwe waarden op markeringen of getalnotaties. Als een bestand niet wordt gevonden, controleer dan de huidige werkmap: kolomopties veranderen kan een relatief pad naar de verkeerde locatie niet herstellen.

  4. 4
    UitdagingBehoud de eerste waarneming

    Een bestand zonder kopregel begint met V12,South,6 en heeft 40 waarnemingen. Standaard inlezen geeft 39 rijen met die drie waarden als labels. Welke wijziging bij het inlezen behoudt alle waarnemingen en geeft bruikbare namen?

    ---reveal---

    Gebruik header=None, names=["site", "region", "units"]. Het eerste record blijft gegevens, dus de verwachte vorm is (40, 3). Als je vervangende namen opgeeft met header=0, wordt dat eerste record nog steeds gebruikt als kopregel.

  5. 5
    KernpuntAanhalingstekens bepalen de veldgrens

    Het record "Smith, Jane",Boston,10 heeft drie velden. De komma binnen de aanhalingstekens maakt deel uit van de naam. Een dubbel aanhalingsteken binnen een veld tussen aanhalingstekens stelt één letterlijk aanhalingsteken voor.

    Velden tussen aanhalingstekens kunnen ook een regeleinde bevatten. Laat read_csv records interpreteren: elke fysieke regel op komma's splitsen kan zowel onjuiste kolommen als onjuiste records maken.

  6. 6
    VoorbeeldHerken drie verschillende symbolen

    De productexport bevat Tea;3,50;1.200. Een puntkomma scheidt de velden, een komma markeert het decimale deel van de prijs en een punt groepeert de cijfers van het aantal.

    df = pd.read_csv(
        "products.csv", sep=";",
        decimal=",", thousands="."
    )
    

    De waarden worden prijs 3,5 en aantal 1200. De optie voor het scheidingsteken alleen legt de getalnotatie niet vast.

  7. 7
    UitdagingSpoor een onopgemerkte schaalfout op

    Een export met puntkomma's vermeldt dat aantallen hele eenheden zijn. Het ruwe aantal is "6.400", maar bij inlezen met alleen sep=";" krijg je 6,4. Welke getaloptie en verwachte waarde herstellen de interpretatie?

    ---reveal---

    Gebruik thousands="." om de punt als scheidingsteken voor duizendtallen te interpreteren. Dat levert 6400 op. De waarde 6,4 is numeriek geldig als de punt als decimaalteken wordt geïnterpreteerd, dus voor deze fout hoeft geen uitzondering op te treden. Vergelijk ingelezen waarden met de bron.

  8. 8
    TipStem de parser af op de benodigde opties

    De gebruikelijke C-parser verwerkt veelvoorkomende bestanden snel. De Python-parser ondersteunt detectie van scheidingstekens, algemene reguliere expressies als scheidingsteken en het overslaan van afsluitende rapportregels. sep=None kan een scheidingsteken detecteren, maar kan bij onregelmatige rapporten verkeerd kiezen.

    Geef een scheidingsteken dat je al kent op. Kies engine="python" als je skipfooter gebruikt; de PyArrow-parser heeft eigen beperkingen, waaronder het ontbreken van ondersteuning voor chunksize.

  9. 9
    VoorbeeldMaak markeringen voor ontbrekende waarden kolomspecifiek

    De scorewaarden zijn 88, "n/a", "-" en 999. De laatste twee zijn gedocumenteerde markeringen voor ontbrekende waarden.

    df = pd.read_csv(
        "scores.csv",
        na_values={"score": ["-", "999"]}
    )
    

    De score wordt 88,0 gevolgd door drie ontbrekende waarden. Beperk de regel tot score, zodat een geldige 999 in een andere kolom gegevens blijft. Een niet-opgegeven signaalwaarde kan totalen en gemiddelden vertekenen.

  10. 10
    UitlegBehoud codes en interpreteer datums

    Een identificatiecode zoals "00501" moet als tekst worden opgeslagen, terwijl tellingen met ontbrekende waarden "Int64" kunnen gebruiken. Ook datums hebben een eigen interpretatie nodig.

    df = pd.read_csv(
        "visits.csv",
        dtype={"code": str, "visits": "Int64"},
        parse_dates=["day"], date_format="%d/%m/%Y"
    )
    

    Het expliciete patroon maakt van "03/04/2026" 3 april. Inspecteer daarna de datatypes om te bevestigen dat de gevraagde conversie werkelijk heeft plaatsgevonden.

  11. 11
    UitdagingBehoud een echt label en een ontbrekende waarde

    In een CSV is zone "NA" een echt label. Een leeg veld voor visits betekent ontbrekend en de bekende tellingen zijn gehele getallen. Welke keuzes voor ontbrekende waarden en types behouden die betekenissen?

    ---reveal---

    Gebruik keep_default_na=False, na_values={"visits": [""]}, dtype={"visits": "Int64"}. Het zonelabel blijft behouden, terwijl lege bezoekvelden ontbrekende waarden in een kolom met gehele getallen worden. Als je de standaardmarkeringen ingeschakeld laat, wordt ook het echte label "NA" verwijderd.

  12. 12
    VoorbeeldZoek de tabel in het rapport

    Een rapport heeft drie regels vóór de kopregel, een #-commentaarregel in het midden en daarna waarnemingen gevolgd door een totaal en een bronvermelding.

    df = pd.read_csv(
        "report.csv", skiprows=3, comment="#",
        skipfooter=2, engine="python"
    )
    

    De titelregels, het commentaar en de afsluitende rapportregels worden uitgesloten. Als de waarnemingen voor januari optellen tot 218, zou het behouden van een totaalrij met 218 de kolomsom onjuist op 436 brengen.

  13. 13
    KernpuntNiet elk onjuist record geeft een fout

    Extra velden kunnen een fout voor een onjuist opgebouwde regel veroorzaken. Te weinig velden kunnen daarentegen ontbrekende waarden aan het einde opleveren: onder id,name,score wordt het record 2,Ben zonder score ingelezen.

    Als je onjuist opgebouwde records overslaat, verwijder je ook hun waarnemingen. Controleer aantallen rijen en ontbrekende waarden afzonderlijk en onderzoek een verkeerd scheidingsteken of een veld zonder benodigde aanhalingstekens voordat je besluit records te verwijderen.

  14. 14
    UitdagingHoud de posities uit elkaar

    Een export met vaste veldbreedtes kent posities 0–2 toe aan een code, 3–9 aan een naam en 10–14 aan een waarde. Welke colspecs passen bij die velden?

    ---reveal---

    Gebruik [(0, 3), (3, 10), (10, 15)]. Elk bereik omvat het begin en sluit het einde uit, wat breedtes van 3, 7 en 5 geeft. Als je eindpunten 2, 9 en 14 zou gebruiken, valt het laatste teken van elk veld weg omdat die eindpunten zijn uitgesloten.

  15. 15
    UitlegKies labels met niveaus of platte labels

    Als twee kopregels groepen en jaren beschrijven, maakt header=[0, 1] kolomlabels met twee niveaus. Een verkoopkolom kan dan worden aangeduid met ("sales", "2026").

    Als de analyse gewone platte namen nodig heeft, sla dan beide kopregels over en geef namen op zoals "region", "sales_2025" en "sales_2026". Controleer of geen van beide kopregels bij de waarnemingen is blijven staan.

  16. 16
    UitdagingCombineer keuzes voor indeling en waarden

    Een export heeft één titelregel en daarna de kopregel code;amount;day. Een record is 00018;2.100,50;11/12/2026. Bedragen gebruiken punten voor duizendtallen en decimale komma's; bij datums komt de dag eerst. Geef de belangrijkste inleesopties op.

    ---reveal---

    Gebruik skiprows=1, sep=";", thousands=".", decimal=",", dtype={"code": str}, parse_dates=["day"], date_format="%d/%m/%Y". Het record behoudt code "00018", bedrag 2100,5 en 11 december als datum.

  17. 17
    SamenvattingControleer de betekenis van de ingelezen gegevens

    Stem eerst recordgrenzen, kopregels en tabelgrenzen af. Stel daarna getalnotaties, markeringen voor ontbrekende waarden, identificatietypes en datums in.

    Inspecteer afmetingen en types, vergelijk geselecteerde ruwe waarden en controleer ontbrekende waarden en totalen. Een parser kan met succes eindigen terwijl een voorloopnul verloren gaat, een datum wordt verwisseld of een rapporttotaal als waarneming wordt geteld. Deze controles laten zien of de ingelezen tabel dezelfde betekenis heeft als het bestand.

2

Decodeer tekst en verwerk die in delen

13 stappen
Stel de oorzaak van beschadigde tekens vast en verwerk daarna grote of gecomprimeerde invoer zonder de hele dataset te bewaren.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieTwee afzonderlijke inleesproblemen
  2. 2
    VoorbeeldVolg een teken naar bytes
  3. 3
    UitlegGebruik markeringen en documentatie
  4. 4
    UitdagingInterpreteer de bestandsmarkering
  5. 5
    VoorbeeldHerstel de oorspronkelijke interpretatie
  6. 6
    TipWis onleesbare tekens niet
  7. 7
    UitdagingKies aanwijzingen boven het ontbreken van fouten
  8. 8
    UitlegMeet de ingelezen tabel
  9. 9
    VoorbeeldHoud een cumulatieve som en telling bij
  10. 10
    UitdagingWeeg waarnemingen even zwaar
  11. 11
    KernpuntCompressie en blokgewijs verwerken beperken verschillende kosten
  12. 12
    UitdagingBehoud het geheugenvoordeel
  13. 13
    SamenvattingHoud bytes en deelresultaten betrouwbaar
3

Lees een werkmap en maak een helder rapport

11 stappen
Zoek waarnemingen op werkbladen, begrijp opgeslagen cellen en sla meerdere tabellen op zonder werkbladen te verliezen.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieScheid de tabel van de presentatie
  2. 2
    VoorbeeldSelecteer de waarnemingen in Q1
  3. 3
    UitlegLees de opgeslagen waarde
  4. 4
    KernpuntEen formule is geen verzoek om te rekenen
  5. 5
    UitdagingVerklaar twee verdachte cellen
  6. 6
    TipControleer de verzameling werkbladen
  7. 7
    VoorbeeldSchrijf twee werkbladen via één schrijver
  8. 8
    UitlegKies hoe een bestaand werkblad verandert
  9. 9
    UitdagingVoorkom achtergebleven rijen
  10. 10
    UitdagingMaak een rapport uit meerdere bronwerkbladen
  11. 11
    SamenvattingControleer de werkmap aan beide kanten
4

Zet API-records om in een tabel met het juiste detailniveau

16 stappen
Lees JSON in, vouw geneste records uit en verzamel volledige API-resultaten met controles bij elke stap.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieVan antwoordtekst naar waarnemingen
  2. 2
    VoorbeeldZet JSON-waarden om naar Python
  3. 3
    UitlegKies expliciet een tabelindeling
  4. 4
    UitdagingBehoud een JSON-identificatiecode
  5. 5
    TipMaak uitgewisselde JSON leesbaar en geldig
  6. 6
    VoorbeeldBegin met één rij per bestelling
  7. 7
    VoorbeeldVouw de gekozen lijst uit
  8. 8
    KernpuntStem totalen af op het detailniveau per rij
  9. 9
    UitdagingHoud een bovenliggend record zonder items zichtbaar
  10. 10
    VoorbeeldControleer de status voordat je een tabel maakt
  11. 11
    TipBescherm toegang en houd je aan wachttijden
  12. 12
    UitdagingNeem elke pagina mee
  13. 13
    UitlegHaal records uit het omhulsel en inspecteer ontbrekende waarden
  14. 14
    VerbandHerken een ander webformaat
  15. 15
    UitdagingScheid verzamelen van normaliseren
  16. 16
    SamenvattingControleer elke stap in de juiste volgorde
5

Kies wat je opgeslagen bestand behoudt

13 stappen
Bepaal CSV-exporten, vergelijk opslagkeuzes en lees bruikbare delen van een Parquet-dataset met vastgelegde types.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieSla op voor de volgende lezer
  2. 2
    VoorbeeldSchrijf de bedoelde CSV-velden
  3. 3
    KernpuntEen export kan precisie en types verliezen
  4. 4
    UitdagingVoeg alleen records toe
  5. 5
    UitlegLees kolommen zonder elk veld in te lezen
  6. 6
    VerbandStem formaten af op activiteiten
  7. 7
    UitdagingKies voor uitwisselbaarheid en vertrouwen
  8. 8
    VoorbeeldSchrijf en lees een tabel met vastgelegde types
  9. 9
    VoorbeeldGebruik een bruikbare indeling in mappen
  10. 10
    UitdagingVoorkom duizenden kleine delen
  11. 11
    TipVoeg bestanden met compatibele types toe
  12. 12
    UitdagingBewaar een rapport en een analysedataset
  13. 13
    SamenvattingControleer de eigenschappen die je later nodig hebt
6

Lees queryresultaten in en controleer schrijfbewerkingen naar tabellen

14 stappen
Beheer verbindingen, bind waarden, bepaal resultaattypes en sla een partij gegevens op met controle van het effect in de database.

Sla deze les op om elke Walkthrough stap voor stap te volgen.

  1. 1
    IntroductieLezen geeft gegevens terug; schrijven verandert ze
  2. 2
    VoorbeeldLees uit een lokale SQLite-database
  3. 3
    UitlegBeheer de levensduur van engines en verbindingen
  4. 4
    UitdagingVerstuur een query in plaats van een tabelnaam
  5. 5
    VoorbeeldBind een veranderende grenswaarde
  6. 6
    KernpuntEen waarde kan geen querysyntaxis worden
  7. 7
    UitdagingBehoud types en parametergrenzen
  8. 8
    TipVerwerk gegevensblokken terwijl de verbinding open is
  9. 9
    UitlegBepaal wat er met bestaande records gebeurt
  10. 10
    VoorbeeldVoeg toe binnen een transactie
  11. 11
    UitdagingControleer de wijziging en de herhaalde uitvoering
  12. 12
    TipControleer opgeslagen resultaten rechtstreeks
  13. 13
    UitdagingBehoud de definitie en vervang een momentoverzicht
  14. 14
    SamenvattingStem de aanroep af op het effect in de database

Gegevens inlezen en opslaan: oefenvragen

50 Oefenvragen in 5 sets

Set 1: Lees de gegevens en controleer hun betekenis10 Oefenvragen

Vraag 1 van 10

Een bestand zonder kopregel begint met S14,East,8. Hoe moet je het inlezen zodat dit record gegevens blijft?
  1. header=0, names=["site", "zone", "count"]
  2. header=None, names=["site", "zone", "count"]
  3. header=1, names=["site", "zone", "count"]
  4. skiprows=1, names=["site", "zone", "count"]
Toon antwoordVerberg antwoord
Antwoord: B
header=None geeft aan dat er geen labelrij is, terwijl names de labels afzonderlijk opgeeft. Met header=0 zou het eerste record als kopregel worden gebruikt, ook als vervangende namen worden opgegeven. De rij die met S14 begint, moet bij de waarnemingen blijven.

Vraag 2 van 10

Een bestand met puntkomma's bevat sensor;distance_m gevolgd door R8;2.450,75. Hoe moet de afstand 2450,75 worden?
  1. sep=";", decimal=".", thousands=","
  2. sep=",", decimal=",", thousands="."
  3. sep=";", decimal=",", thousands=" "
  4. sep=";", decimal=",", thousands="."
Toon antwoordVerberg antwoord
Antwoord: D
De puntkomma scheidt velden, de komma markeert het decimale deel en de punt groepeert duizendtallen. Deze instellingen converteren de afstand naar 2450,75. Als je de instellingen voor decimaalteken en groepering omdraait, passen ze niet bij het brongetal, ook al is het veldscheidingsteken correct.

Vraag 3 van 10

In UTF-8 gebruikt elke ASCII-letter één byte en "é" twee. Hoeveel bytes coderen "été"?
  1. 5 bytes
  2. 3 bytes
  3. 4 bytes
  4. 6 bytes
Toon antwoordVerberg antwoord
Antwoord: A
De twee letters met accenten gebruiken elk twee bytes en de ASCII-letter "t" gebruikt er één, samen vijf bytes. Met drie tel je de tekens, niet hun gecodeerde grootte. Het onderscheid is belangrijk bij het onderzoeken van opgeslagen bytes of het vaststellen van een coderingsprobleem.

Vraag 4 van 10

Een werkblad heeft een titel in rij 1, een lege rij 2, labels in rij 3, drie waarnemingen in rijen 4–6 en een totaal in rij 7. Welke inleesopties selecteren alleen de waarnemingen?
  1. skiprows=3, nrows=3
  2. skiprows=2, nrows=4
  3. skiprows=2, nrows=3
  4. skiprows=1, nrows=3
Toon antwoordVerberg antwoord
Antwoord: C
Als je twee rijen overslaat, wordt de derde werkbladrij de kopregel. Daarna leest nrows=3 de drie waarnemingen in. Als je drie rijen overslaat, wordt bij de standaardinstelling voor de kopregel de eerste waarneming als labels gebruikt. Als je vier gegevensrijen inleest, wordt ook het totaal als waarneming opgenomen.

Vraag 5 van 10

Een logbestand heeft één volledig JSON-object op elke regel en geen omringende array. Welke inleesoptie van pandas past bij die indeling?
  1. orient="split"
  2. lines=False
  3. lines=True
  4. orient="index"
Toon antwoordVerberg antwoord
Antwoord: C
lines=True geeft pandas opdracht afzonderlijke JSON-records regel voor regel in te lezen. Alleen de oriëntatie veranderen maakt van opeenvolgende objecten geen gewoon JSON-document. Het regelformaat ondersteunt ook blokgewijs inlezen wanneer je een groot logbestand in delen wilt verwerken.

Vraag 6 van 10

Een antwoord heeft de sleutels count, next en results; elk element in results is een genest record over apparatuur. Wat moet je aan json_normalize doorgeven voor een apparatuurtabel?
  1. data["results"]
  2. data
  3. data["count"]
  4. data["next"]
Toon antwoordVerberg antwoord
Antwoord: A
De waarde results bevat de waarnemingsrecords, dus normalisatie van die lijst levert rijen met apparatuur op en vouwt geneste objectvelden uit. Normalisatie van het hele omsluitende object levert daarentegen één rij voor het omhulsel op en laat de recordlijst in een cel staan. Bewaar de andere velden voor controles van de verzameling en paginering.

Vraag 7 van 10

Een opnieuw ingelezen CSV bevat een nieuwe kolom "Unnamed: 0" met alleen de oude standaardrijnummers. Welke exportwijziging voorkomt dit?
  1. Gebruik header=False.
  2. Gebruik na_rep="0".
  3. Gebruik mode="a".
  4. Gebruik index=False.
Toon antwoordVerberg antwoord
Antwoord: D
De CSV-schrijffunctie neemt standaard de DataFrame-index mee, zodat de naamloze rijnummers als extra kolom terugkomen. index=False laat die labels weg. Als je de kopregel uitschakelt, verwijder je de werkelijke kolomnamen en pak je het ongewenste indexveld niet aan.

Vraag 8 van 10

Een team heeft voor herhaalde analyse een breed ondersteund bestand nodig dat een geordende categorische variabele en tellingen met ontbrekende waarden behoudt. Welk formaat past het best?
  1. CSV-tekst
  2. Parquet
  3. JSON-records
  4. Excel-werkmap
Toon antwoordVerberg antwoord
Antwoord: B
Parquet slaat ondersteunde kolomtypes en metadata op, zodat deze pandas-types bij compatibel opslaan en opnieuw inlezen behouden kunnen blijven. CSV behoudt zichtbare waarden maar verliest de categorievolgorde en metadata voor gehele getallen met ondersteuning voor ontbrekende waarden. Excel is handig voor spreadsheetrapporten maar kan pandas-types bij opnieuw inlezen ook veranderen.

Vraag 9 van 10

Een database heeft een bestaande tabel readings en con is een gewone SQLite-verbinding. Welke aanroep haalt de tabel op als DataFrame?
  1. pd.read_sql("readings", con)
  2. pd.read_sql_table("readings", con)
  3. pd.read_sql_query("readings", con)
  4. pd.read_sql_query("SELECT * FROM readings", con)
Toon antwoordVerberg antwoord
Antwoord: D
Een volledige SQL-query kan via de SQLite-verbinding worden uitgevoerd en het resultaat wordt een DataFrame. Een losse tabelnaam is via deze verbinding geen query. read_sql_table heeft een SQLAlchemy-verbinding nodig in plaats van een gewone sqlite3-verbinding.

Vraag 10 van 10

Een SQLite-query bevat WHERE site = ?. Hoe moet de enkele waarde "West" worden doorgegeven?
  1. params=("West",)
  2. params=("West")
  3. params={"site": "West"}
  4. params="West"
Toon antwoordVerberg antwoord
Antwoord: A
Een positionele SQLite-plaatsaanduiding heeft een reeks waarden nodig; de afsluitende komma maakt hiervan een tuple met één element. Haakjes zonder die komma laten een gewone tekenreeks over. Een dictionary met namen hoort bij een bijpassende benoemde plaatsaanduiding, zoals :site, en niet bij het vraagteken dat hier wordt gebruikt.
Set 2: Behoud waarden tussen bestanden en verbindingen10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

In een CSV is "NA" een geldig zonelabel en betekent een lege telling dat de waarde ontbreekt. Welke configuratie behoudt beide betekenissen?
  1. keep_default_na=True, na_values={"count": [""]}
  2. keep_default_na=False, na_values={"zone": ["NA"]}
  3. keep_default_na=False, na_values={"count": [""]}
  4. keep_default_na=True, na_values={"zone": ["NA"]}
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Een CSV-kopregel heeft vier velden. Een later record levert er slechts drie en wordt zonder fout ingelezen. Wat moet je controleren?
  1. Het aantal ontbrekende waarden in de laatste kolom en het ruwe record.
  2. Alleen het aantal ontbrekende waarden, zonder de bronindeling te bekijken.
  3. Alleen waarschuwingen over afgewezen regels voor het korte record.
  4. Het totale aantal rijen, als controle op volledigheid.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Een naam uit een bron in UTF-8 verschijnt na inlezen met Windows-1252 als "André". Wat is de juiste oplossing?
  1. Lees de gewijzigde tabel opnieuw met Latin-1.
  2. Vervang elk niet-ASCII-teken door een spatie.
  3. Sla de verminkte tabel op met een UTF-8-BOM.
  4. Lees het oorspronkelijke bestand opnieuw met UTF-8.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Eén gegevensblok heeft de aanwezige waarden 2, 6 en 10; een tweede heeft 18. Wat is het totale gemiddelde?
  1. 12
  2. 9
  3. 6
  4. 18
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Twee tabellen moeten op afzonderlijke werkbladen van één nieuwe werkmap worden opgeslagen. Welke schrijfaanpak behoudt beide?
  1. Roep to_excel twee keer aan met hetzelfde bestandspad.
  2. Schrijf beide via één ExcelWriter-context.
  3. Schrijf de tweede tabel met header=False naar dat pad.
  4. Open voor elke tabel een nieuwe schrijver in schrijfmodus.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een API meldt 275 passende records en geeft pagina's van maximaal 80 records terug. Hoeveel verzoeken zijn nodig om het volledige resultaat te verzamelen?
  1. 4 verzoeken
  2. 3 verzoeken
  3. 5 verzoeken
  4. 275 verzoeken
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Een Parquet-dataset is gepartitioneerd in jaarmappen. Een analyse heeft alleen records uit 2024 en twee kolommen nodig. Welke inleesopdracht gebruikt beide mogelijkheden?
  1. pd.read_parquet(path, columns=["year"], filters=[("site", "==", 2024)])
  2. pd.read_parquet(path, columns=["site", "value", "year"])
  3. pd.read_parquet(path, filters=[("year", "!=", 2024)])
  4. pd.read_parquet(path, columns=["site", "value"], filters=[("year", "==", 2024)])
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Een SQLite-verbinding wordt gebruikt binnen with con:. Wat moet nog gebeuren nadat het databasewerk is voltooid?
  1. De verbinding opnieuw maken om te bevestigen.
  2. De verbindingenpool vrijgeven.
  3. De verbinding expliciet sluiten.
  4. Opnieuw openen om de transactie vrij te geven.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een SQLite-resultaat bevat ISO-datumtekst in day en gehele tellingen met NULL in n. Een script moet een tijdens de uitvoering opgegeven locatie selecteren zonder de querystructuur te veranderen. Welke combinatie past?
  1. Plaats de locatie met opmaak in SQL, lees day als datum en stel n in op Int64.
  2. Bind de locatie met params, behoud day als tekst en dwing n naar int64.
  3. Bind de locatie met params, lees day als datum en stel n in op Int64.
  4. Bind een tabelnaam met params, lees day als datum en stel n in op Int64.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Een tabel heeft 32 rijen. Een partij van vijf rijen wordt toegevoegd en na een succesvolle eerste uitvoering nogmaals toegevoegd. Geen uniciteitsbeperking wijst de partij af. Welk aantal en welke conclusie passen?
  1. 42 rijen; succesvolle herhalingen kunnen de partij dupliceren.
  2. 37 rijen; de tweede toevoeging vervangt de eerste partij.
  3. 42 rijen; een transactie herkent altijd dubbele records.
  4. 32 rijen; toevoegen vereist dat de tabel eerst wordt verwijderd.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 3: Onderzoek ingelezen gegevens voordat je de tabel vertrouwt10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Een CSV-record is "Field ""A,B""",7. Welke waarden moet een standaard-CSV-parser opleveren?
  1. Field "A en B" en 7
  2. Field A en B en 7
  3. Field ""A,B"" en 7
  4. Field "A,B" en 7
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Een bestand met puntkomma's bevat code;score;day en 00064;999;07/08/2026. De code is een identificatiecode, 999 betekent alleen voor score ontbrekend en bij datums komt de dag eerst. Welke inleesopdracht behoudt alle drie de betekenissen?
  1. sep=";", dtype={"code": int}, na_values={"score": ["999"]}, parse_dates=["day"], date_format="%d/%m/%Y"
  2. sep=";", dtype={"code": str}, na_values={"score": ["999"]}, parse_dates=["day"], date_format="%d/%m/%Y"
  3. sep=";", dtype={"code": str}, na_values={"score": ["999"]}, parse_dates=["day"], date_format="%m/%d/%Y"
  4. sep=";", dtype={"code": str}, na_values={"code": ["999"]}, parse_dates=["day"], date_format="%d/%m/%Y"
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

open() van Python laat bij gewone UTF-8-decodering een UTF-8-BOM aan het begin staan in de eerste kolomnaam. Welke coderingsinstelling verwijdert die markering?
  1. encoding="utf-8-sig"
  2. encoding="utf-16-le"
  3. encoding="cp1252"
  4. encoding="ascii"
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Een zeer grote CSV heeft een numerieke kolom amount met enkele ontbrekende waarden. Het programma heeft het totale gemiddelde nodig met beperkt geheugen. Welke aanpak blijft correct als gegevensblokken verschillende aantallen geldige waarden bevatten?
  1. Tel blokgemiddelden op en deel door het aantal blokken.
  2. Tel sommen op en deel door de gevraagde blokgrootte.
  3. Tel de som en het aantal aanwezige waarden per blok op en deel daarna één keer.
  4. Bewaar elk blok en voeg ze samen voordat je het gemiddelde berekent.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Een werkmap slaat een code op als het getal 537 met weergaveopmaak 00000. Een formulecel heeft geen opgeslagen resultaat. Wat kun je verwachten als pandas de code met een teksttype inleest?
  1. De weergegeven nullen ontbreken bij de code en pandas berekent de formule niet.
  2. De code krijgt de weergegeven nullen en pandas berekent de formule.
  3. De weergegeven nullen ontbreken bij de code en pandas berekent de formule.
  4. De code krijgt de weergegeven nullen en de formule wordt uit de tekst ingelezen.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een JSON-tekenreeks bevat [{"device":"00091","active":true}]. Hoe moet pandas die inlezen zonder de tekenreeks als pad te behandelen of de nullen van de identificatiecode te verwijderen?
  1. Gebruik text rechtstreeks en dtype={"device": str}.
  2. Gebruik StringIO(text) en dtype={"device": int}.
  3. Gebruik json.dumps(text) en dtype={"device": str}.
  4. Gebruik StringIO(text) en dtype={"device": str}.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Een API geeft HTTP 200 terug met geldige JSON en een niet-lege next-URL. Het aantal verzamelde rijen ligt onder count. Een collega rapporteert de huidige tabel als volledig. Wat is de fout?
  1. Het totaal moet worden vervangen door het aantal van de eerste pagina.
  2. De volgende URL moet terugwijzen naar verzamelde records.
  3. HTTP-succes is aangezien voor voltooiing van alle pagina's.
  4. Het veld met het aantal van de server toont dat de records volledig zijn.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Een precieze analysewaarde is 6,347. Die wordt geëxporteerd met float_format="%.2f" en later als getal ingelezen. Welke waarde kan die CSV herstellen?
  1. 6,347
  2. 6,35
  3. 6,34
  4. 6,3
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een dataset met partities per jaar slaat code in 2025 op als tekst en in een voorgesteld bestand voor 2026 als gehele getallen. De nieuwe gegevens bevatten ook slechts één rij per vrijwel unieke code. Welke voorbereiding ondersteunt betrouwbaar inlezen het best?
  1. Behoud gemengde codetypes en vervang jaren door codepartities.
  2. Stem codetypes af en maak voor elke code een partitie.
  3. Behoud gemengde codetypes en vertrouw op kolomprojectie voor herstel.
  4. Stem codetypes af en behoud de bruikbare partitionering per jaar.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Een bestaande tabel heeft belangrijke beperkingen en bevat een oud volledig momentoverzicht. Een nieuw DataFrame is het volledige vervangende momentoverzicht. Welke modus behoudt de tabeldefinitie terwijl de nieuwe inhoud wordt ingevoerd?
  1. if_exists="append"
  2. if_exists="delete_rows"
  3. if_exists="replace"
  4. if_exists="fail"
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 4: Verbind inleeskeuzes met opgeslagen resultaten10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Een tabel met verticale strepen als scheidingsteken bevat een numeriek veld tussen aanhalingstekens: "7,680.25". Het scheidingsteken wordt correct gelezen, maar het bedrag blijft tekst. Welke extra inleesoptie past bij het getal?
  1. thousands=","
  2. decimal=","
  3. thousands="."
  4. quotechar="|"
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Een rapport begint met twee titelregels, gevolgd door site,jan,feb. Het middendeel bevat een regel # note en eindigt met een totaal plus een bronvermelding. Welke configuratie leest alleen waarnemingen in zonder opmerkingen als records te behandelen?
  1. skiprows=3, comment="#", skipfooter=2, engine="python"
  2. skiprows=2, comment="#", skipfooter=1, engine="python"
  3. skiprows=2, comment="#", skipfooter=2, engine="python"
  4. skiprows=2, comment="#", skipfooter=2, engine="c"
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Een gedocumenteerde CSV in UTF-8 is ingelezen als Windows-1252, wat verminkte namen opleverde. Die tabel is daarna correct opgeslagen als UTF-8. De oorspronkelijke download bestaat nog. Welke herstelactie geeft de bedoelde namen terug?
  1. Lees de afgeleide export opnieuw als UTF-8 en sla die ongewijzigd op.
  2. Lees het origineel opnieuw als Windows-1252 en voeg een UTF-8-BOM toe.
  3. Lees de afgeleide export opnieuw als Latin-1 en vervang ongeldige bytes.
  4. Lees het origineel opnieuw als UTF-8 en bouw de afgeleide export opnieuw op.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Een werkmap bevat History en Current. Alleen Current moet worden vervangen en History moet behouden blijven. Welke schrijfinstelling past?
  1. Schrijfmodus, openpyxl-bibliotheek en werkbladnaam Current.
  2. Toevoegmodus, openpyxl-bibliotheek en if_sheet_exists="replace".
  3. Toevoegmodus, openpyxl-bibliotheek en if_sheet_exists="overlay".
  4. Schrijfmodus, XlsxWriter-bibliotheek en index=False voor Current.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Een genormaliseerde onderdelentabel heeft rijen (visit_id, visit_fee, part_cost): (51, 12, 3), (51, 12, 5) en (52, 7, 4). Wat is het totaal van bezoekkosten plus onderdelen voor deze twee bezoeken?
  1. 43
  2. 31
  3. 27
  4. 35
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een verzamelscript heeft pagina 1 van een API-resultaat opgeslagen. Het verzoek om pagina 2 krijgt HTTP 429 met Retry-After: 45. Welke voortzetting behoudt de verzameling en houdt rekening met het antwoord?
  1. Wacht 45 seconden, probeer pagina 2 opnieuw en volg daarna de overige pagina's.
  2. Wacht 45 seconden, begin opnieuw bij pagina 1 en voeg alle pagina's toe aan de opgeslagen records.
  3. Vraag direct pagina 3 op en behandel pagina 2 als een leeg resultaat.
  4. Sla de inhoud van het 429-antwoord op als pagina 2 en vraag daarna de volgende pagina op.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Waarom vraagt het inlezen van een niet-geverifieerde pickle van een collega om een andere vertrouwensafweging dan het lezen van een gewone CSV?
  1. Het inlezen van een pickle bewijst dat het bestand van de genoemde afzender komt.
  2. Een behouden datatype maakt een niet-geverifieerde pickle veilig om in te lezen.
  3. Bij het inlezen van een pickle kan code worden uitgevoerd.
  4. Compatibele bibliotheekversies voorkomen dat een pickle code uitvoert.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Een tabel heeft 2 miljoen rijen, 60 kolommen en vier jaren. Een terugkerende analyse heeft twee kolommen voor één jaar nodig. Welke opslag- en inleesaanpak vermijdt onnodige kolommen en jaargroepen?
  1. Parquet gepartitioneerd op record-ID, gevolgd door het inlezen van de volledige dataset.
  2. Eén CSV per jaar, gevolgd door het inlezen van elke kolom uit elk bestand.
  3. Eén Parquet-bestand per jaar, gevolgd door alle bestanden inlezen vóór het filteren.
  4. Parquet gepartitioneerd op jaar, met een kolomlijst en een jaarfilter.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een programma laat gebruikers een tabel en een grenswaarde kiezen. De query gebruikt een plaatsaanduiding voor de tabelnaam en plaatst de grenswaarde met opmaak in SQL. Welk aangepast ontwerp ondersteunt de bedoelde keuzes veilig?
  1. Kies de tabel uit een vaste lijst en bind de grenswaarde.
  2. Bind zowel de tabelnaam als de grenswaarde als gewone waarden.
  3. Plaats beide invoerwaarden met opmaak nadat spaties zijn verwijderd.
  4. Bind de tabelnaam, maar plaats een numeriek ogende grenswaarde met opmaak.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Een dagelijkse partij moet aan een bestaande tabel met beperkingen worden toegevoegd. Een mislukte partij mag geen gedeeltelijke invoegingen achterlaten en een succesvolle partij moet het opgeslagen aantal met haar lengte verhogen. Welke aanpak past?
  1. Vervang binnen een SQLAlchemy-transactie en vergelijk daarna het aantal met de partijgrootte.
  2. Voeg toe zonder transactie en vergelijk daarna het totaal met de partijgrootte.
  3. Verwijder alle rijen in een transactie en controleer daarna de groei vanaf het oude totaal.
  4. Voeg toe via een SQLAlchemy-transactie en controleer daarna de groei van het aantal.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Set 5: Los meerdere risico's bij inlezen en opslaan op10 Oefenvragen

Sla deze les op om elk antwoord te zien en elke set te oefenen.

Vraag 1 van 10

Een CSV bevat de codes "0072" en "0073", tellingen als gehele getallen met ontbrekende waarden en de datums "12/01/2026", "26/01/2026". De bron bepaalt dat bij datums de dag eerst komt. Welke combinatie behoudt deze betekenissen?
  1. Code als tekst, telling als int32, datums ingelezen met %d/%m/%Y.
  2. Code als gehele getallen, telling als Int64, datums ingelezen met %d/%m/%Y.
  3. Code als tekst, telling als Int64, datums ingelezen met %d/%m/%Y.
  4. Code als tekst, telling als Int64, datums ingelezen met %m/%d/%Y.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 2 van 10

Een inleesfunctie gebruikt on_bad_lines="skip". Van 1.000 bronwaarnemingen worden er 995 ingelezen; twee daarvan hebben ontbrekende velden aan het einde. Wat volgt uit deze resultaten?
  1. Zeven waarnemingen zijn verloren; elk ontbrekend veld duidt op een overgeslagen record.
  2. Vijf waarnemingen zijn verloren; korte ingelezen records moeten nog worden geïnspecteerd.
  3. Vijf waarnemingen zijn verloren; de ingelezen records moeten allemaal volledig zijn.
  4. Twee waarnemingen zijn verloren; het verschil in aantal weerspiegelt alleen lege velden.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 3 van 10

Een kort bestand wordt zonder fout als Latin-1 gedecodeerd, maar de broncodering is onbekend. Welke aanwijzingen zouden de keuze sterker onderbouwen?
  1. Het ontbreken van een decoderingsuitzondering bij het lezen met Latin-1.
  2. Een teksteditor die het bestand opent zonder de codering te tonen.
  3. Een kopregel met alleen ASCII-tekens die onder die decoder correct lijkt.
  4. Exportdocumentatie en correct gedecodeerde waarden met accenten.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 4 van 10

Een gzip-CSV wordt in gegevensblokken verwerkt. Een collega telt bedragen op maar deelt door het aantal rijen, inclusief ontbrekende bedragen, en bewaart elk blok in een lijst. Welke combinatie van correcties past bij een taak die alleen een gemiddelde vraagt en beperkt geheugen heeft?
  1. Tel aanwezige bedragen en bewaar alleen sommen en aantallen.
  2. Tel elke rij en bewaar alleen het gemiddelde van blokgemiddelden.
  3. Tel aanwezige bedragen en voeg alle bewaarde blokken samen.
  4. Tel blokken en bewaar hun sommen zonder aantallen waarnemingen.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 5 van 10

Een formuletotaal op een werkblad toont 90, maar het laatst opgeslagen resultaat is 74. Een apparaat-ID van 16 cijfers is als getal ingevoerd. Met welke twee beperkingen moet je omgaan voordat je op de ingelezen gegevens vertrouwt?
  1. Opgeslagen formuleresultaten moeten worden bijgewerkt; alleen als tekst inlezen herstelt de volledige ID.
  2. De weergegeven formule is actueel; de oorspronkelijke volledige ID moet als tekst worden opgeslagen.
  3. Opgeslagen formuleresultaten moeten worden bijgewerkt; de oorspronkelijke volledige ID moet als tekst worden opgeslagen.
  4. De weergegeven formule is actueel; alleen als tekst inlezen herstelt de volledige ID.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 6 van 10

Een omsluitend object bevat drie bestellingen met 2, 1 en 0 artikelen. De artikelentabel herhaalt de bezorgkosten van elke bestelling. De analist heeft zowel het aantal bestellingen als de totale bezorgkosten nodig. Welk ontwerp voorkomt dat bestellingen verloren gaan of worden herhaald?
  1. Tel artikelrijen en tel elke herhaalde vergoeding in de artikelentabel op.
  2. Behoud alleen bestellingen in de artikelentabel en neem de hoogste vergoeding.
  3. Gebruik het aantal artikelrijen als aantal bestellingen en deel de vergoedingen door drie.
  4. Behoud een bestellingentabel voor aantallen en kosten, gekoppeld aan een aparte artikelentabel.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 7 van 10

Een verwerkte CSV heeft na opnieuw inlezen een dubbele kopregel tussen de records, afgeronde metingen en beschadigde ID's met voorloopnullen. Welke reeks wijzigingen pakt de drie oorzaken aan?
  1. Voeg toe met kopregels, exporteer met volledige precisie en lees ID's als tekst.
  2. Voeg toe zonder kopregels, exporteer met volledige precisie en lees ID's als tekst.
  3. Voeg toe zonder kopregels, kies een ruimer drijvendekommatype bij het inlezen en lees ID's als gehele getallen.
  4. Voeg toe zonder kopregels, exporteer afgeronde waarden en converteer ID's achteraf naar tekst.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 8 van 10

Een collega heeft een spreadsheetrapport nodig met benoemde werkbladen voor metingen en tellingen. Welk uitvoerformaat is direct geschikt voor dat gebruik?
  1. Excel-werkmap
  2. JSON Lines-bestand
  3. Feather-bestand
  4. Parquet-dataset
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 9 van 10

Een opgeslagen tabel heeft 140 rijen. Een partij van zeven rijen bevat alleen nieuwe records en moet bestaande rijen en beperkingen behouden. Welke modus en controle van het aantal passen na het invoeren?
  1. Gebruik replace en controleer of het opgeslagen aantal zeven is.
  2. Gebruik append en controleer of het opgeslagen aantal 147 is.
  3. Gebruik append en controleer of het opgeslagen aantal zeven is.
  4. Gebruik delete_rows en controleer of het opgeslagen aantal 147 is.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Vraag 10 van 10

Een tabel met beperkingen heeft 80 rijen. Het toevoegen van 12 rijen binnen een ondersteunde transactie mislukt nadat vijf rijen zijn ingevoegd en de uitzondering verlaat het transactieblok. Welk aantal moet overblijven en wat zou een succesvolle nieuwe poging opleveren?
  1. 80 na terugdraaien; 92 na één succesvolle nieuwe poging.
  2. 85 na de fout; 97 na één succesvolle nieuwe poging.
  3. 80 na terugdraaien; 80 na één succesvolle nieuwe poging.
  4. 92 na de fout; 104 na één succesvolle nieuwe poging.
Toon antwoordVerberg antwoord

Sla deze les op om dit antwoord te zien.

Kom je niet uit je eigen opgave? Huiswerkhulp

Kernbegrippen

91 Kernbegrippen, elk met een definitie

A

afsluitende rapportregels
Afsluitende rapportregels zijn materiaal aan het einde van een rapport buiten de tabel met waarnemingen, zoals totalen, bronvermeldingen of toelichtingen op de export.
Sla de laatste twee rapportregels over wanneer ze een totaal en een bronvermelding bevatten in plaats van waarnemingen.
API-eindpunt
Een API-eindpunt is een gedocumenteerde URL waarop een API via HTTP een verzoek voor een bepaalde bron of bewerking ontvangt.
Een eindpunt kan een stadsparameter accepteren en bijpassende meetrecords teruggeven in een JSON-antwoord.
API-sleutel
Een API-sleutel is een toegangsgegeven dat een client volgens de gedocumenteerde authenticatiemethode van de API verstuurt om toegestane toegang te verkrijgen.
Lees een geheime sleutel uit een omgevingsvariabele in plaats van de sleutel in een notebookcel op te slaan.
ASCII
ASCII definieert 128 basistekens waarvan de bytewaarden worden gedeeld door UTF-8 en verschillende veelgebruikte westerse coderingen met één byte per teken.
Een kopregel met alleen Engelse tekst kan correct lijken, ook wanneer de codering voor latere namen met accenten verkeerd is.
automatische typeafleiding
Automatische typeafleiding is de keuze van een leesfunctie voor een kolomtype op basis van de invoerwaarden wanneer het programma dat type niet heeft opgegeven.
Een apparaatcode die alleen uit cijfers bestaat, kan een geheel getal worden tenzij je de leesfunctie opdraagt die als tekst te behouden.

B

bestand met vaste veldbreedtes
Een bestand met vaste veldbreedtes slaat velden op vaste tekenposities op in plaats van ze met een scheidingsteken te scheiden.
Gebruik expliciete breedtes als een apparatuurexport vier tekens voor een code en zeven voor een naam reserveert.
byte
Een byte is een eenheid voor opgeslagen gegevens met 256 mogelijke waarden, van 0 tot en met 255, die onder meer wordt gebruikt om tekst weer te geven.
Vier zichtbare tekens in een naam kunnen vijf bytes vereisen wanneer één teken twee bytes in UTF-8 gebruikt.
bytevolgordemarkering
Een bytevolgordemarkering, of BOM, is een markering aan het begin die sommige tekstbestanden gebruiken om coderingsinformatie aan te geven, zoals de bytevolgorde van UTF-16.
Als je utf-8-sig gebruikt om tekst met Python in te lezen, wordt een UTF-8-BOM aan het begin uit de eerste kolomnaam verwijderd.

C

categorische kolom
Een categorische kolom slaat waarden op via een vastgelegde verzameling labels, wat vaak geheugen bespaart wanneer veel rijen enkele labels herhalen.
Vier regiolabels die in duizenden records worden herhaald, zijn geschikt om categorische opslag voor te overwegen.
compressie
Compressie codeert gegevens in minder opgeslagen bytes en verkleint zo het bestand, maar vereist decompressie voordat de waarden kunnen worden gebruikt.
pandas kan een .csv.gz-bestand tijdens het inlezen decomprimeren zonder eerst een ongecomprimeerde kopie te maken.
compressiecodec
Een compressiecodec is een algoritme om opgeslagen gegevens te comprimeren en decomprimeren, waarbij bestandsgrootte wordt afgewogen tegen verwerkingskosten.
Snappy is de standaard voor Parquet in pandas; een andere codec kan kleinere bestanden opleveren met andere schrijfkosten.
controle van weggeschreven gegevens
Controle van weggeschreven gegevens vergelijkt opgeslagen databaseresultaten met de bedoelde wijziging, zoals de verwachte toename van het aantal rijen na toevoegen.
Vraag na het toevoegen van zes rijen aan een tabel met 20 het aantal op en controleer of het verwachte totaal 26 is.
CSV
Een CSV-bestand is een tekstbestand met records waarvan de velden door een scheidingsteken worden gescheiden. Aanhalingstekens beschermen scheidingstekens binnen velden.
Een adres met een komma blijft in één veld als het adres in de CSV correct tussen aanhalingstekens staat.
cursor aan de serverzijde
Een cursor aan de serverzijde laat een database-interface een resultaat geleidelijk ophalen in plaats van het hele resultaat in één keer te bufferen.
Voor blokgewijze verwerking in pandas kan nog steeds ondersteuning voor streaming nodig zijn om te voorkomen dat het databasestuurprogramma het volledige resultaat buffert.

D

databasestuurprogramma
Een databasestuurprogramma is de bibliotheek die de communicatie verzorgt tussen de database-interface van Python en een bepaald databasesysteem.
Een PostgreSQL-URL voor SQLAlchemy kan psycopg selecteren, dat voor de verbinding ook moet zijn geïnstalleerd.
databaseverbinding
Een databaseverbinding is een actieve interface waarlangs een programma databasebewerkingen verstuurt en de resultaten ontvangt.
Houd de verbinding open totdat een queryresultaat in gegevensblokken volledig is verwerkt en sluit die daarna.
datumnotatie
Een datumnotatie is een patroon dat een parser vertelt hoe datumonderdelen zijn gerangschikt, zoals dag, maand en jaar met vier cijfers.
Het patroon %d/%m/%Y maakt van "09/10/2026" 9 oktober in plaats van 10 september.
decimaalteken
Een decimaalteken scheidt het gehele en het decimale deel van een getal; pandas kan bij het inlezen van tekst een gekozen teken interpreteren.
Met een decimale komma vertegenwoordigt "8,75" dezelfde waarde als 8.75 in Python-uitvoer.
decodering
Decodering zet opgeslagen bytes volgens een opgegeven tekencodering om in tekst en bepaalt welke tekens in het resultaat verschijnen.
Als je een UTF-8-bestand met een oudere decoder opent, kunnen accenten verminkt raken zonder dat een fout optreedt.
deelaggregaat
Een deelaggregaat is een samengevat resultaat voor één gegevensdeel dat volgens een geschikte regel kan worden gecombineerd met resultaten van andere delen.
Sommen van gegevensblokken kun je direct optellen, maar voor een totaal gemiddelde heb je de gezamenlijke som en het aantal aanwezige waarden nodig.
detailniveau per rij
Het detailniveau per rij geeft aan wat één tabelrij voorstelt en bepaalt daarmee hoe herhaalde labels en bedragen moeten worden geïnterpreteerd.
Een rij voor elk bestelartikel heeft een andere teleenheid dan een rij voor elke volledige bestelling.

E

Excel-bibliotheek
Een Excel-bibliotheek is een bibliotheek die pandas gebruikt om een spreadsheetformaat te lezen of schrijven; de ondersteuning hangt af van het bestandstype.
Als openpyxl niet is geïnstalleerd, kan het inlezen van een .xlsx-bestand mislukken, ook wanneer pandas zelf is geïnstalleerd.
ExcelWriter
Een ExcelWriter beheert een schrijfsessie voor een werkmap, zodat meerdere DataFrames op verschillende werkbladen kunnen worden geplaatst voordat het bestand wordt gesloten.
Als je twee tabellen via één schrijver schrijft, blijven beide werkbladen in dezelfde voltooide rapportwerkmap behouden.
export van de index
Bij export van de index worden rijlabels van een DataFrame naar een uitvoerkolom geschreven; dit is alleen nuttig wanneer die labels bij de uitgewisselde gegevens horen.
Laat een gewone genummerde index weg om na het opnieuw inlezen van CSV een nieuwe kolom "Unnamed: 0" te voorkomen.

F

Feather
Feather is een binair formaat op basis van Arrow IPC voor snelle uitwisseling van DataFrames met vastgelegde types tussen compatibele analysehulpmiddelen.
Een lokale Python-stap kan een Feather-tabel opslaan voor een latere stap of een compatibele R-werkwijze.

G

gebonden parameter
Een gebonden parameter levert een gegevenswaarde afzonderlijk van de SQL-syntaxis, zodat tekens in die waarde de query niet opnieuw kunnen definiëren.
Een regionaam met een apostrof blijft één vergelijkingswaarde wanneer die als parameter wordt doorgegeven.
gegevensblok
Een gegevensblok is een begrensde groep records die een iteratieve leesfunctie oplevert, zodat een programma telkens een deel van een bestand kan verwerken.
Een invoer van 13 rijen die in blokken van vijf wordt ingelezen, levert DataFrames van vijf, vijf en drie rijen op.
gegevensschema
Een gegevensschema beschrijft de structuur van een dataset, waaronder kolomnamen en types die compatibele leesfuncties gebruiken om opgeslagen waarden te interpreteren.
Een gedeelde dataset heeft compatibele types voor codekolommen in alle bestanden nodig om mislukte inleesbewerkingen of veranderde waarden te voorkomen.
geheelgetaltype met ondersteuning voor ontbrekende waarden
Een geheelgetaltype met ondersteuning voor ontbrekende waarden is een pandas-type dat zowel ontbrekende waarden als gehele getallen kan bevatten, zoals het datatype Int64.
Een kolom met bezoekaantallen kan 3 en 8 als gehele getallen behouden en een lege waarneming daarin als <NA> weergeven.
geheugengebruik inclusief objectinhoud
Geheugengebruik inclusief objectinhoud telt het geheugen voor opgeslagen waarden mee, waaronder de inhoud van tekstobjecten, boven op de oppervlakkige grootte van hun arrays.
Gebruik een geheugenrapport inclusief objectinhoud om herhaalde regionamen als tekst en als categorieën te vergelijken.
gepartitioneerde dataset
Een gepartitioneerde dataset verdeelt tabelbestanden over mappen op basis van geselecteerde veldwaarden, zodat leesfuncties niet-relevante groepen kunnen overslaan.
Met mappen die year=2025 en year=2026 heten, kan een jaarfilter zich op het benodigde deel richten.
gewogen gemiddelde
Een gewogen gemiddelde geeft bij het combineren van ongelijke gegevensgroepen elk deelgemiddelde invloed naar verhouding van het aantal geldige waarnemingen.
Een gegevensblok met één record mag bij het berekenen van het totale gemiddelde niet even zwaar tellen als een blok met honderd records.

H

halfopen bereik
Een halfopen bereik omvat de beginpositie en sluit de eindpositie uit, zoals bij kolomgrenzen met vaste veldbreedtes.
Het bereik (2, 7) selecteert vijf tekenposities en eindigt net vóór positie 7.
HDF5
HDF5 is een hiërarchisch binair formaat dat meerdere datasets in één bestand kan ordenen en vaak wordt gebruikt voor grote wetenschappelijke datasets.
pandas heeft PyTables nodig om via de HDF5-interface meerdere analysedatasets te schrijven.
HTTP-statuscode
Een HTTP-statuscode is een getal in een antwoord dat het resultaat van het verzoek meldt, waarbij 4xx- en 5xx-codes foutklassen aangeven.
Controleer op een mislukte status voordat je een JSON-foutmelding omzet in iets wat op een gegevenstabel lijkt.

I

identificatiecode
Een identificatiecode is een label voor een record of entiteit waarvan de cijfers betekenis kunnen hebben zonder een hoeveelheid voor berekeningen weer te geven.
Als je een apparaatcode zoals "00028" als tekst inleest, behoud je de nullen die nodig zijn om die te koppelen aan dezelfde code in een bronlijst.

J

JSON
JSON is een tekstformaat voor objecten, arrays, tekenreeksen tussen dubbele aanhalingstekens, getallen, booleaanse waarden en null, dat vaak wordt gebruikt voor uitgewisselde geneste records.
Een JSON-API kan een lijst met stationobjecten teruggeven, elk met een naam en een reeks temperaturen.
JSON Lines
JSON Lines is een tekstindeling met één volledig JSON-object op elke regel, zonder één buitenste array die alle records omsluit.
Grote logexporten kunnen in gegevensblokken worden ingelezen wanneer pandas weet dat de invoer JSON Lines gebruikt.
JSON-array
Een JSON-array is een geordende reeks waarden tussen vierkante haken, die tijdens het inlezen wordt omgezet in een Python-lijst.
Een temperatuurarray kan numerieke waarnemingen combineren met null voor een ontbrekende meting.
JSON-object
Een JSON-object is een verzameling waarden met tekenreeksen als naam, tussen accolades, die de JSON-parser van Python omzet in een dictionary.
Een object kan "active" koppelen aan true en "name" aan het tekstlabel van een station.
JSON-oriëntatie
Een JSON-oriëntatie bepaalt hoe de rijen, kolommen, labels en waarden van een tabel binnen een JSON-weergave zijn gerangschikt.
De oriëntatie records schrijft elke waarneming als een object, terwijl split labels en gegevens afzonderlijk bewaart.

K

kolomgeoriënteerde opslag
Kolomgeoriënteerde opslag houdt de waarden van een kolom bij elkaar en ondersteunt zo het inlezen van geselecteerde kolommen en compressie van vergelijkbare aangrenzende waarden.
Een analyse die twee velden nodig heeft, kan voorkomen dat de andere kolommen van een brede Parquet-dataset worden ingelezen.
kolommen met een MultiIndex
Kolommen met een MultiIndex hebben kolomlabels met meerdere niveaus, die pandas uit meer dan één kopregel kan opbouwen.
Een verkooptabel kan een kolom zowel met de maat als met het jaar labelen, zoals ("sales", "2026").
kopregel
Een kopregel is een rij met veldlabels die een leesfunctie als kolomnamen gebruikt in plaats van de labels als waarneming te behandelen.
Geef bij een bestand zonder kopregel kolomnamen op, zodat de eerste meting in de tabel blijft.

L

Latin-1
Latin-1 is een codering met één byte per teken die elke bytewaarde aan een teken koppelt, waaronder besturingstekens in een deel van het bereik.
Inlezen met Latin-1 kan foutloos eindigen terwijl een bedoeld symbool toch in het verkeerde teken verandert.

M

markering voor ontbrekende waarden
Een markering voor ontbrekende waarden is een bronwaarde die een afwezige waarneming aanduidt en tijdens het inlezen wordt omgezet in een ontbrekende waarde.
Als "-" betekent dat een score ontbreekt, voorkom je door die als ontbrekend op te geven dat de scorekolom tekst blijft.
metadata van het bovenliggende object
Metadata van het bovenliggende object bestaan uit velden die vanuit een omsluitend JSON-object worden gekopieerd naar elke rij die uit de geneste recordlijst ontstaat.
Een bestel-ID die naar elke artikelrij wordt gekopieerd, maakt het mogelijk de artikelen terug te koppelen aan hun oorspronkelijke bestelling.

N

normalisatie
Normalisatie van geneste JSON vouwt geselecteerde objectvelden en lijstrecords uit tot een tabel met een expliciet gekozen detailniveau per rij.
Als je klantobjecten met bestellingen normaliseert, kunnen kolommen met punten in hun naam ontstaan zonder dat de artikellijst van elke bestelling wordt uitgevouwen.

O

omsluitend API-object
Een omsluitend API-object is een omhulsel dat recordgegevens bevat samen met informatie zoals een resultaataantal en de locatie van de volgende pagina.
Zet de resultatenlijst van het omsluitende object om naar een platte tabel en behoud de waarde voor de volgende pagina voor een volgend verzoek.
onjuist opgebouwde regel
Een onjuist opgebouwde regel is een record dat de parser niet in de verwachte indeling kan plaatsen, bijvoorbeeld omdat het meer velden heeft dan de kopregel beschrijft.
Een scheidingsteken in een naamveld zonder aanhalingstekens kan een geldige waarneming op een record met een extra veld doen lijken.
opgeslagen formuleresultaat
Een opgeslagen formuleresultaat is de waarde die naast een spreadsheetformule is opgeslagen, zodat een leesfunctie die kan gebruiken zonder de formule opnieuw te berekenen.
Een door een script gemaakte werkmap kan ontbrekende formulegegevens tonen omdat er geen actueel resultaat is opgeslagen.
opslaan als CSV en opnieuw inlezen
Opslaan als CSV en opnieuw inlezen schrijft een tabel als tekst en leest die opnieuw, waarbij types die CSV niet als metadata opslaat moeten worden gereconstrueerd.
Een geordende categorische variabele kan terugkomen als gewone tekst, ook als elk zichtbaar label ongewijzigd blijft.

P

pad naar records
Een pad naar records selecteert de geneste lijst waarvan de elementen uitvoerrijen worden wanneer pandas een verzameling JSON-objecten normaliseert.
Met record_path="items" maak je een artikelrij voor elk element van de artikellijst van een bestelling.
paginering
Paginering verdeelt een API-resultaat in afzonderlijk opgevraagde pagina's, met een gedocumenteerde methode om de resterende records te bereiken.
Een verzameling van 260 records die in pagina's van 100 wordt teruggegeven, vereist drie verzoeken om elk record op te halen.
Parquet
Parquet is een open kolomgeoriënteerd bestandsformaat met vastgelegde types en compressie dat breed wordt ondersteund voor het lezen en opslaan van analysetabellen.
Een identificatiecode en een telling met ontbrekende waarden kunnen hun types behouden bij compatibel opslaan als Parquet en opnieuw inlezen in pandas.
parser
Een parser is de implementatie die een tekstindeling inleest als waarden, met een eigen snelheid en verzameling ondersteunde opties.
Een rapport waarvoor skipfooter nodig is, gebruikt de Python-parser omdat de C-parser die optie niet ondersteunt.
pickle
Een pickle is een geserialiseerde weergave van een Python-object die tijdens het inlezen code kan uitvoeren en afhankelijk is van compatibele bibliotheken.
Gebruik een vertrouwde eigen pickle voor een tijdelijk object en kies een uitwisselbaar tabelformaat voor uitwisseling.
plaatsaanduiding
Een plaatsaanduiding markeert de positie van een gebonden waarde in SQL, met de syntaxis die het stuurprogramma of de query-interface vereist.
SQLite accepteert ? voor positionele waarden en :name voor waarden die in een dictionary worden opgegeven.
projectie
Projectie selecteert de kolommen die uit een opgeslagen tabel moeten worden ingelezen, zodat een kolomgeoriënteerde leesfunctie niet-relevante kolommen op schijf kan laten staan.
Geef een kolomlijst door aan read_parquet wanneer een analyse alleen regio en bedrag nodig heeft.

R

record
Een record is één volledig item in een bestand met scheidingstekens, opgebouwd uit velden; inhoud tussen aanhalingstekens kan ervoor zorgen dat het record meer dan één fysieke regel beslaat.
Een opmerking met een ingebed regeleinde kan twee fysieke regels beslaan en toch tot één record behoren.
relationele database
Een relationele database slaat records op in tabellen met benoemde kolommen en laat programma's gegevens ophalen of wijzigen via SQL-bewerkingen.
Een query kan alleen de vereiste rijen en kolommen teruggeven voordat pandas een analysetabel maakt.
rijen toevoegen
Bij rijen toevoegen worden nieuwe rijen aan een bestaande tabel toegevoegd zonder eerdere records te wissen, zodat het herhalen van een partij dubbele records kan toevoegen.
Een tabel met 11 rijen heeft er 15 na vier succesvolle invoegingen en kan er 19 hebben nadat die toevoeging is herhaald.
ruwe gegevens
Ruwe gegevens zijn de ongewijzigde invoergegevens die voor een analyse zijn ontvangen of gedownload en die afzonderlijk van afgeleide en opgeschoonde uitvoerbestanden worden bewaard.
Bewaar het ontvangen meetbestand zodat een latere correctie van decodering of inlezen kan beginnen met de oorspronkelijke bytes.

S

samengevoegd celbereik
Een samengevoegd celbereik combineert meerdere spreadsheetcellen visueel en bewaart de opgeslagen waarde in de cel linksboven.
Een samengevoegd regiolabel kan lege waarden in volgende rijen achterlaten wanneer de tabel in pandas wordt ingelezen.
scheidingsteken
Een scheidingsteken is een teken of patroon dat de grens tussen velden markeert, zoals een komma, tab, verticale streep of puntkomma.
Een bestand met puntkomma's als scheidingsteken heeft sep=";" nodig, ook als de bestandsextensie .csv is.
scheidingsteken voor duizendtallen
Een scheidingsteken voor duizendtallen groepeert cijfers binnen een numeriek veld en moet worden onderscheiden van het decimaalteken en het veldscheidingsteken.
Een gegroepeerde waarde geschreven als "4.200,50" gebruikt een punt voor duizendtallen en een komma voor het decimale deel.
schrijven over een bestaand werkblad
Schrijven over een bestaand werkblad plaatst waarden in een bestaand werkblad zonder elke oude cel buiten het nieuw geschreven gebied te wissen.
Als je een kortere tabel over bestaande cellen schrijft, kunnen eerdere rijen eronder blijven staan; inspecteer daarom de resterende werkbladinhoud.
serialisatie
Serialisatie zet objecten in het geheugen om in een weergave voor opslag of uitwisseling, bijvoorbeeld door Python-waarden als JSON-tekst te schrijven.
Gebruik json.dump om records naar een open UTF-8-bestand te serialiseren in plaats van de Python-tekstweergave van een dictionary te schrijven.
signaalwaarde
Een signaalwaarde is een aangewezen code voor een bijzondere betekenis, zoals onbekend, die anders op een gewone meting kan lijken.
Een gedocumenteerde score van 999 voor onbekend moet als ontbrekend worden opgegeven voordat je een betekenisvol gemiddelde berekent.
SQL-injectie
SQL-injectie treedt op wanneer ingevoegde tekst de structuur van een SQL-bewerking verandert in plaats van een gewone gegevenswaarde te blijven.
Invoer met aanhalingstekens en een ware voorwaarde kan een query die met tekenreeksopmaak is gebouwd uitbreiden.
SQLAlchemy-engine
Een SQLAlchemy-engine configureert databasetoegang via een stuurprogramma en beheert een verbindingenpool waaruit bij het uitvoeren van bewerkingen verbindingen worden verkregen.
Een verbindingscontext geeft de verbinding terug aan de pool; als je de engine vrijgeeft, komen de middelen in de pool vrij.
SQLite
SQLite is een database-engine die zonder afzonderlijke server werkt en doorgaans een hele database in één lokaal bestand opslaat.
Als je verbinding maakt met een verkeerd gespeld databasepad, kan een nieuw bestand worden gemaakt waarin de verwachte tabellen ontbreken.

T

tabelvervanging
Bij tabelvervanging wordt een bestaande databasetabel verwijderd en opnieuw gemaakt, waarbij zowel de eerdere definitie als de records verdwijnen.
Als je een gedeelde tabel vervangt, kunnen sleutels en indexen verdwijnen die deel uitmaakten van het oorspronkelijke ontwerp.
tekencodering
Een tekencodering is een regel om tekens als bytes weer te geven en die bytes bij het lezen als tekens te interpreteren.
Dezelfde naam kan verschillende bytereeksen innemen wanneer die wordt opgeslagen als UTF-8 en als Windows-1252.
terugdraaien
Terugdraaien annuleert niet-bevestigde wijzigingen in een transactie wanneer die niet met succes kan worden voltooid en herstelt de eerder bevestigde toestand.
Als een ondersteunde invoegbewerking binnen een enginetransactie mislukt, kunnen eerdere invoegingen daarvan worden teruggedraaid.
toevoegmodus
Toevoegmodus opent een bestaande werkmap voor wijzigingen, zodat werkbladen kunnen worden toegevoegd of volgens een regel voor bestaande werkbladnamen kunnen worden verwerkt.
Een openpyxl-schrijver in toevoegmodus kan één bestaand werkblad in een werkmap vervangen en de andere werkbladen behouden.
transactie
Een transactie groepeert databasewijzigingen om ze bij succes te bevestigen of bij een fout terug te draaien, binnen de bewerkingen die de database ondersteunt.
Een SQLAlchemy-transactie kan voorkomen dat bij een toevoeging slechts een deel van de bedoelde records wordt opgeslagen.

U

uitvoerprecisie
Uitvoerprecisie is het aantal cijfers dat in geschreven waarden behouden blijft en dat door numerieke exportopmaak blijvend kan worden verminderd.
Een rapport dat tijdens het schrijven wordt afgerond, vereist een apart analysebestand met volledige precisie als de verwijderde cijfers belangrijk zijn.
UnicodeDecodeError
Een UnicodeDecodeError treedt op wanneer een decoder een bytereeks tegenkomt die niet volgens de gekozen tekencodering kan worden geïnterpreteerd.
Een teken met een accent in Windows-1252 kan deze fout veroorzaken wanneer het bestand als UTF-8 wordt geopend.
UTF-8
UTF-8 geeft Unicode-tekens weer met één tot vier bytes, gebruikt één byte voor ASCII-tekens en ondersteunt elk Unicode-teken.
De letter "é" gebruikt twee bytes in UTF-8, dus hoeft het aantal tekens niet overeen te komen met het aantal bytes van het bestand.
UTF-16
UTF-16 codeert Unicode met eenheden van twee bytes, waarbij de bytevolgorde bekend moet zijn of via een bytevolgordemarkering aan het begin moet worden vastgesteld.
Lees een little-endianexport zonder BOM met encoding="utf-16-le" als dat de gedocumenteerde indeling is.

V

velden tussen aanhalingstekens plaatsen
Bij velden tussen aanhalingstekens plaatsen wordt een tekstveld omsloten, zodat scheidingstekens of regeleinden daarbinnen als inhoud worden behandeld in plaats van als recordstructuur.
Het veld "Harbor, West" behoudt de komma binnen één locatienaam tijdens het inlezen van CSV.
verminkte tekst door onjuiste decodering
Verminkte tekst door onjuiste decodering (mojibake) ontstaat wanneer gecodeerde bytes volgens de verkeerde regel worden geïnterpreteerd, ook als de decoder geen fout meldt.
Een naam met "Ã" op de plaats van een accent is een aanwijzing om te controleren of bytes in UTF-8 als Windows-1252 zijn gelezen.
vervangingsteken
Het vervangingsteken, "�", markeert inhoud die een decoder niet kon interpreteren toen die de opdracht kreeg ongeldige bytes te vervangen.
Een naam die als "Ren�" is ingelezen, heeft tekeninformatie verloren; bewaar de oorspronkelijke bytes om de naam correct opnieuw in te lezen.
verzoeklimiet
Een verzoeklimiet beperkt het aantal verzoeken dat een client in een periode mag sturen en geeft te veel verzoeken vaak aan met HTTP 429.
Wacht volgens Retry-After voordat je een verzoek opnieuw probeert dat is afgewezen omdat de toegestane frequentie is overschreden.

W

wachttijdlimiet voor een verzoek
Een wachttijdlimiet voor een verzoek beperkt het wachten op verbinding of lezen tijdens een HTTP-verzoek, zonder een uiterste tijd voor de volledige download op te leggen.
Stel een wachttijdlimiet in zodat een verbinding die niet reageert een API-verzamelscript niet onbeperkt laat wachten.
weergave van ontbrekende waarden
Een weergave van ontbrekende waarden is de tekst die voor een afwezige waarde wordt geschreven, zoals een leeg veld of een gekozen exportmarkering.
Als je ontbrekende neerslag als "NA" schrijft, blijft die onderscheiden van een geregistreerde nul wanneer de ontvanger de waarde correct inleest.
weergaveopmaak
Weergaveopmaak verandert hoe een opgeslagen celwaarde verschijnt, bijvoorbeeld als percentage of code met voorloopnullen, zonder die onderliggende waarde te veranderen.
Een cel die als "15%" wordt weergegeven, slaat 0,15 op, dus de ingelezen waarde is een verhouding en niet het getal 15.
werkblad
Een werkblad is één benoemd raster van cellen binnen een werkmap, dat je in pandas op werkbladnaam of positie vanaf nul selecteert.
Met sheet_name=1 lees je het tweede werkblad, dat kan verschillen van het op het scherm geopende werkblad.
werkmap
Een werkmap is een spreadsheetbestand met één of meer werkbladen en daarnaast celwaarden, types, formules en presentatiedetails.
Eén .xlsx-werkmap kan afzonderlijke werkbladen voor waarnemingen, totalen en een rapportsamenvatting bevatten.
Windows-1252
Windows-1252 is een oudere codering met één byte per teken, met westerse letters en extra symbolen, die in een deel van het bereik verschilt van Latin-1.
De byte voor het euroteken in Windows-1252 wordt bij interpretatie als Latin-1 een besturingsteken.

Over deze les

Door StudeliFout melden

Maak je eigen Studiemateriaal

Maak van je aantekeningen, slides en documenten Leermodules, Oefenvragen, Flashcards en 6 andere tools.

Aan de slag