ポイント: Pandasのデータ型は、Pythonにおける効率的なデータ管理に不可欠であり、数値精度とメモリ使用量を正確に制御することを可能にします。このガイドでは、整数、浮動小数点数、日付、およびカテゴリーデータを含むさまざまなPandasデータ型を探ります。
- Pandasは数値配列に適切なデータ型を選択することでメモリ使用量を最適化します。
- データ型を理解することで精度の問題を回避し、パフォーマンスを向上させることができます。
通常の Python には多くのデータ型がありません。文字列、浮動小数点、バイナリ、および複素数のみです。長いものも短いものもありません。32ビットまたは64ビットの数もありません。幸運なことに、ほとんどの状況では、これは問題になりません。絶対的な精度が必要な場合や、値を格納するための最小限のメモリを使用したい場合にのみ問題になります。
非常に大きなパンダ配列を扱っているときに重要です。パンダは、覚えているかもしれませんが、メモリサイズに制限されているので、必要なだけのビットを使用したいと思うでしょう。
Pythonの数値精度
サイズと精度は異なります。しかし、Pythonのいくつかの制限を理解するために精度を見ておく価値があります。 精度 とは、小数点以下の桁数を意味します。
例えば、⅓の小数形式は無限級数0.3333333333333...です。コンピュータは無限ではないので、ある時点でPythonは小数の拡張を停止し、その数を丸めます。
この動作にはいくつかの奇妙な点があります。
ゼロはいつゼロと等しいか?
このコードを見てください。これは、3000年前の技術を使用して2の平方根を計算します。このアルゴリズムは、2つの数の差が0になると終了します。
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)
生成されます:
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
しかし、上記のように、差は決して0にはなりません。代わりにコンピュータは丸めます。この場合、明らかに16桁の有効数字で丸めています。1.414213562373095という答えに達すると、コードは実行を続けます。その理由は、2つの値の差が0に収束しないからです。
このアルゴリズムがどのように機能するかを理解したい場合は、このクリップをチェックしてください:
小数点以下の桁数を正確に制御したい場合は、Pythonクラス Decimalを使用できます。これにより、そのコードが無限ループで実行されるのを防ぎます。
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)
3回ループして終了し、2の平方根として1.4142の値に落ち着きます。より多くの小数点以下の桁数を追加して、より高い精度を得ることができます。
1 1.5 1.3333 0.1667
2 1.4166 1.4118 0.0048
3 1.4142 1.4142 0.0000
NumPy & Pandasの数値データ型
NumPyはそれ以上のことを提供します。C型数値型への低レベルインターフェースを提供します。(言い換えれば、C言語でコードを書く際に宣言できる数値です)。ここではそれについてはまだ議論しませんが、以下のデータ型も提供します:
- 時系列
- 間隔
- 日付
- カテゴリデータ
- その他
以下は完全なリストです。左側にはオブジェクト名があります。右側には文字列エイリアスがあります。
| データ型 | エイリアス |
|---|---|
| Int64Dtype, ... | 'Int8', 'Int16', 'Int32', 'Int64', 'UInt8', 'UInt16', 'UInt32', 'UInt64' |
|
IntervalDtype |
'interval', 'Interval', 'Interval[<numpy_dtype>]', 'Interval[datetime64[ns, <tz>]]', 'Interval[timedelta64[<freq>]]' |
| DatetimeTZDtype | 'datetime64[ns, <tz>]' |
| CategoricalDtype | 'category' |
| PeriodDtype | 'period[<freq>]', 'Period[<freq>]' |
| SparseDtype | 'Sparse', 'Sparse[int]', 'Sparse[float]' |
| BooleanDtype | 'boolean' |
| StringDtype | 'string' |
| 上記のいずれでもない | 'object' |
整数と浮動小数点
ここには、日付、浮動小数点、ブール値、整数の例があります。パンダが各数値型のスケールを選択することを許可できます。または、明示的に指定することもできます。明示的に指定しない場合、パンダは一つを選択するか、一般的なオブジェクトを使用します。
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])
パンダにデータ型を尋ねてみてください:
df.dtypes
1.000003と3を格納するために64ビットを選択することがわかります。数3を格納するには2ビットのみが必要ですが、2ビットの数のオプションはありません。ですので、スペースが問題であればint8を使用し、8ビットを使用します。
a datetime64[ns]
b float64
c bool
d int64
dtype: object
今、4つの整数のPandasシリーズを作成し、8ビット数値に強制変換します。
s=pd.Series([10,20,30,40],index=[1,2,3,4]).astype('int8')
dtypesを使用してデータ型を表示します:
s.dtypes
結果は:
dtype('int8')
文字列 'int8' はエイリアスです。また、pd.Int64DtypeのPandasオブジェクト表現を使用してdtypeを割り当てることもできます。
t = pd.Int64Dtype
pd.Series([1,2,3,4], dtype=t)
関連する読み物
パンダのガイド
これらの投稿は私自身の意見であり、BMCの立場、戦略、または意見を必ずしも表しているわけではありません。