Ein Array mit Labels
Eine pandas-Series ist ein eindimensionales Array, in dem jeder Wert ein Label trägt, das im Index der Series steht. Statt sich zu merken, dass Position 1 Microsoft ist, fragen Sie prices["MSFT"] ab. Eine Series hat einen name, einen dtype wie ein NumPy-Array und unterstützt dieselbe Arithmetik auf ganzen Arrays, prices * 2, prices.mean() und prices > 180 funktionieren also. Importiert wird pandas üblicherweise als import pandas as pd; es baut auf NumPy auf, das Sie in den vorigen Themen kennengelernt haben.
import pandas as pd
prices = pd.Series([184.25, 410.2, 171.0], index=["AAPL", "MSFT", "GOOG"], name="price")
print(prices)
# AAPL 184.25
# MSFT 410.20
# GOOG 171.00
# Name: price, dtype: float64
print(prices["AAPL"], prices.iloc[1]) # 184.25 410.2 by label, by position
print(prices.index.tolist()) # ['AAPL', 'MSFT', 'GOOG']
print(prices[prices > 180]) # keeps AAPL and MSFT, labels intact
print(prices.mean(), prices.idxmax()) # 255.15 MSFT
# A dict also builds a Series: keys become the index
print(pd.Series({"AAPL": 1, "MSFT": 2}))Ausrichtung: Operationen gleichen Labels ab, nicht Positionen
Beim Kombinieren zweier Series richtet pandas sie zuerst nach Labels aus. Labels, die nur in einer vorkommen, ergeben im Ergebnis NaN (not a number, die Markierung für fehlende Werte), und der Index des Ergebnisses ist die Vereinigung beider Indizes. Genau das braucht man für Positionen auf verschiedenen Konten. Mit a.add(b, fill_value=0) wird ein fehlendes Label wie null behandelt, statt NaN zu erzeugen. Auch das Lesen per Label unterscheidet sich von NumPy: s["MSFT"] ist per Label, s.iloc[1] per Position, und ein nicht vorhandenes Label löst KeyError aus.
import pandas as pd
a = pd.Series([100, 200], index=["AAPL", "MSFT"])
b = pd.Series([50, 10], index=["MSFT", "GOOG"])
print(a + b)
# AAPL NaN
# GOOG NaN
# MSFT 250.0
print(a.add(b, fill_value=0))
# AAPL 100.0
# GOOG 10.0
# MSFT 250.0
# Selecting by a list of labels, and asking for one that is missing
prices = pd.Series([184.25, 410.2], index=["AAPL", "MSFT"])
print(prices.reindex(["MSFT", "TSLA"]).tolist()) # [410.2, nan]Sortieren, Ranking und Umbasieren
s.sort_values(ascending=False) sortiert nach Wert und nimmt die Labels mit, s.sort_index() sortiert nach Label, und s.abs() bildet Beträge. Sortieren plus Slicing findet die größten Bewegungen: r.abs().sort_values(ascending=False).index[:3] liefert die drei Labels mit der größten absoluten Rendite. Um Werte auf unterschiedlichen Preisniveaus zu vergleichen, basieren Sie jeden auf 100 am Anfang: s / s.iloc[0] * 100, was Index und Namen behält. Fehlende Werte (NaN) überspringen sum, mean und Co.; s.isna() markiert sie.
import pandas as pd
r = pd.Series([0.01, -0.03, 0.02], index=["x", "y", "z"])
print(r.abs().sort_values(ascending=False))
# y 0.03
# z 0.02
# x 0.01
# dtype: float64
prices = pd.Series([184.25, 410.2, 171.0], index=["AAPL", "MSFT", "GOOG"], name="price")
print(prices / prices.iloc[0] * 100) # rebased to 100 at the first value
# AAPL 100.000000
# MSFT 222.632293
# GOOG 92.808684
# Name: price, dtype: float64
gappy = pd.Series([1.0, None, 3.0])
print(gappy.sum(), gappy.mean(), gappy.isna().tolist()) # 4.0 2.0 [False, True, False]import pandas as pd
# A stray space and a lower-case letter make "the same" symbol two labels
raw = pd.Series([1, 2], index=["AAPL", "aapl "])
print(raw.index.is_unique) # True: they look different
raw.index = raw.index.str.strip().str.upper() # clean the labels
print(raw.index.is_unique) # False: now both are "AAPL"
print(raw["AAPL"].tolist()) # [1, 2] a duplicate label returns a Series
merged = raw.groupby(level=0).sum() # combine duplicates (groupby comes soon)
print(merged.to_dict()) # {'AAPL': 3}"AAPL" und "aapl " sind verschiedene Labels, ein Tippfehler erzeugt also stillschweigend NaN-Zeilen; bereinigen Sie Labels (strip, upper) vor dem Kombinieren. Ein Index kann Duplikate enthalten, dann liefert s["AAPL"] eine Series statt eines Werts; prüfen Sie s.index.is_unique bei Daten mit einem Wert pro Label. Operationen liefern neue Series und lassen das Original unberührt, das Verhalten, das die Lab-Tests prüfen.pd.Series(values, index=labels, name=...); per Labels["A"]oder Positions.iloc[0]lesen.- Operationen richten sich nach Labels aus (Vereinigungsindex,
NaNbei Fehlen);a.add(b, fill_value=0)behandelt eine Lücke als 0. sort_values,abs,idxmax,s / s.iloc[0] * 100; Ergebnisse sind neue Series, das Original bleibt unverändert.
Als Nächstes: pandas-DataFrames, Tabellen aus Series, die sich einen Index teilen.
Lab: Was bewertet wird
- Mit
price_seriesPreise nach Symbol beschriften25 Pkt. - Mit
total_exposurezwei Konten nach Label addieren25 Pkt. - Mit
top_moversdie größten Bewegungen finden25 Pkt. - Mit
rebase_to_100jeden Preis auf Basis 100 setzen25 Pkt.