Яку мову вибрати для роботи з даними - R або Python? Обидва! Мігруємо з pandas на tidyverse та data.table і назад

За запитом R або Python в інтернеті ви знайдете мільйони статей та кілометрових обговорень на тему якої з них краще, швидше та зручніше для роботи з даними. Але, на жаль, особливої ​​користі всі ці статті та суперечки не несуть.

Яку мову вибрати для роботи з даними - R або Python? Обидва! Мігруємо з pandas на tidyverse та data.table і назад

Мета цієї статті – порівняти основні прийоми обробки даних у найбільш популярних пакетах обох мов. І допомогти читачам максимально швидко опанувати те, що вони ще не знають. Для тих хто пише на Python дізнатися як виконувати все те ж саме в R, і навпаки.

Під час статті ми розберемо синтаксис найпопулярніших пакетів на R. Це пакети, що входять до бібліотеки. tidyverse, а також пакет data.table. І порівняємо їх синтаксис з pandas, найбільш популярним пакетом для аналізу даних у Python.

Ми крок за кроком пройдемо весь шлях аналізу даних від їх завантаження до виконання аналітичних, віконних функцій засобами Python і R.

Зміст

Ця стаття може використовуватися як шпаргалка, якщо ви забули як в одному з цих пакетів виконати деяку операцію з обробки даних.

Яку мову вибрати для роботи з даними - R або Python? Обидва! Мігруємо з pandas на tidyverse та data.table і назад

  1. Основні відмінності синтаксису в R та Python
    1.1. Звернення до функцій пакетів
    1.2. Присвоєння
    1.3. Індексація
    1.4. Методи та ОВП
    1.5. Пайплайни
    1.6. Структури даних
  2. Кілька слів про пакети, які ми будемо використовувати
    2.1. охайний
    2.2. дані.таблиця
    2.3. панди
  3. Встановлення пакетів
  4. завантаження даних
  5. Створення датафреймів
  6. Вибір потрібних стовпців
  7. Фільтрування рядків
  8. Угруповання та агрегація
  9. Вертикальне об'єднання таблиць (UNION)
  10. Горизонтальне об'єднання таблиць (JOIN)
  11. Найпростіші віконні функції та обчислювані стовпці
  12. Таблиця відповідності методів обробки даних у R та Python
  13. Висновок
  14. Невелике опитування про те, який пакет ви використовуєте

Якщо ви цікавитеся аналізом даних можливо вам будуть корисні мої телеграма и YouTube канали. Більшість контенту яких присвячені мові R.

Основні відмінності синтаксису в R та Python

Щоб вам було простіше з переходом з Python до R, або навпаки, наведу кілька основних моментів, на які необхідно звернути увагу.

Звернення до функцій пакетів

Після завантаження пакета R, для звернення до його функцій немає необхідності вказувати ім'я пакета. У більшості випадків R не прийнято, але припустимо. Ви взагалі можете не імпортувати пакет якщо в коді вам знадобиться якась одна його функція, а просто викликати її вказавши назву пакета та ім'я функції. Розділювачем між назвою пакета і функції R служить подвійна двокрапка package_name::function_name().

У Python навпаки, класикою вважається звернення до функцій пакета, явно вказавши його ім'я. При завантаженні пакета, як правило, йому надають скорочене ім'я, наприклад для pandas зазвичай використовується псевдонім pd. Звертання до функції пакету йде через точку package_name.function_name().

Присвоєння

У R для надання значення об'єкту прийнято використовувати стрілку obj_name <- value, хоча допускається і одинарний знак рівності, але одинарний знак рівності R використовують в основному для передачі значень аргументів функцій.

У Python присвоювання здійснюється виключно одинарним знаком рівності obj_name = value.

Індексація

Тут також є досить вагомі відмінності. R індексація починається з одиниці і включає в результуючий діапазон всі зазначені елементи,

Python індексація починається з нуля і вибирається діапазон не включається останній елемент зазначений в індексації. Так конструкція x[i:j] Python не буде включати елемент j.

Також є відмінності в негативній індексації, R запис x[-1] поверне всі елементи вектора крім останнього. У Python аналогічний запис поверне лише останній елемент.

Методи та ОВП

У R по своєму реалізовано ОВП, про це я писав у статті "ООП у мові R (частина 1): S3 класи". Загалом R функціональна мова, і все в ній побудовано на функціях. Тому, наприклад, для користувачів Excel перейти на tydiverse буде простіше, ніж на pandas. Хоча можлива ця моя суб'єктивна думка.

Якщо коротко, то об'єкти R не мають методів (якщо говорити про S3 класи, але є й інші реалізації ОВП, які зустрічаються значно рідше). Існують лише узагальнені функції, які залежно від класу об'єкта по-різному їх обробляють.

Пайплайни

Можливо ця назва для pandas буде не зовсім коректно, але спробую пояснити сенс.

Щоб не зберігати проміжні обчислення і не плодити в робочому оточенні непотрібні об'єкти, ви можете використовувати своєрідний конвеєр. Тобто. передавати результат обчислення з однієї функції наступну, і зберігати проміжні результати.

Візьмемо наступний приклад коду, в якому ми зберігаємо в окремі об'єкти проміжні обчислення:

temp_object <- func1()
temp_object2 <- func2(temp_object )
obj <- func3(temp_object2 )

Ми послідовно виконали 3 операції і результат кожної зберегли в окремий об'єкт. Але насправді ці проміжні об'єкти нам не потрібні.

Або ще гірше, але звичніше користувачам Excel.

obj  <- func3(func2(func1()))

В даному випадку ми не зберігали проміжні результати обчислень, але читати код із вкладеними один, в одного функціями вкрай не зручно.

Ми розглядатимемо кілька підходів до обробки даних у R, і в них по-різному виконуються подібні операції.

Пайплайни у ​​бібліотеці tidyverse реалізуються оператором %>%.

obj <- func1() %>% 
            func2() %>%
            func3()

Таким чином ми беремо результат роботи func1() і передаємо його як перший аргумент в func2(), далі результат цього обчислення передаємо як перший аргумент func3(). І, зрештою, всі виконані обчислення записуємо в об'єкт obj <-.

Краще слів усе вищеописане ілюструє цей мем:
Яку мову вибрати для роботи з даними - R або Python? Обидва! Мігруємо з pandas на tidyverse та data.table і назад

В data.table схожим чином використовуються ланцюжки.

newDT <- DT[where, select|update|do, by][where, select|update|do, by][where, select|update|do, by]

У кожній із квадратних дужок ви можете використати результат попередньої операції.

В pandas такі операції поділяються точкою.

obj = df.fun1().fun2().fun3()

Тобто. ми беремо нашу таблицю df і використовуємо її метод fun1(), далі до отриманого результату застосовуємо метод fun2(), після fun3(). Отриманий результат зберігаємо в об'єкт об'єкт .

Структури даних

Структури даних у R і Python схожі, але мають різні назви.

Опис
Назва в R
Назва в Python / pandas

Таблична структура
data.frame, data.table, tibble
DataFrame

Одновимірний список значень
Вектор
Series в pandas або список (list) у чистому Python

Багаторівнева не таблична структура
Список (List)
Словник (dict)

Деякі інші особливості та відмінності синтаксису ми розглянемо далі.

Кілька слів про пакети, які ми будемо використовувати

Спочатку розповім трохи про пакети з якими в ході цієї статті ви познайомитеся.

охайний

Офіційний сайт: tidyverse.org
Яку мову вибрати для роботи з даними - R або Python? Обидва! Мігруємо з pandas на tidyverse та data.table і назад
Бібліотека tidyverse написана Хедлі Вікхемом, старшим науковим співробітником RStudio. tidyverse складається з великого набору пакетів спрощують обробку даних, 5 з яких входять в топ 10 CRAN, що завантажуються з репозиторію.

Ядро бібліотеки складається з таких пакетів: ggplot2, dplyr, tidyr, readr, purrr, tibble, stringr, forcats. Кожен із цих пакетів спрямований на вирішення певної задачі. Наприклад dplyr створений для маніпуляції з даними, tidyr для приведення даних до акуратного вигляду, stringr спрощує роботу з рядками, а ggplot2 є одним із найбільш популярних інструментів для візуалізації даних.

перевагою tidyverse є простота і легко читання синтаксису, який багато в чому схожий на мову запитів SQL.

дані.таблиця

Яку мову вибрати для роботи з даними - R або Python? Обидва! Мігруємо з pandas на tidyverse та data.table і назадОфіційний сайт: r-datatable.com

автором data.table є Метт Доул з H2O.ai.

Перший реліз бібліотеки відбувся 2006 року.

Синтаксис пакета не такий зручний як у tidyverse і більше нагадує класичні датафрейми R, але при цьому значно розширені по функціоналу.

Усі маніпуляції з таблицею в даному пакеті описуються у квадратних дужках, і якщо перекласти синтаксис data.table на SQL, то вийде приблизно таке: data.table[ WHERE, SELECT, GROUP BY ]

Сильною стороною цього пакета є швидкість обробки великих обсягів даних.

панди

Офіційний сайт: pandas.pydata.org Яку мову вибрати для роботи з даними - R або Python? Обидва! Мігруємо з pandas на tidyverse та data.table і назад

Назва бібліотеки походить від економетричного терміна «панельні дані» (англ. panel data), який використовується для опису багатовимірних структурованих наборів інформації.

автором pandas є американець Уес Мак-Кінні.

Коли йдеться про аналіз даних на Python, рівних pandas ні. Дуже багатофункціональний, високорівневий пакет, який дозволяє провести з даними будь-які маніпуляції починаючи від завантаження даних з будь-яких джерел до їх візуалізації.

Встановлення додаткових пакетів

Пакети про які йтиметься в цій статті не входять до базових дистрибутивів R і Python. Хоча є невелике застереження, якщо ви встановили дистрибутив Anaconda, то ставити додатково pandas не вимагається.

Встановлення пакетів у R

Якщо ви хоч раз відкривали середовище розробки RStudio напевно ви і так вже знаєте як встановити потрібний пакет в R. Для установки пакетів скористайтеся стандартною командою install.packages() запустивши її у самому R.

# установка пакетов
install.packages("vroom")
install.packages("readr")
install.packages("dplyr")
install.packages("data.table")

Після встановлення пакети необхідно підключити, для чого в більшості випадків використовується команда library().

# подключение или импорт пакетов в рабочее окружение
library(vroom)
library(readr)
library(dplyr)
library(data.table)

Встановлення пакетів у Python

Отже, якщо у вас встановлений чистий Python, то pandas вам необхідно довстановлювати руками. Відкриваємо командний рядок, або термінал, залежно від вашої операційної системи та вводимо наступну команду.

pip install pandas

Після чого повертаємось до Python і імпортуємо встановлений пакет командою import.

import pandas as pd

завантаження даних

Видобуток даних одна із найважливіших етапів аналізу даних. І Python і R за бажання надають вам великі можливості для отримання даних із будь-яких джерел: локальні файли, файли з інтернету, веб-сайти, всілякі бази даних.

Яку мову вибрати для роботи з даними - R або Python? Обидва! Мігруємо з pandas на tidyverse та data.table і назад

У ході статті ми будемо використовувати декілька наборів даних:

  1. Два вивантаження з Google Analytics.
  2. Набір даних про пасажирів титаніки.

Усі дані лежать у мене на GitHub у вигляді csv та tsv файлів. Від куди ми їх і запитуватимемо.

Завантаження даних у R: tidyverse, vroom, readr

Для завантаження даних у бібліотеці tidyverse призначені два пакети: vroom, readr. vroom Більш сучасний, але в майбутньому можливо пакети будуть об'єднані.

Цитата з офіційної документації vroom.

vroom vs readr
What does the release of vroom означає для readr? Для того, щоб ми планували продовжити два пакети evolve separately, але добре, що будуть unite пакети в майбутньому. Одна згода на вроки лайки, reading є певні дані проблем може бути повідомлена вгору, якщо ви хотіли б, щоб вони потрібні деякі думки.

vroom проти readr
Що означає випуск vroom для readr? На даний момент ми плануємо розвивати обидва пакети окремо, але, ймовірно, ми об'єднаємо їх у майбутньому. Одним із недоліків лінивого читання vroom є те, що про деякі проблеми з даними не можна повідомити заздалегідь, тому необхідно подумати про те, як краще їх об'єднати.

У цій статті ми розглянемо обидва пакети для завантаження даних:

Завантаження даних у R: пакет vroom

# install.packages("vroom")
library(vroom)

# Чтение данных
## vroom
ga_nov  <- vroom("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/ga_nowember.csv")
ga_dec  <- vroom("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/ga_december.csv")
titanic <- vroom("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/titanic.csv")

Завантаження даних у R: readr

# install.packages("readr")
library(readr)

# Чтение данных
## readr
ga_nov  <- read_tsv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/ga_nowember.csv")
ga_dec  <- read_tsv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/ga_december.csv")
titanic <- read_csv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/titanic.csv")

У пакеті vroom, незалежно від формату даних csv / tsv завантаження здійснюється однойменною функцією vroom(), у пакеті readr ми використовуємо під кожний формат свою функцію read_tsv() и read_csv().

Завантаження даних у R: data.table

В data.table для завантаження даних є функція fread().

Завантаження даних у R: пакет data.table

# install.packages("data.table")
library(data.table)

## data.table
ga_nov  <- fread("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/ga_nowember.csv")
ga_dec  <- fread("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/ga_december.csv")
titanic <- fread("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/titanic.csv")

Завантаження даних у Python: pandas

Якщо порівнювати з R пакетами, то в даному випадку найбільш близьким за синтаксисом до pandas буде readr, т.к. pandas вміє запитувати дані від будь-куди, і в цьому пакеті присутня ціла родина функцій read_*().

  • read_csv()
  • read_excel()
  • read_sql()
  • read_json()
  • read_html()

І багато інших функцій призначених для читання даних із різних форматів. Але для наших цілей достатньо read_table() або read_csv() з використанням аргументу Вересень для вказівки роздільника стовпців.

Завантаження даних у Python: pandas

import pandas as pd

ga_nov  = pd.read_csv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/russian_text_in_r/ga_nowember.csv", sep = "t")
ga_dec  = pd.read_csv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/russian_text_in_r/ga_december.csv", sep = "t")
titanic = pd.read_csv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/russian_text_in_r/titanic.csv")

Створення датафреймів

В таблиці титанічна, яку ми завантажили, є поле секс, у якому зберігається ідентифікатор підлоги пасажира

Але для зручнішого представлення даних у розрізі статі пасажира слід використовувати не код статі, а назву.

Для цього ми створимо невеликий довідник, таблицю в якій буде всього 2 стовпці (код та назва підлоги) та 2 рядки відповідно.

Створення датафрейму в R: tidyverse, dplyr

У наведеному нижче прикладі коду ми створюємо потрібний датафрейм за допомогою функції tibble() .

Створення датафрейму в R: dplyr

## dplyr
### создаём справочник
gender <- tibble(id = c(1, 2),
                 gender = c("female", "male"))

Створення датафрейму у R: data.table

Створення датафрейму у R: data.table

## data.table
### создаём справочник
gender <- data.table(id = c(1, 2),
                    gender = c("female", "male"))

Створення датафрейму в Python: pandas

В pandas створення фреймів здійснюється у кілька етапів, спочатку ми створюємо словник, та був перетворимо словник на датафрейм.

Створення датафрейму в Python: pandas

# создаём дата фрейм
gender_dict = {'id': [1, 2],
               'gender': ["female", "male"]}
# преобразуем словарь в датафрейм
gender = pd.DataFrame.from_dict(gender_dict)

Вибір стовпців

Таблиці з якими ви працюєте можуть містити десятки і навіть сотні стовпців з даними. Але для проведення аналізу, як правило, вам потрібні далеко не всі стовпці, які доступні у вихідній таблиці.

Яку мову вибрати для роботи з даними - R або Python? Обидва! Мігруємо з pandas на tidyverse та data.table і назад

Тому однією з перших операцій, які ви будете виконувати з вихідною таблицею, це очищення її від непотрібної інформації, і звільнення пам'яті, яку ця інформація займає.

Вибір стовпців у R: tidyverse, dplyr

Синтаксис dplyr дуже схожий на мову запитів SQL, якщо ви з ним знайомі досить швидко оволодієте цим пакетом.

Для вибору стовпців використовується функція select().

Нижче приклади коду, за допомогою якого ви можете вибрати стовпці такими способами:

  • Перерахувавши назви потрібних стовпців
  • Звернутися до імен стовпців використовуючи регулярні вирази
  • За типом даних або будь-якою іншою властивістю даних, які містяться в стовпці

Вибір стовпців у R: dplyr

# Выбор нужных столбцов
## dplyr
### выбрать по названию столбцов
select(ga_nov, date, source, sessions)
### исключь по названию столбцов
select(ga_nov, -medium, -bounces)
### выбрать по регулярному выражению, стобцы имена которых заканчиваются на s
select(ga_nov, matches("s$"))
### выбрать по условию, выбираем только целочисленные столбцы
select_if(ga_nov, is.integer)

Вибір стовпців у R: data.table

Ті ж операції у data.table виконуються трохи інакше, на початку статті я навів опис того, які аргументи є всередині квадратних дужок у data.table.

DT[i,j,by]

Де:
i - where, тобто. фільтрація по рядках
j - select | update | do, тобто. вибір стовпців та їх перетворення
by — угруповання даних

Вибір стовпців у R: data.table

## data.table
### выбрать по названию столбцов
ga_nov[ , .(date, source, sessions) ]
### исключь по названию столбцов
ga_nov[ , .SD, .SDcols = ! names(ga_nov) %like% "medium|bounces" ]
### выбрать по регулярному выражению
ga_nov[, .SD, .SDcols = patterns("s$")]

Мінлива .SD дозволяє вам звернутися до всіх стовпців, а .SDcols відфільтрувати потрібні стовпці, використовуючи регулярні вирази, або інші функції для фільтрації назв потрібних стовпців.

Вибір стовпців у Python, pandas

Для вибору стовпців за назвою в pandas достатньо передати список їхніх назв. А для вибору чи виключення стовпців за назвою використовуючи регулярні вирази необхідно використовувати функції drop() и filter(), та аргумент вісь=1, за допомогою якого ви вказуєте, що обробляти треба не рядки, а стовпці.

Для вибору поля типу даних використовуйте функцію select_dtypes(), і в аргументи включати або виключати передайте список типів даних, які відповідають тим, які поля вам необхідно вибрати.

Вибір стовпців у Python: pandas

# Выбор полей по названию
ga_nov[['date', 'source', 'sessions']]
# Исключить по названию
ga_nov.drop(['medium', 'bounces'], axis=1)
# Выбрать по регулярному выражению
ga_nov.filter(regex="s$", axis=1)
# Выбрать числовые поля
ga_nov.select_dtypes(include=['number'])
# Выбрать текстовые поля
ga_nov.select_dtypes(include=['object'])

Фільтрування рядків

Наприклад, у вихідній таблиці можуть зберігатись дані за кілька років, а вам необхідно проаналізувати лише минулий місяць. Знову ж таки, зайві рядки уповільнять процес обробки даних і засмічуватимуть пам'ять ПК.

Яку мову вибрати для роботи з даними - R або Python? Обидва! Мігруємо з pandas на tidyverse та data.table і назад

Фільтрування рядків у R: tydyverse, dplyr

В dplyr для фільтрації рядків використовується функція filter(). Як перший аргумент вона приймає датафрейм, далі ви перераховуєте умови фільтрації.

При написанні логічних виразів для фільтрації таблиці у разі імена стовпців вказуєте без лапок, і оголошення імені таблиці.

Застосовуючи для фільтрації кілька логічних виразів, використовуйте наступні оператори:

  • & або кома - логічне І
  • | - Логічне АБО

Фільтрування рядків у R: dplyr

# фильтрация строк
## dplyr
### фильтрация строк по одному условию
filter(ga_nov, source == "google")
### фильтр по двум условиям соединённым логическим и
filter(ga_nov, source == "google" & sessions >= 10)
### фильтр по двум условиям соединённым логическим или
filter(ga_nov, source == "google" | sessions >= 10)

Фільтрування рядків у R: data.table

Як я вже писав вище, в data.table синтаксис перетворення даних укладений у квадратні дужки.

DT[i,j,by]

Де:
i - where, тобто. фільтрація по рядках
j - select | update | do, тобто. вибір стовпців та їх перетворення
by — угруповання даних

Для фільтрації рядків використовується аргумент iщо має першу позицію у квадратних дужках.

Звернення до стовпців у логічних виразах здійснюється без лапок та вказівки імені таблиці.

Логічні вирази зв'язуються між собою так само як і в dplyr через оператори & та |.

Фільтрування рядків у R: data.table

## data.table
### фильтрация строк по одному условию
ga_nov[source == "google"]
### фильтр по двум условиям соединённым логическим и
ga_nov[source == "google" & sessions >= 10]
### фильтр по двум условиям соединённым логическим или
ga_nov[source == "google" | sessions >= 10]

Фільтрування рядків у Python: pandas

Фільтрування по рядках у pandas схожа з фільтрацією в data.table, і здійснюється у квадратних дужках.

Звернення до стовпців в даному випадку здійснюється обов'язково із зазначенням імені датафрейму, далі назву стовпця можна так само вказати в лапках у квадратних дужках (приклад df['col_name']), або без лапок після точки (приклад df.col_name).

Якщо вам необхідно відфільтрувати датафрейм за кількома умовами, кожну з умов необхідно взяти в круглі дужки. Зв'язуються між собою логічні умови операторами & и |.

Фільтрування рядків у Python: pandas

# Фильтрация строк таблицы
### фильтрация строк по одному условию
ga_nov[ ga_nov['source'] == "google" ]
### фильтр по двум условиям соединённым логическим и
ga_nov[(ga_nov['source'] == "google") & (ga_nov['sessions'] >= 10)]
### фильтр по двум условиям соединённым логическим или
ga_nov[(ga_nov['source'] == "google") | (ga_nov['sessions'] >= 10)]

Угруповання та агрегація даних

Одна з операцій, що найчастіше використовуються в аналізі даних — угруповання та агрегація.

Яку мову вибрати для роботи з даними - R або Python? Обидва! Мігруємо з pandas на tidyverse та data.table і назад

Синтаксис для виконання цих операцій розрізнений у всіх пакетах, які ми розглядаємо.

В даному випадку як приклад ми візьмемо датафрейм титанічна, і порахуємо кількість та середню вартість квитків залежно від класу каюти.

Угруповання та агрегація даних у R: tidyverse, dplyr

В dplyr для угруповання використовується функція group_by(), а для агрегації summarise(). Насправді у dplyr є ціла родина функцій summarise_*(), але ціль цієї статті порівняти базовий синтаксис, тому не лізтимемо в такі нетрі.

Основні функції, що агрегують:

  • sum() - Підсумовування
  • min() / max() — мінімальне та максимальне значення
  • mean() - середнє арифметичне
  • median() - Медіана
  • length() - Кількість

Угруповання та агрегація в R: dplyr

## dplyr
### группировка и агрегация строк
group_by(titanic, Pclass) %>%
  summarise(passangers = length(PassengerId),
            avg_price  = mean(Fare))

У функцію group_by() як перший аргумент ми передали таблицю титанічна, і далі вказали поле Pclass, яким ми будемо групувати нашу таблицю. Результат цієї операції за допомогою оператора %>% передали як перший аргумент у функцію summarise(), і додали ще 2 поля: passangers и avg_price. У першому, використовуючи функцію length() розрахували кількість квитків, а у другому за допомогою функції mean() отримали середню вартість квитка.

Угруповання та агрегація даних у R: data.table

В data.table для агрегації служить аргумент j який має другу позицію у квадратних дужках, а для угруповання by або keyby, які мають третю позицію

Список функцій, що агрегують, в даному випадку ідентичний описаному в dplyr, т.к. це функції базового синтаксису R.

Угруповання та агрегація в R: data.table

## data.table
### фильтрация строк по одному условию
titanic[, .(passangers = length(PassengerId),
            avg_price  = mean(Fare)),
        by = Pclass]

Угруповання та агрегація даних у Python: pandas

Угруповання в pandas схожа з dplyr, а ось агрегація не схожа ні на dplyr ні на data.table.

Для угруповання використовуйте метод groupby(), до якого необхідно передати список стовпців, за якими буде згруповано датафрейм.

Для агрегації можна використовувати метод agg()який приймає словник. Ключами словника є стовпці до яких ви будете застосовувати функції, що агрегують, а значеннями будуть імена агрегуючих функцій.

Агрегуючі функції:

  • sum() - Підсумовування
  • min() / max() — мінімальне та максимальне значення
  • mean() - середнє арифметичне
  • median() - Медіана
  • count() - Кількість

Функція reset_index() у прикладі нижче використовується для того, щоб скинути вкладені індекси, які pandas за промовчанням встановлює після агрегації даних.

Символ дозволяє переходити на наступний рядок.

Угруповання та агрегація в Python: pandas

# группировка и агрегация данных
titanic.groupby(["Pclass"]).
    agg({'PassengerId': 'count', 'Fare': 'mean'}).
        reset_index()

Вертикальне об'єднання таблиць

Операція, коли ви об'єднуєте дві чи більше таблиць однакової структури. У завантажених нами даними є таблиці ga_nov и ga_dec. Ці таблиці однакові структурою, тобто. мають однакові стовпці, та типи даних у цих стовпцях.

Яку мову вибрати для роботи з даними - R або Python? Обидва! Мігруємо з pandas на tidyverse та data.table і назад

Це вивантаження з Google Analytics за листопад та грудень місяць, у цьому розділі ми об'їмо ці дані в одну таблицю.

Вертикальне об'єднання таблиць у R: tidyverse, dplyr

В dplyr об'єднати 2 таблиці в одну можна за допомогою функції bind_rows(), Передавши як її аргументів таблиці.

Фільтрування рядків у R: dplyr

# Вертикальное объединение таблиц
## dplyr
bind_rows(ga_nov, ga_dec)

Вертикальне об'єднання таблиць у R: data.table

Так само нічого складного, використовуємо rbind().

Фільтрування рядків у R: data.table

## data.table
rbind(ga_nov, ga_dec)

Вертикальне об'єднання таблиць у Python: pandas

В pandas для об'єднання таблиць служить функція concat(), в яку необхідно передати список кадрів для їхнього об'єднання.

Фільтрування рядків у Python: pandas

# вертикальное объединение таблиц
pd.concat([ga_nov, ga_dec])

Горизонтальне об'єднання таблиць

Операція при якій до першої таблиці додаються стовпці з другої по ключу. Найчастіше використовується при збагаченні таблиці фактів (наприклад, таблиці з даними про продаж), деякими довідковими даними (наприклад вартістю товару).

Яку мову вибрати для роботи з даними - R або Python? Обидва! Мігруємо з pandas на tidyverse та data.table і назад

Є кілька типів об'єднання:

Яку мову вибрати для роботи з даними - R або Python? Обидва! Мігруємо з pandas на tidyverse та data.table і назад

У завантаженій раніше таблиці титанічна у нас є стовпець секс, що відповідає коду підлоги пасажира:

1 - жіночий
2 - чоловічий

Також, ми з вами створили таблицю - довідник пол. Для зручнішого представлення даних по підлозі пасажирів нам необхідно додати назву підлоги, з довідника пол до таблиці титанічна.

Горизонтальне об'єднання таблиць у R: tidyverse, dplyr

В dplyr для горизонтального об'єднання є ціле сімейство функцій:

  • inner_join()
  • left_join()
  • right_join()
  • full_join()
  • semi_join()
  • nest_join()
  • anti_join()

Найчастіше використовуваною у моїй практиці є left_join().

Як перші два аргументи перераховані вище функцію приймають дві таблиці для об'єднання, а як третій аргумент by необхідно вказати стовпці для об'єднання.

Горизонтальне об'єднання таблиць у R: dplyr

# объединяем таблицы
left_join(titanic, gender,
          by = c("Sex" = "id"))

Горизонтальне об'єднання таблиць у R: data.table

В data.table об'єднувати таблиці за ключом необхідно за допомогою функції merge().

Аргументи функції merge() у data.table

  • x, y — Таблиці для об'єднання
  • by — Стовпець, який є ключем для об'єднання, якщо в обох таблицях він має однакову назву
  • by.x, by.y — Імена стовпців для об'єднання, якщо в таблицях вони мають різну назву
  • all, all.x, all.y — Тип з'єднання, all поверне всі рядки з обох таблиць, all.x відповідає операції LEFT JOIN (залишить усі рядки першої таблиці), all.y — відповідає операції RIGHT JOIN (залишить усі рядки другої таблиці) ).

Горизонтальне об'єднання таблиць у R: data.table

# объединяем таблицы
merge(titanic, gender, by.x = "Sex", by.y = "id", all.x = T)

Горизонтальне об'єднання таблиць у Python: pandas

Так само як і в data.table, в pandas для об'єднання таблиць використовується функція merge().

Аргументи функції merge() в pandas

  • how — Тип з'єднання: left, right, outer, inner
  • on — Стовпець, який є ключем, якщо має однакову назву в обох таблицях
  • left_on, right_on — Імена шпальт ключів, якщо вони мають різні імена в таблицях

Горизонтальне об'єднання таблиць у Python: pandas

# объединяем по ключу
titanic.merge(gender, how = "left", left_on = "Sex", right_on = "id")

Найпростіші віконні функції та обчислювані стовпці

Віконні функції за змістом схожі на агрегуючі, і часто використовуються в аналізі даних. Але на відміну від функцій, що агрегують, віконні не змінюють кількість рядків вихідного датафрейму.

Яку мову вибрати для роботи з даними - R або Python? Обидва! Мігруємо з pandas на tidyverse та data.table і назад

Насправді з допомогою віконних функцію ми розбиваємо вхідний датафрейм частини за якимось ознакою, тобто. за значенням поля, чи кількох полів. І проводимо над кожним вікном арифметичні операції. Результат цих операцій буде повернено у кожний рядок, тобто. не змінюючи загальної кількості рядків у таблиці.

Наприклад візьмемо таблицю титанічна. Ми можемо порахувати який відсоток становила вартість кожного квитка у межах його класу кают.

Для цього нам необхідно в кожному рядку отримати загальну вартість квитка за поточним класом кают, до якого відноситься квиток у даному рядку, потім розділити вартість кожного квитка на загальну вартість усіх квитків цього класу кают.

Віконні функції в R: tidyverse, dplyr

Для додавання нових стовпців, без застосування групування рядків, dplyr служить функція mutate().

Вирішити описане вище завдання можна згрупувавши дані по полю Pclass і підсумувавши в новому стовпці поле робити. Далі розгруповуємо таблицю та ділимо значення поля робити на те, що вийшло у минулому кроці.

Віконні функції у R: dplyr

group_by(titanic, Pclass) %>%
  mutate(Pclass_cost = sum(Fare)) %>%
  ungroup() %>%
  mutate(ticket_fare_rate = Fare / Pclass_cost)

Віконні функції у R: data.table

Алгоритм рішення залишається таким же, як у dplyrнам необхідно розбити таблицю на вікна по полю Pclass. Вивести в новому стовпці суму за відповідним кожним рядком групою, і додати стовпець, в якому ми розрахуємо частку вартості кожного квитка в його групі.

Для додавання нових стовпців у data.table присутній оператор :=. Нижче наведено приклад розв'язання задачі за допомогою пакета data.table

Віконні функції у R: data.table

titanic[,c("Pclass_cost","ticket_fare_rate") := .(sum(Fare), Fare / Pclass_cost), 
        by = Pclass]

Віконні функції Python: pandas

Один із способів додати новий стовпець в pandas - Використовувати функцію assign(). Для підсумовування вартості квитків за класом кают, без угруповання рядків ми використовуватимемо функцію transform().

Нижче приклад рішення, в якому ми додаємо до таблиці титанічна ті ж 2 стовпці.

Віконні функції Python: pandas

titanic.assign(Pclass_cost      =  titanic.groupby('Pclass').Fare.transform(sum),
               ticket_fare_rate = lambda x: x['Fare'] / x['Pclass_cost'])

Таблиця відповідності функцій та методів

Далі наводжу таблицю відповідності методів до виконання різних операцій із даними у розглянутих нами пакетах.

Опис
охайний
дані.таблиця
панди

завантаження даних
vroom()/ readr::read_csv() / readr::read_tsv()
fread()
read_csv()

Створення датафреймів
tibble()
data.table()
dict() + from_dict()

Вибір стовпців
select()
аргумент j, друга позиція у квадратних дужках
передаємо список потрібних стовпців у квадратних дужках / drop() / filter() / select_dtypes()

Фільтрування рядків
filter()
аргумент i, перша позиція у квадратних дужках
перераховуємо умови фільтрації у квадратних дужках / filter()

Угруповання та агрегація
group_by() + summarise()
аргументи j + by
groupby() + agg()

Вертикальне об'єднання таблиць (UNION)
bind_rows()
rbind()
concat()

Горизонтальне об'єднання таблиць (JOIN)
left_join() / *_join()
merge()
merge()

Найпростіші віконні функції і додавання стовпців, що розраховуються.
group_by() + mutate()
аргумент j з використанням оператора := + аргумент by
transform() + assign()

Висновок

Можливо у статті я описав не найоптимальніші реалізації обробки даних, тому буду радий, якщо виправите мої помилки в коментарях, або ж просто доповніть наведену в статті інформацію іншими прийомами роботи з даними в R/Python.

Як я вже писав вище, мета статті полягала не в тому, щоб нав'язувати свою думку про те, яка з мов краще, а спростити можливість вивчити обидві мови, або за необхідності мігрувати між ними.

Якщо вам сподобалася стаття буду радий новим передплатникам на моїх YouTube и телеграма канали.

Опитування

А які з цих пакетів ви використовуєте в роботі?

У коментарях ви можете написати причину свого вибору.

Тільки зареєстровані користувачі можуть брати участь в опитуванні. Увійдіть, будь ласка.

Який пакет для обробки даних ви використовуєте (можна вибрати декілька варіантів)

  • 45,2%tidyverse19

  • 33,3%data.table14

  • 54,8%панди23

Проголосували 42 користувачів. Утрималися 9 користувачів.

Джерело: habr.com

Додати коментар або відгук