ProHoster > Блог > адміністрування > Яку мову вибрати для роботи з даними - R або Python? Обидва! Мігруємо з pandas на tidyverse та data.table і назад
Яку мову вибрати для роботи з даними - R або Python? Обидва! Мігруємо з pandas на tidyverse та data.table і назад
За запитом R або Python в інтернеті ви знайдете мільйони статей та кілометрових обговорень на тему якої з них краще, швидше та зручніше для роботи з даними. Але, на жаль, особливої користі всі ці статті та суперечки не несуть.
Мета цієї статті – порівняти основні прийоми обробки даних у найбільш популярних пакетах обох мов. І допомогти читачам максимально швидко опанувати те, що вони ще не знають. Для тих хто пише на Python дізнатися як виконувати все те ж саме в R, і навпаки.
Під час статті ми розберемо синтаксис найпопулярніших пакетів на R. Це пакети, що входять до бібліотеки. tidyverse, а також пакет data.table. І порівняємо їх синтаксис з pandas, найбільш популярним пакетом для аналізу даних у Python.
Ми крок за кроком пройдемо весь шлях аналізу даних від їх завантаження до виконання аналітичних, віконних функцій засобами Python і R.
Зміст
Ця стаття може використовуватися як шпаргалка, якщо ви забули як в одному з цих пакетів виконати деяку операцію з обробки даних.
Якщо ви цікавитеся аналізом даних можливо вам будуть корисні мої телеграма и 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 буде не зовсім коректно, але спробую пояснити сенс.
Щоб не зберігати проміжні обчислення і не плодити в робочому оточенні непотрібні об'єкти, ви можете використовувати своєрідний конвеєр. Тобто. передавати результат обчислення з однієї функції наступну, і зберігати проміжні результати.
Візьмемо наступний приклад коду, в якому ми зберігаємо в окремі об'єкти проміжні обчислення:
Ми послідовно виконали 3 операції і результат кожної зберегли в окремий об'єкт. Але насправді ці проміжні об'єкти нам не потрібні.
Або ще гірше, але звичніше користувачам Excel.
obj <- func3(func2(func1()))
В даному випадку ми не зберігали проміжні результати обчислень, але читати код із вкладеними один, в одного функціями вкрай не зручно.
Ми розглядатимемо кілька підходів до обробки даних у R, і в них по-різному виконуються подібні операції.
Пайплайни у бібліотеці tidyverse реалізуються оператором %>%.
obj <- func1() %>%
func2() %>%
func3()
Таким чином ми беремо результат роботи func1() і передаємо його як перший аргумент в func2(), далі результат цього обчислення передаємо як перший аргумент func3(). І, зрештою, всі виконані обчислення записуємо в об'єкт obj <-.
Краще слів усе вищеописане ілюструє цей мем:
В data.table схожим чином використовуються ланцюжки.
У кожній із квадратних дужок ви можете використати результат попередньої операції.
В 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
Бібліотека tidyverse написана Хедлі Вікхемом, старшим науковим співробітником RStudio. tidyverse складається з великого набору пакетів спрощують обробку даних, 5 з яких входять в топ 10 CRAN, що завантажуються з репозиторію.
Ядро бібліотеки складається з таких пакетів: ggplot2, dplyr, tidyr, readr, purrr, tibble, stringr, forcats. Кожен із цих пакетів спрямований на вирішення певної задачі. Наприклад dplyr створений для маніпуляції з даними, tidyr для приведення даних до акуратного вигляду, stringr спрощує роботу з рядками, а ggplot2 є одним із найбільш популярних інструментів для візуалізації даних.
перевагою tidyverse є простота і легко читання синтаксису, який багато в чому схожий на мову запитів SQL.
Синтаксис пакета не такий зручний як у tidyverse і більше нагадує класичні датафрейми R, але при цьому значно розширені по функціоналу.
Усі маніпуляції з таблицею в даному пакеті описуються у квадратних дужках, і якщо перекласти синтаксис data.table на SQL, то вийде приблизно таке: data.table[ WHERE, SELECT, GROUP BY ]
Сильною стороною цього пакета є швидкість обробки великих обсягів даних.
Назва бібліотеки походить від економетричного терміна «панельні дані» (англ. 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 за бажання надають вам великі можливості для отримання даних із будь-яких джерел: локальні файли, файли з інтернету, веб-сайти, всілякі бази даних.
У ході статті ми будемо використовувати декілька наборів даних:
Два вивантаження з Google Analytics.
Набір даних про пасажирів титаніки.
Усі дані лежать у мене на GitHub у вигляді csv та tsv файлів. Від куди ми їх і запитуватимемо.
Завантаження даних у R: tidyverse, vroom, readr
Для завантаження даних у бібліотеці tidyverse призначені два пакети: vroom, readr. vroom Більш сучасний, але в майбутньому можливо пакети будуть об'єднані.
vroom vs readr
What does the release of vroom означає для readr? Для того, щоб ми планували продовжити два пакети evolve separately, але добре, що будуть unite пакети в майбутньому. Одна згода на вроки лайки, reading є певні дані проблем може бути повідомлена вгору, якщо ви хотіли б, щоб вони потрібні деякі думки.
vroom проти readr
Що означає випуск vroom для readr? На даний момент ми плануємо розвивати обидва пакети окремо, але, ймовірно, ми об'єднаємо їх у майбутньому. Одним із недоліків лінивого читання vroom є те, що про деякі проблеми з даними не можна повідомити заздалегідь, тому необхідно подумати про те, як краще їх об'єднати.
У цій статті ми розглянемо обидва пакети для завантаження даних:
У пакеті vroom, незалежно від формату даних csv / tsv завантаження здійснюється однойменною функцією vroom(), у пакеті readr ми використовуємо під кожний формат свою функцію read_tsv() и read_csv().
Завантаження даних у R: data.table
В data.table для завантаження даних є функція fread().
Якщо порівнювати з R пакетами, то в даному випадку найбільш близьким за синтаксисом до pandas буде readr, т.к. pandas вміє запитувати дані від будь-куди, і в цьому пакеті присутня ціла родина функцій read_*().
read_csv()
read_excel()
read_sql()
read_json()
read_html()
І багато інших функцій призначених для читання даних із різних форматів. Але для наших цілей достатньо read_table() або read_csv() з використанням аргументу Вересень для вказівки роздільника стовпців.
В pandas створення фреймів здійснюється у кілька етапів, спочатку ми створюємо словник, та був перетворимо словник на датафрейм.
Створення датафрейму в Python: pandas
# создаём дата фрейм
gender_dict = {'id': [1, 2],
'gender': ["female", "male"]}
# преобразуем словарь в датафрейм
gender = pd.DataFrame.from_dict(gender_dict)
Вибір стовпців
Таблиці з якими ви працюєте можуть містити десятки і навіть сотні стовпців з даними. Але для проведення аналізу, як правило, вам потрібні далеко не всі стовпці, які доступні у вихідній таблиці.
Тому однією з перших операцій, які ви будете виконувати з вихідною таблицею, це очищення її від непотрібної інформації, і звільнення пам'яті, яку ця інформація займає.
Вибір стовпців у 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 — угруповання даних
Мінлива .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: 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: tidyverse, dplyr
В dplyr для угруповання використовується функція group_by(), а для агрегації summarise(). Насправді у dplyr є ціла родина функцій summarise_*(), але ціль цієї статті порівняти базовий синтаксис, тому не лізтимемо в такі нетрі.
Основні функції, що агрегують:
sum() - Підсумовування
min() / max() — мінімальне та максимальне значення
У функцію 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. Ці таблиці однакові структурою, тобто. мають однакові стовпці, та типи даних у цих стовпцях.
Це вивантаження з 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])
Горизонтальне об'єднання таблиць
Операція при якій до першої таблиці додаються стовпці з другої по ключу. Найчастіше використовується при збагаченні таблиці фактів (наприклад, таблиці з даними про продаж), деякими довідковими даними (наприклад вартістю товару).
Є кілька типів об'єднання:
У завантаженій раніше таблиці титанічна у нас є стовпець секс, що відповідає коду підлоги пасажира:
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 (залишить усі рядки другої таблиці) ).
Так само як і в 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: tidyverse, dplyr
Для додавання нових стовпців, без застосування групування рядків, dplyr служить функція mutate().
Вирішити описане вище завдання можна згрупувавши дані по полю Pclass і підсумувавши в новому стовпці поле робити. Далі розгруповуємо таблицю та ділимо значення поля робити на те, що вийшло у минулому кроці.
Алгоритм рішення залишається таким же, як у 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 стовпці.
Далі наводжу таблицю відповідності методів до виконання різних операцій із даними у розглянутих нами пакетах.
Опис
охайний
дані.таблиця
панди
завантаження даних 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 и телеграма канали.
Опитування
А які з цих пакетів ви використовуєте в роботі?
У коментарях ви можете написати причину свого вибору.
Тільки зареєстровані користувачі можуть брати участь в опитуванні. Увійдіть, будь ласка.
Який пакет для обробки даних ви використовуєте (можна вибрати декілька варіантів)