Auf einen Blick: Pandas-Datentypen sind entscheidend für ein effizientes Datenmanagement in Python und ermöglichen eine präzise Kontrolle über numerische Genauigkeit und Speichernutzung. Der Leitfaden untersucht verschiedene Pandas-Datentypen, darunter ganze Zahlen, Floatzahlen, Daten und kategoriale Daten.
- Pandas optimiert den Speicherverbrauch, indem es geeignete Datentypen für numerische Arrays auswählt.
- Das Verständnis von Datentypen hilft, Präzisionsprobleme zu vermeiden und die Leistung zu steigern.
Reguläres Python hat nicht viele Datentypen. Es enthält nur String-, Float-, Binär- und komplexe Zahlen. Es gibt keine längeren oder kurzen Zahlen. Es gibt keine 32- oder 64-Bit-Zahlen. Glücklicherweise ist das in den meisten Fällen egal. Es ist nur dann wichtig, wenn man absolute Präzision benötigt oder den minimalen Speicherbedarf für die Speicherung eines Wertes verwenden möchte.
Das ist wichtig, wenn man mit sehr großen Pandas-Arrays arbeitet, da Pandas, wenn man sich recht erinnert, durch die Speichergröße begrenzt ist. Man möchte also nicht 64 Bit verwenden, wenn man nur 8 Bit benötigt.
Python-Numerische Präzision
Größe und Präzision sind unterschiedlich. Aber es lohnt sich, sich die Präzision anzuschauen, um einige der Einschränkungen von Python zu verstehen. Präzision bedeutet die Anzahl der Dezimalstellen.
Zum Beispiel ist 1/3 im Dezimalformat die unendliche Reihe 0,3333333333333... Der Computer ist nicht unendlich, daher stoppt Python irgendwann die Dezimalentwicklung und rundet diese Zahl ab.
Dieses Verhalten hat einige Eigenheiten.
Wann ist Null gleich Null?
Schau dir diesen Code an. Er berechnet die Quadratwurzel von 2 (oder einer anderen Zahl) mit einer 3.000 Jahre alten Technik. Der Algorithmus beendet, wenn die Differenz zwischen zwei Zahlen 0 beträgt.
a=2
a1 = (a/2)+1
b1 = a/a1
aminus1 = a1
bminus1 = b1
while (aminus1-bminus1 != 0):
an = 0.5 * (aminus1 + bminus1)
bn = a / an
aminus1 = an
bminus1 = bn
print(an,bn,an-bn)
produziert:
1.5 1.3333333333333333 0.16666666666666674
1.4166666666666665 1.411764705882353 0.004901960784313486
1.4142156862745097 1.41421143847487 4.2477996395895445e-06
1.4142135623746899 1.4142135623715002 3.1896707497480747e-12
1.414213562373095 1.4142135623730951 -2.220446049250313e-16
Aber man sieht, oben oben, dass die Differenz niemals 0 ist. Stattdessen rundet der Computer offenbar in diesem Fall auf 16 signifikante Ziffern ab. Man sieht das – wenn er die Antwort 1,414213562373095 erreicht, läuft der Code weiter. Das liegt daran, dass die Differenz zwischen den beiden Werten trotz des arithmetischen Mittelwerts der beiden Werte nicht auf 0 konvergiert.
Wenn du verstehen möchtest, wie dieser Algorithmus funktioniert, schau dir diesen Clip an:
Falls du eine präzise Kontrolle über die Anzahl der Dezimalstellen möchtest, kannst du die Python-Klasse Decimal verwenden. So läuft der Code nicht in einer Endlosschleife.
from decimal import *
getcontext().prec = 5
a=Decimal(2)
a1 = Decimal((a/2)+1)
b1 = Decimal(a/a1)
aminus1 = a1
bminus1 = b1
i=0
while (Decimal(aminus1-bminus1) != Decimal(0)):
an = Decimal(Decimal(0.5) * (aminus1 + bminus1))
bn = Decimal(a / an)
aminus1 = an
bminus1 = bn
i=i+1
print(i,an,bn,an-bn)
Es läuft dreimal und hört auf, wobei er sich auf den Wert von 1,4142 als Quadratwurzel von 2 festlegt. Wir könnten mehr Dezimalstellen hinzufügen, um mehr Präzision zu erzielen.
1 1.5 1.3333 0.1667
2 1.4166 1.4118 0.0048
3 1.4142 1.4142 0.0000
Numerische Datentypen von NumPy & Pandas
NumPy geht noch viel weiter als das. Es bietet eine Low-Level-Schnittstelle zu C-Typ-Numeriktypen. (Mit anderen Worten, jene Zahlen, die man beim Schreiben von Code in der C-Sprache deklarieren könnte). Auch wenn wir diese hier noch nicht besprechen werden, gibt es auch verschiedene Datentypen an, die geeignet sind für:
- Zeitreihe
- Intervalle
- Daten
- Kategoriale Daten
- Und so weiter.
Unten ist die vollständige Liste. Links ist der Objektname. Rechts ist der String-Alias zu sehen.
| Datentyp | Alias |
|---|---|
| Int64Dtype, ... | 'int8', 'int16', 'int32', 'int64', 'UInt8', 'UInt16', 'UInt32', 'UInt64' |
|
IntervalDtyp |
'Interval', 'Interval', 'Interval[<numpy_dtype>]', 'Interval[datetime64[ns, <tz>]]', 'Interval[timedelta64[<freq>]]' |
| DatetimeTZDtype | 'datetime64[ns, <tz>]' |
| KategorialDtyp | 'Kategorie' |
| PeriodDtyp | 'Period[<freq>]', 'Period[<freq>]' |
| SparseDtype | 'Sparse', 'Sparse[int]', 'Sparse[float]' |
| BooleanDtyp | 'boolesch' |
| StringDtype | 'String' |
| keines der oben genannten | 'Objekt' |
Ganze Zahlen & Floats
Hier zum Beispiel haben wir ein Datum, eine Gleitsam, ein Boolesch und eine ganze Zahl. Wir können Pandas erlauben, für jeden numerischen Typ eine Skala auszuwählen. Oder wir geben das explizit an. Wenn man es nicht explizit angibt, wählt Pandas entweder eines oder verwendet das generische Objekt.
import pandas as pd
import datetime
df= pd.DataFrame({
"a": datetime.datetime(2020,12,14),
"b": 1.000003,
"c": True,
"d": 3
}, index=[1,2,3,4])
Fragen Sie Pandas nach den Datentypen:
df.dtypes
Man sieht, dass es 64 Bit auswählt, um 1,000003 und 3 zu speichern. Man benötigt nur 2 Bits, um die Zahl 3 zu speichern, aber es gibt keine Option für 2-Bit-Zahlen. Deshalb würden wir int8 verwenden und 8 Bits, wenn Platz ein Problem wäre.
a datetime64[ns]
b float64
c bool
d int64
dtype: object
Erstellen Sie nun eine Pandas-Reihe aus 4 ganzen Zahlen und erzwingen Sie sie zu einer 8-Bit-Zahl.
s=pd.Series([10,20,30,40],index=[1,2,3,4]).astype('int8')
Verwenden Sie dtypes , um die Datentypen anzuzeigen:
s.dtypes
Ergebnisse in:
dtype('int8')
Der String 'int8' ist ein Alias. Du kannst den dtype auch mit der Pandas-Objektrepräsentation dieses pd zuweisen. Int64Dtype.
t = pd.Int64Dtype
pd.Series([1,2,3,4], dtype=t)
Verwandte Literatur
Pandas Guide
- Pandas-Einführung & Tutorials für Anfänger
- Pandas: Wie man CSV- und JSON-Dateien liest
- Wie man ein Pandas-Dataframe aus einem Wörterbuch erstellt
- Wie man Daten in Pandas gruppiert, verkettet und zusammenführt
- Pandas-Datentypen
- Umgang mit fehlenden Daten in Pandas: NaN-Werte erklärt
- NumPy-Einführung mit Beispielen
- Verwendung von StringIO, um getrennte Textdateien in NumPy zu lesen
- Verwendung der NumPy-Bincount-Statistikfunktion
- Top NumPy Statistische Funktionen & Verteilungen
Diese Beiträge sind meine eigenen und spiegeln nicht unbedingt die Position, Strategien oder Meinung von BMC wider.