⚠ Trading ist mit einem erheblichen Verlustrisiko verbunden. Alle Inhalte dieser Website dienen ausschließlich der Bildung und stellen keine Finanzberatung dar.
Lektion 3 von 13 · Kostenlos

pandas-Grundlagen: Series, DataFrames, der DatetimeIndex, Auswählen und Filtern sowie Resampling von Tages- zu Wochenbalken

Verstehen Sie Series und DataFrames, indizieren Sie Kursdaten nach Datum, wählen Sie Zeilen mit loc und iloc aus, filtern Sie mit booleschen Masken und fassen Sie Tagesbalken zu Wochenbalken zusammen.

Autor: Moustafa HijaziInhalt geprüft: 2026-10-305 Min. LesezeitSelbstlernkurs

Was Sie lernen werden

  • Was eine Series und ein DataFrame sind und warum der DatetimeIndex das Rückgrat der Kursanalyse ist.
  • Den Unterschied zwischen dem beschriftungsbasierten loc und dem positionsbasierten iloc und wie boolesche Masken Zeilen filtern.
  • Wie Sie mit resample und der richtigen Aggregation pro Spalte Wochen- oder Monatsbalken aus Tagesbalken bilden.
  • Welche pandas-Standardeinstellungen sich in Version 3.0 geändert haben und wie Sie Code schreiben, der sich unter 2.2 und 3.x gleich verhält.

Erklärung

Eine Series ist ein eindimensionales, beschriftetes Array: eine Spalte mit Schlusskursen, bei der jedem Wert ein Datum zugeordnet ist. Ein DataFrame ist eine Tabelle aus Series, die sich einen Index teilen: Eröffnung, Hoch, Tief, Schluss und Volumen nebeneinander. Der Index enthält die Zeilenbeschriftungen; bei Kursdaten sollte er ein DatetimeIndex sein, ein spezialisierter Index aus Zeitstempeln, der Datums-Slicing, Resampling und den Umgang mit Zeitzonen ermöglicht. Konvention: import pandas as pd.

Erstellen Sie einen Frame aus einem Dictionary von Spalten und einem Datumsindex:

idx = pd.bdate_range("2025-03-03", periods=10)

df = pd.DataFrame({"open": [...], "high": [...], "low": [...], "close": [...], "volume": [...]}, index=idx)

bdate_range erzeugt nur Wochentage und kennt keine Börsenfeiertage; echte Daten kommen aus Dateien (Lektion 4). Untersuchen Sie die Daten mit df.head(), df.info() (Typen und fehlende Werte) und df.describe(). df.index.dtype muss datetime64 anzeigen; zeigt es object, sind die Datumsangaben noch Text.

Auswählen. df["close"] liefert eine Series; df[["open", "close"]] (eine Liste) liefert einen DataFrame. df.loc[row_labels, columns] wählt nach Beschriftung aus: df.loc["2025-03-05":"2025-03-07", "close"] liefert die Schlusskurse dieser drei Tage, und bei loc sind beide Enden eines Slices enthalten, anders als bei Python-Listen. df.iloc[0:3] wählt nach ganzzahliger Position aus (die ersten drei Zeilen, Ende ausgeschlossen), und df.iloc[-1] ist der jüngste Balken.

Filtern. Ein Vergleich auf einer Series erzeugt eine Series aus booleschen Werten, eine Maske: up = df["close"] > df["open"]. Übergeben Sie die Maske, werden die passenden Zeilen ausgewählt: df[up]. Kombinieren Sie Masken mit & (und), | (oder) und ~ (nicht), jede Bedingung in eigenen Klammern: df[(df["close"] > df["open"]) & (df["volume"] > 1200)]. up.sum() zählt die True-Werte, und up.mean() ist der Anteil der Tage mit Kursanstieg.

Spalten hinzufügen ist eine Zuweisung: df["range"] = df["high"] - df["low"]. Operationen sind vektorisiert, sie werden also auf ganze Spalten auf einmal angewendet, und deshalb ist pandas schnell. shift(1) verschiebt Werte um eine Zeile nach unten (der gestrige Schlusskurs in der heutigen Zeile), und pct_change() liefert prozentuale Veränderungen; beide hinterlassen NaN (not a number, „keine Zahl“) in der ersten Zeile.

Resampling. resample gruppiert Zeilen in feste Zeitintervalle. Jede Spalte braucht ihre eigene Regel: Die Wochen-Eröffnung ist die erste Tages-Eröffnung, das Hoch das Maximum, das Tief das Minimum, der Schlusskurs der letzte und das Volumen die Summe:

rules = {"open": "first", "high": "max", "low": "min", "close": "last", "volume": "sum"}

weekly = df.resample("W-FRI").agg(rules)

Der Code "W-FRI" beschriftet jede Woche mit ihrem Freitag. Monatsbalken verwenden "ME" (Monatsende). Ältere Tutorials schreiben "M"; pandas 2.2 hat diesen Alias zugunsten von "ME" als veraltet markiert (ebenso "QE" und "YE"), und Code mit den neuen Aliassen läuft sowohl unter 2.2 als auch unter 3.x.

Wissenswerte Änderungen in pandas 3.0. Copy-on-Write ist jetzt der einzige Modus: Ein gefilterter Frame ist eine unabhängige Kopie, sodass df[mask]["close"] = 0 df niemals verändert; schreiben Sie df.loc[mask, "close"] = 0. Textspalten haben jetzt den dtype str statt object.

Durchgerechnetes Beispiel

Hypothetisches Beispiel: zehn Tagesbalken von Montag, 3. März, bis Freitag, 14. März 2025, Kurse in Euro, keine Feiertage.

Datum Eröffnung Hoch Tief Schluss Volumen
03. Mär 100 102 99 101 1,000
04. Mär 101 104 100 103 1,200
05. Mär 103 104 101 102 900
06. Mär 102 105 101 104 1,100
07. Mär 104 106 103 105 1,500
10. Mär 105 106 103 104 1,300
11. Mär 104 107 103 106 1,000
12. Mär 106 108 105 107 1,400
13. Mär 107 109 106 108 1,200
14. Mär 108 110 106 107 1,600

Das Resampling ergibt zwei Zeilen. Woche bis 7. März: Eröffnung = erste Eröffnung = 100; Hoch = max(102, 104, 104, 105, 106) = 106; Tief = min(99, 100, 101, 101, 103) = 99; Schluss = letzter Schlusskurs = 105; Volumen = 1,000 + 1,200 + 900 + 1,100 + 1,500 = 5,700. Woche bis 14. März: Eröffnung 105, Hoch 110, Tief 103, Schluss 107, Volumen = 1,300 + 1,000 + 1,400 + 1,200 + 1,600 = 6,500.

Filtern: (df["close"] > df["open"]).sum() liefert 7, weil nur der 5., 10. und 14. März unter ihrer Eröffnung schlossen. df.loc["2025-03-05":"2025-03-07", "close"] liefert 102, 104, 105.

Häufiger Fehler

loc mit iloc verwechseln und vergessen, dass loc das Ende einschließtdf.iloc[0:5] liefert fünf Zeilen (Positionen 0 bis 4), aber df.loc["2025-03-03":"2025-03-07"] liefert jede Zeile bis einschließlich 7. März. Verwenden Sie iloc für „die ersten N“ oder „den letzten Balken“ und loc mit expliziten Datumsangaben für Zeiträume.

Übungsaufgabe

Arbeiten Sie mit der obigen Tabelle aus zehn Balken auf Papier: (a) Schreiben Sie den pandas-Ausdruck, der die Balken vom 10. bis einschließlich 12. März auswählt; (b) geben Sie an, was df.iloc[-3:]["close"].tolist() liefert; (c) berechnen Sie den einzelnen Monatsbalken, den df.resample("ME").agg(rules) erzeugen würde; (d) erklären Sie, was schiefgeht, wenn jemand df.resample("ME").last() für alle Spalten schreibt.

Lösung anzeigen

(a) df.loc["2025-03-10":"2025-03-12"], drei Zeilen, beide Enden eingeschlossen.

(b) Die letzten drei Schlusskurse: [107, 108, 107].

(c) Eine Zeile mit der Beschriftung 31. März 2025 (Monatsende): Eröffnung 100 (erste), Hoch 110 (Maximum), Tief 99 (Minimum), Schluss 107 (letzter), Volumen 12,200 (5,700 + 6,500).

(d) .last() nimmt den letzten Wert jeder Spalte: Das Monatstief wäre 106 statt 99, die Eröffnung 108 statt 100 und das Volumen 1,600 statt 12,200. Übergeben Sie immer die Regeln pro Spalte.

Einschränkungen: Das Beispiel enthält keine Feiertage oder fehlenden Tage; bei echten Daten fasst eine Woche mit einem Feiertag einfach vier Balken zusammen, und die Monatsbeschriftung „31. März“ erscheint auch dann, wenn der letzte Handelstag der 28. März war.

Kernaussagen

  • Kursdaten liegen in einem DataFrame mit DatetimeIndex; prüfen Sie df.index.dtype vor allem anderen.
  • loc wählt nach Beschriftung aus und schließt das Slice-Ende ein; iloc wählt nach Position aus und schließt es aus.
  • Boolesche Masken, kombiniert mit &, | und ~, ersetzen beim Filtern Schleifen, und .sum() auf einer Maske zählt die Treffer.
  • Resamplen Sie OHLCV mit first/max/min/last/sum, verwenden Sie die Aliasse "W-FRI" und "ME", und denken Sie bei Zuweisungen an das Copy-on-Write von pandas 3.0.

Nächster Schritt

Lektion 4 bringt echte Daten ins Spiel: das Einlesen von CSV-Dateien und kostenlosen APIs, den Unterschied zwischen adjustierten und unadjustierten Kursen sowie den Umgang mit fehlenden Werten und Zeitzonen.

Selbsttest

Beantworten Sie die Fragen und prüfen Sie dann Ihre Antworten. Sie können es so oft wiederholen, wie Sie möchten.

1. Welches Aggregations-Dictionary wandelt tägliche OHLCV-Balken korrekt in Wochenbalken um?

2. Ein DataFrame hat 250 Tageszeilen. Wie viele Zeilen liefern df.iloc[0:10] und df.loc['2025-01-02':'2025-01-15'], wenn der zweite Bereich einschließlich beider Enddaten genau 10 Handelstage enthält?

3. In pandas 3.0 führen Sie df[df['volume'] > 1000]['close'] = 0 aus und stellen fest, dass df unverändert ist. Warum?

Automatischer Selbsttest zur eigenen Wiederholung. Ihre Antworten werden in Ihrem Browser geprüft und von uns weder eingesehen noch bewertet. Es ist keine Prüfung und kein Abschluss.

Ihr Fortschritt

„Erledigt“ bedeutet nur, dass Sie die Lektion als abgeschlossen markiert haben. Es ist kein Test Ihres Verständnisses. Fortschritt und Notizen werden nur in diesem Browser auf diesem Gerät gespeichert — nicht in einem Konto.