February 19, 2022

Определение границ числовых типов с Pandas и NumPy

Рассмотрим рекомендации работы с числовыми типами в Pandas, чтобы сэкономить память и процессорное время при обработке данных. В первую очередь, для этого следует не допускать выделения избыточных ресурсов под ваш датафрейм, что происходит по умолчанию. Система допускает такую "оплошность", так как не знает пределы значений чисел в колонках.

Эту задачу следует решить вам. Чтобы подыскать нужный тип, сначала вспомните диапазоны вмещаемых значений, для чего можете обратиться к функциям библиотеки NumPy - iinfo (целые числа) и finfo (дробные):

import numpy as np
import pandas as pd

print(np.iinfo('int8'))
print(np.iinfo('int16'))
print(np.iinfo('uint8'))
print(np.iinfo('uint16'))
np.finfo('float16')
np.finfo('float32')

Теперь, чтобы выбрать нужный тип, оцените пределы допустимых значений в вашей колонке, в чем поможет отображение текущих максимума и минимума :

pd.Series([1,-11.3, 30, 1111, 22222]).max(), pd.Series([1,-11.3, 30, 1111, 22222]).min()

Для задания требуемого типа воспользуйтесь либо параметром dtype при создании датафрейма (серии), либо методом astype для преобразования уже имеющегося:

Обратите внимание, что значения выходящие за пределы допустимых заменяются на -inf и inf. Также замечу, что по умолчанию для дробных чисел тип колонки устанавливается в float64:

Для преобразования целочисленных столбцов до "ближайшего" по размеру типа можете использовать функцию Pandas to_numeric с параметром downcast='integer':