Биннинг данных в Pandas (cut / qcut)
Биннинг данных (также называемый бакетированием) — это процесс дискретизации непрерывных переменных, обычно используемый при предварительной обработке данных, конструировании признаков и анализе данных.
cut: равноширинный биннинг
cutРазделите данные на интервалы равной ширины.
Пример
import pandas as pd
import numpy as np
# Создать данные о возрасте
ages = pd.Series([5, 15, 25, 35, 45, 55, 65, 75, 85])
print("Исходные данные:")
print(ages.tolist())
print()
# Равноширинный биннинг (5 интервалов)
bins = [0, 20, 40, 60, 80, 100]
labels = ["Ребёнок", "Молодёжь", "Средний возраст", "Предпожилой", "Пожилой"]
age_bins = pd.cut(ages, bins=bins, labels=labels)
print("Результат равноширинного биннинга:")
print(age_bins)
print()
# Включить правую границу
age_bins2 = pd.cut(ages, bins=4)
print("Автоматическое разбиение на интервалы равной ширины:")
print(age_bins2)
import numpy as np
# Создать данные о возрасте
ages = pd.Series([5, 15, 25, 35, 45, 55, 65, 75, 85])
print("Исходные данные:")
print(ages.tolist())
print()
# Равноширинный биннинг (5 интервалов)
bins = [0, 20, 40, 60, 80, 100]
labels = ["Ребёнок", "Молодёжь", "Средний возраст", "Предпожилой", "Пожилой"]
age_bins = pd.cut(ages, bins=bins, labels=labels)
print("Результат равноширинного биннинга:")
print(age_bins)
print()
# Включить правую границу
age_bins2 = pd.cut(ages, bins=4)
print("Автоматическое разбиение на интервалы равной ширины:")
print(age_bins2)
Вернуть категории и границы
Пример
import pandas as pd
import numpy as np
ages = pd.Series([5, 15, 25, 35, 45])
# Вернуть индексы интервалов
result = pd.cut(ages, bins=4, labels=False)
print("Индексы интервалов:")
print(result)
print()
# Вернуть границы интервалов
result = pd.cut(ages, bins=4, retbins=True)
print("Границы интервалов:")
print(result[1])
import numpy as np
ages = pd.Series([5, 15, 25, 35, 45])
# Вернуть индексы интервалов
result = pd.cut(ages, bins=4, labels=False)
print("Индексы интервалов:")
print(result)
print()
# Вернуть границы интервалов
result = pd.cut(ages, bins=4, retbins=True)
print("Границы интервалов:")
print(result[1])
qcut равночастотный биннинг
qcutРазделите данные на интервалы с примерно одинаковым количеством точек данных.
Пример
import pandas as pd
import numpy as np
# Неравномерно распределённые данные
data = pd.Series([1, 1, 1, 2, 3, 4, 5, 10, 20, 30, 50, 100])
print("Исходные данные:")
print(data.tolist())
print()
# Равноширинный биннинг (может привести к неравномерному распределению)
cut_result = pd.cut(data, q=4)
print("Равноширинный биннинг:")
print(cut_result.value_counts())
print()
# Равночастотный биннинг (примерно одинаковое количество точек данных на интервал)
qcut_result = pd.qcut(data, q=4)
print("Равночастотный биннинг:")
print(qcut_result.value_counts())
import numpy as np
# Неравномерно распределённые данные
data = pd.Series([1, 1, 1, 2, 3, 4, 5, 10, 20, 30, 50, 100])
print("Исходные данные:")
print(data.tolist())
print()
# Равноширинный биннинг (может привести к неравномерному распределению)
cut_result = pd.cut(data, q=4)
print("Равноширинный биннинг:")
print(cut_result.value_counts())
print()
# Равночастотный биннинг (примерно одинаковое количество точек данных на интервал)
qcut_result = pd.qcut(data, q=4)
print("Равночастотный биннинг:")
print(qcut_result.value_counts())
Укажите квантили
Пример
import pandas as pd
data = pd.Series(range(1, 101))
# Разделить по указанным квантилям
result = pd.qcut(data, q=[0, 0.1, 0.3, 0.7, 0.9, 1])
print("Разделено по квантилям:")
print(result.value_counts().sort_index())
data = pd.Series(range(1, 101))
# Разделить по указанным квантилям
result = pd.qcut(data, q=[0, 0.1, 0.3, 0.7, 0.9, 1])
print("Разделено по квантилям:")
print(result.value_counts().sort_index())
Практика: анализ данных
Пример
import pandas as pd
import numpy as np
# Смоделировать данные о расходах клиентов
np.random.seed(42)
customers = pd.DataFrame({
"ID клиента": range(1, 101),
"Сумма расходов": np.random.exponential(500, 100) + 100
})
# Разделить на разные уровни расходов
customers["Spending level"] = pd.cut(
customers["Spending amount"],
bins=[0, 300, 500, 800, float("inf")],
labels=["Низкий", "Средний", "Высокий", "VIP"]
)
# Подсчитать количество клиентов на каждом уровне
print("Распределение по уровням расходов:")
print(customers["Spending level"].value_counts())
print()
# Вычислить средние расходы по уровням
print("Средние расходы по уровням:")
print(customers.groupby("Spending level")["Spending amount"].mean().round(2))
import numpy as np
# Смоделировать данные о расходах клиентов
np.random.seed(42)
customers = pd.DataFrame({
"ID клиента": range(1, 101),
"Сумма расходов": np.random.exponential(500, 100) + 100
})
# Разделить на разные уровни расходов
customers["Spending level"] = pd.cut(
customers["Spending amount"],
bins=[0, 300, 500, 800, float("inf")],
labels=["Низкий", "Средний", "Высокий", "VIP"]
)
# Подсчитать количество клиентов на каждом уровне
print("Распределение по уровням расходов:")
print(customers["Spending level"].value_counts())
print()
# Вычислить средние расходы по уровням
print("Средние расходы по уровням:")
print(customers.groupby("Spending level")["Spending amount"].mean().round(2))