У роботі з аналізом даних часто виникає потреба у групуванні даних за певними параметрами. Зокрема, коли ми працюємо з даними, що містять інтервальні значення, важливо враховувати всі можливі групи, навіть якщо в джерелі даних вони не представлені явно. У цій статті ми розглянемо, як використовувати бібліотеку Polars для ефективного включення всіх можливих значень типу Enum у результати групування даних.
Для початку давайте з’ясуємо, що таке Enum. Enum, або перелічувальний тип, визначається як набір унікальних значень, які представляють конкретні стани або категорії. У Python ми можемо використовувати Enum для зручного відображення категорійних даних. Зазвичай Enum використовується для обмеження варіантів значень певного поля, що допомагає уникнути помилок та зробити код більш зрозумілим та структурованим.
1 2 3 4 5 6 7 8 9 10 11 12 |
from enum import Enum class CutEnum(Enum): ZERO_TO_TEN = (0, 10) TEN_TO_TWENTY = (10, 20) TWENTY_TO_THIRTY = (20, 30) THIRTY_TO_FORTY = (30, 40) FORTY_TO_FIFTY = (40, 50) FIFTY_TO_SIXTY = (50, 60) SIXTY_TO_SEVENTY = (60, 70) SEVENTY_TO_EIGHTY = (70, 80) EIGHTY_TO_NINETY = (80, 90) NINETY_TO_HUNDRED = (90, 100) |
Тепер, коли у нас є Enum для представлення категорій даних, давайте розглянемо, як використовувати бібліотеку Polars для ефективного групування даних за цими категоріями.
У нашому прикладі ми використовуємо DataFrame з бібліотеки Polars, який містить колонку “a” з числовими значеннями. Ми використовуємо метод cut
, щоб розділити значення колонки “a” на інтервали ширини 10. Потім ми використовуємо метод group_by
для групування даних за цими інтервалами та метод agg
для підрахунку кількості значень у кожній групі.
1 2 3 4 5 6 7 |
import polars as pl # Створюємо DataFrame з даними df = pl.DataFrame({"a": [1, 5, 6, 10, 12, 45]}).with_columns( pl.col("a").cut(range(0, 100, 10)).alias("cut_a") ) # Групуємо дані та використовуємо agg для підрахунку значень у кожному bin result = df.group_by("cut_a").agg(pl.len()) |
Отриманий результат містить тільки групи, що були представлені у вихідному DataFrame. Однак нам потрібно включити всі можливі групи, включаючи ті, що відсутні в початкових даних, з показником null для таких груп.
Для досягнення цієї мети ми можемо скористатися перелічувальним типом Enum, який ми вже визначили. Ми можемо створити DataFrame зі всіма можливими значеннями Enum та об’єднати його з вихідним DataFrame. Потім ми можемо використати метод group_by
та agg
, щоб отримати бажаний результат.
1 2 3 4 5 6 7 |
# Створюємо DataFrame з усіма можливими значеннями Enum all_enum_values = [(category.value,) for category in CutEnum] all_enum_df = pl.DataFrame(all_enum_values, columns=["cut_a"]) # Об'єднуємо DataFrame з усіма значеннями Enum з вихідним DataFrame merged_df = all_enum_df.outer_join(df, "cut_a") # Групуємо дані та використовуємо agg для підрахунку значень у кожній групі final_result = merged_df.group_by("cut_a").agg(pl.len()) |
Отже, ми отримали бажаний результат з усіма можливими значеннями Enum, включаючи ті, які були відсутні в початкових даних, з показником null для таких груп. Це дозволяє ефективно використовувати Enum у Polars для групування даних та отримання повних результатів навіть у випадку відсутності деяких категорій у вихідних даних.
У цій статті ми розглянули, як використовувати Enum у бібліотеці Polars для ефективного включення всіх можливих значень у результати групування даних. Підходяще використання Enum дозволяє отримувати повні та зрозумілі результати аналізу даних, забезпечуючи при цьому структурованість та чіткість коду.