Якую мову абраць для працы з дадзенымі - 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. tidyverse
    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(). Атрыманы вынік захоўваемы ў аб'ект OBJ .

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

Структуры дадзеных у R і Python падобныя, але маюць розныя назовы.

Апісанне
Назва ў R
Назва ў Python / pandas

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

Аднамерны спіс значэнняў
Вектар
Series у pandas або спіс (list) у чыстым Python

Шматузроўневая не таблічная структура
Спіс (List)
Слоўнік (dict)

Некаторыя іншыя асаблівасці і адрозненні сінтаксісу мы разгледзім далей.

Некалькі слоў пра пакеты, якія мы будзем выкарыстоўваць

Для пачатку раскажу крыху пра пакеты з якімі падчас гэтага артыкула вы пазнаёміцеся.

tidyverse

Афіцыйны сайт: 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, але likely будуць мець цэлыя пакеты ў будучыні. Одна згода на ўрокі ласкі, якая выкарыстоўвае пэўныя патрабаванні часу, не можа быць ажыццёўлена ў сувязі з тым, як лепей, чым для тых, хто патрабуецца некаторыя думкі.

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'])

Табліца адпаведнасці функцый і метадаў

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

Апісанне
tidyverse
дадзеныя.табліца
панд

Загрузка дадзеных
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

Дадаць каментар