Ce limbă să alegeți pentru lucrul cu date - R sau Python? Ambii! Migrarea de la panda la tidyverse și data.table și înapoi

Căutând R sau Python pe Internet, veți găsi milioane de articole și kilometri de discuții pe tema cărora unul este mai bun, mai rapid și mai convenabil pentru lucrul cu date. Dar, din păcate, toate aceste articole și dispute nu sunt deosebit de utile.

Ce limbă să alegeți pentru lucrul cu date - R sau Python? Ambii! Migrarea de la panda la tidyverse și data.table și înapoi

Scopul acestui articol este de a compara tehnicile de bază de prelucrare a datelor în cele mai populare pachete din ambele limbi. Și ajutați cititorii să stăpânească rapid ceva ce nu știu încă. Pentru cei care scriu în Python, aflați cum să faceți același lucru în R și invers.

Pe parcursul articolului vom analiza sintaxa celor mai populare pachete din R. Acestea sunt pachetele incluse în bibliotecă tidyversesi de asemenea pachetul data.table. Și comparați sintaxa lor cu pandas, cel mai popular pachet de analiză a datelor din Python.

Vom parcurge pas cu pas întreaga cale de analiză a datelor, de la încărcarea acestora până la efectuarea funcțiilor de fereastră analitică folosind Python și R.

Conținut

Acest articol poate fi folosit ca o foaie de cheat dacă ați uitat cum să efectuați o operațiune de prelucrare a datelor într-unul dintre pachetele luate în considerare.

Ce limbă să alegeți pentru lucrul cu date - R sau Python? Ambii! Migrarea de la panda la tidyverse și data.table și înapoi

  1. Principalele diferențe de sintaxă între R și Python
    1.1. Accesarea funcțiilor pachetului
    1.2. Misiune
    1.3. indexare
    1.4. Metode și POO
    1.5. Conducte
    1.6. Structuri de date
  2. Câteva cuvinte despre pachetele pe care le vom folosi
    2.1. tidyverse
    2.2. tabel de date
    2.3. panda
  3. Instalarea pachetelor
  4. Încărcare date
  5. Crearea cadrelor de date
  6. Selectarea coloanelor de care aveți nevoie
  7. Filtrarea rândurilor
  8. Gruparea și agregarea
  9. Unirea verticală a meselor (UNION)
  10. Îmbinarea orizontală a meselor (JOIN)
  11. Funcții de bază ale ferestrei și coloane calculate
  12. Tabel de corespondență între metodele de prelucrare a datelor în R și Python
  13. Concluzie
  14. Un scurt sondaj despre pachetul pe care îl utilizați

Dacă sunteți interesat de analiza datelor, puteți găsi mine telegramă и youtube canale. Cea mai mare parte a conținutului este dedicat limbajului R.

Principalele diferențe de sintaxă între R și Python

Pentru a vă facilita trecerea de la Python la R sau invers, voi oferi câteva puncte principale cărora trebuie să le acordați atenție.

Accesarea funcțiilor pachetului

Odată ce un pachet este încărcat în R, nu trebuie să specificați numele pachetului pentru a accesa funcțiile acestuia. În cele mai multe cazuri, acest lucru nu este obișnuit în R, dar este acceptabil. Nu trebuie să importați deloc un pachet dacă aveți nevoie de una dintre funcțiile acestuia în codul dvs., ci pur și simplu îl apelați specificând numele pachetului și numele funcției. Separatorul dintre numele pachetelor și funcțiilor din R este două puncte duble. package_name::function_name().

În Python, dimpotrivă, se consideră clasic apelarea funcțiilor unui pachet specificând în mod explicit numele acestuia. Când un pachet este descărcat, de obicei i se dă un nume scurt, de ex. pandas de obicei se folosește un pseudonim pd. O funcție de pachet este accesată printr-un punct package_name.function_name().

Misiune

În R, este obișnuit să folosiți o săgeată pentru a atribui o valoare unui obiect. obj_name <- value, deși este permis un singur semn egal, semnul unic egal în R este folosit în principal pentru a transmite valori argumentelor funcției.

În Python, atribuirea se face exclusiv cu un singur semn egal obj_name = value.

indexare

Există, de asemenea, diferențe destul de semnificative aici. În R, indexarea începe de la unu și include toate elementele specificate în intervalul rezultat,

În Python, indexarea începe de la zero și intervalul selectat nu include ultimul element specificat în index. Deci design x[i:j] în Python nu va include elementul j.

Există și diferențe în indexarea negativă, în notația R x[-1] va returna toate elementele vectorului, cu excepția ultimului. În Python, o notație similară va returna doar ultimul element.

Metode și POO

R implementează OOP în felul său, am scris despre asta în articol „OOP în limbajul R (partea 1): clase S3”. În general, R este un limbaj funcțional și totul în el este construit pe funcții. Prin urmare, de exemplu, pentru utilizatorii Excel, accesați tydiverse va fi mai ușor decât pandas. Deși aceasta poate fi părerea mea subiectivă.

Pe scurt, obiectele din R nu au metode (dacă vorbim de clase S3, dar există și alte implementări OOP care sunt mult mai puțin frecvente). Există doar funcții generalizate care le procesează diferit în funcție de clasa obiectului.

Conducte

Poate acesta este numele pentru pandas Nu va fi complet corect, dar voi încerca să explic sensul.

Pentru a nu salva calcule intermediare și pentru a nu produce obiecte inutile în mediul de lucru, puteți folosi un fel de conductă. Acestea. treceți rezultatul unui calcul de la o funcție la alta și nu salvați rezultatele intermediare.

Să luăm următorul exemplu de cod, în care stocăm calcule intermediare în obiecte separate:

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

Am efectuat 3 operații succesiv, iar rezultatul fiecăreia a fost salvat într-un obiect separat. Dar, de fapt, nu avem nevoie de aceste obiecte intermediare.

Sau chiar mai rău, dar mai familiar utilizatorilor Excel.

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

În acest caz, nu am salvat rezultatele de calcul intermediare, dar citirea codului cu funcții imbricate este extrem de incomod.

Vom analiza mai multe abordări ale procesării datelor în R și ele efectuează operații similare în moduri diferite.

Conducte în bibliotecă tidyverse implementate de operator %>%.

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

Astfel luăm rezultatul muncii func1() și transmiteți-l ca prim argument către func2(), apoi trecem rezultatul acestui calcul ca prim argument func3(). Și la final, scriem toate calculele efectuate în obiect obj <-.

Toate cele de mai sus sunt ilustrate mai bine decât cuvintele prin această meme:
Ce limbă să alegeți pentru lucrul cu date - R sau Python? Ambii! Migrarea de la panda la tidyverse și data.table și înapoi

В data.table lanțurile sunt folosite în mod similar.

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

În fiecare dintre parantezele pătrate puteți folosi rezultatul operației anterioare.

В pandas astfel de operații sunt separate printr-un punct.

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

Acestea. ne luăm masa df și folosește metoda ei fun1(), apoi aplicăm metoda rezultatului obținut fun2()după fun3(). Rezultatul rezultat este salvat într-un obiect obj .

Structuri de date

Structurile de date din R și Python sunt similare, dar au nume diferite.

descriere
Numele în R
Nume în Python/pandas

Structura tabelului
data.frame, data.table, tibble
DataFrame

Listă unidimensională de valori
vector
Serii în panda sau listă în pur Python

Structură netabulară pe mai multe niveluri
Listă
Dicţionar (dict)

Vom analiza mai jos câteva alte caracteristici și diferențe de sintaxă.

Câteva cuvinte despre pachetele pe care le vom folosi

În primul rând, vă voi spune puțin despre pachetele cu care vă veți familiariza în timpul acestui articol.

tidyverse

Официальный сайт: tidyverse.org
Ce limbă să alegeți pentru lucrul cu date - R sau Python? Ambii! Migrarea de la panda la tidyverse și data.table și înapoi
bibliotecă tidyverse scris de Hedley Wickham, cercetător principal la RStudio. tidyverse constă dintr-un set impresionant de pachete care simplifică procesarea datelor, dintre care 5 sunt incluse în primele 10 descărcări din depozitul CRAN.

Nucleul bibliotecii este format din următoarele pachete: ggplot2, dplyr, tidyr, readr, purrr, tibble, stringr, forcats. Fiecare dintre aceste pachete are ca scop rezolvarea unei probleme specifice. De exemplu dplyr creat pentru manipularea datelor, tidyr pentru a aduce datele într-o formă ordonată, stringr simplifică lucrul cu șiruri și ggplot2 este unul dintre cele mai populare instrumente de vizualizare a datelor.

Avantaj tidyverse este simplitatea și sintaxa ușor de citit, care este în multe privințe similară cu limbajul de interogare SQL.

tabel de date

Ce limbă să alegeți pentru lucrul cu date - R sau Python? Ambii! Migrarea de la panda la tidyverse și data.table și înapoiОфициальный сайт: r-datatable.com

Autor data.table este Matt Dole de la H2O.ai.

Prima lansare a bibliotecii a avut loc în 2006.

Sintaxa pachetului nu este la fel de convenabilă ca în tidyverse și amintește mai mult de cadrele de date clasice în R, dar în același timp extins semnificativ în funcționalitate.

Toate manipulările cu tabelul din acest pachet sunt descrise între paranteze drepte și dacă traduceți sintaxa data.table în SQL, obțineți ceva de genul acesta: data.table[ WHERE, SELECT, GROUP BY ]

Punctul forte al acestui pachet este viteza de procesare a unor cantități mari de date.

panda

Официальный сайт: pandas.pydata.org Ce limbă să alegeți pentru lucrul cu date - R sau Python? Ambii! Migrarea de la panda la tidyverse și data.table și înapoi

Denumirea bibliotecii provine de la termenul econometric „panel data”, folosit pentru a descrie seturi de informații structurate multidimensionale.

Autor pandas este americanul Wes McKinney.

Când vine vorba de analiza datelor în Python, la fel pandas Nu. Un pachet foarte multifuncțional, la nivel înalt, care vă permite să efectuați orice manipulare cu date, de la încărcarea datelor din orice sursă până la vizualizarea acestora.

Instalarea pachetelor suplimentare

Pachetele discutate în acest articol nu sunt incluse în distribuțiile de bază R și Python. Deși există o mică avertizare, dacă ați instalat distribuția Anaconda, atunci instalați suplimentar pandas nu este necesar.

Instalarea pachetelor în R

Dacă ați deschis cel puțin o dată mediul de dezvoltare RStudio, probabil că știți deja cum să instalați pachetul necesar în R. Pentru a instala pachete, utilizați comanda standard install.packages() rulându-l direct în R însuși.

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

După instalare, pachetele trebuie conectate, pentru care în majoritatea cazurilor este folosită comanda library().

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

Instalarea pachetelor în Python

Deci, dacă aveți instalat Python pur, atunci pandas trebuie sa-l instalezi manual. Deschideți o linie de comandă sau un terminal, în funcție de sistemul dvs. de operare și introduceți următoarea comandă.

pip install pandas

Apoi revenim la Python și importăm pachetul instalat cu comanda import.

import pandas as pd

Încărcare date

Exploatarea datelor este unul dintre cei mai importanți pași în analiza datelor. Atât Python, cât și R, dacă doriți, vă oferă oportunități extinse de a obține date din orice sursă: fișiere locale, fișiere de pe Internet, site-uri web, tot felul de baze de date.

Ce limbă să alegeți pentru lucrul cu date - R sau Python? Ambii! Migrarea de la panda la tidyverse și data.table și înapoi

Pe parcursul articolului vom folosi mai multe seturi de date:

  1. Două descărcări de pe Google Analytics.
  2. Setul de date pentru pasageri Titanic.

Toate datele sunt pe mine GitHub sub formă de fișiere csv și tsv. De unde le vom solicita?

Încărcarea datelor în R: tidyverse, vroom, readr

Pentru a încărca date într-o bibliotecă tidyverse Există două pachete: vroom, readr. vroom mai modern, dar în viitor pachetele pot fi combinate.

Citat din documentație oficială vroom.

vroom vs cititor
Ce înseamnă eliberarea vroom înseamnă pentru readr? Deocamdată intenționăm să lăsăm cele două pachete să evolueze separat, dar probabil că vom uni pachetele în viitor. Un dezavantaj al citirii leneșe a vroom este că anumite probleme de date nu pot fi raportate în avans, așa că modul în care le unificați cel mai bine necesită o gândire.

vroom vs readr
Ce înseamnă eliberare? vroom pentru readr? Momentan intenționăm să dezvoltăm ambele pachete separat, dar probabil că le vom combina în viitor. Unul dintre dezavantajele lecturii leneșe vroom este că unele probleme cu datele nu pot fi raportate în avans, așa că trebuie să vă gândiți cum să le combinați cel mai bine.

În acest articol ne vom uita la ambele pachete de încărcare a datelor:

Încărcarea datelor în pachetul 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")

Încărcarea datelor în 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")

În pachet vroom, indiferent de formatul de date csv / tsv, încărcarea se realizează prin funcția cu același nume vroom(), în pachet readr folosim o funcție diferită pentru fiecare format read_tsv() и read_csv().

Încărcarea datelor în R: data.table

В data.table există o funcție pentru încărcarea datelor fread().

Încărcarea datelor în pachetul 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")

Se încarcă date în Python: panda

Dacă comparăm cu pachetele R, atunci în acest caz sintaxa este cea mai apropiată de pandas voință readr, deoarece pandas poate solicita date de oriunde și există o întreagă familie de funcții în acest pachet read_*().

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

Și multe alte funcții concepute pentru a citi date din diferite formate. Dar pentru scopurile noastre este suficient read_table() sau read_csv() folosind argument sep pentru a specifica separatorul de coloane.

Se încarcă date în Python: panda

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")

Crearea cadrelor de date

Masa titanic, pe care l-am încărcat, există un câmp sex, care stochează identificatorul de gen al pasagerului.

Dar pentru o prezentare mai convenabilă a datelor în ceea ce privește sexul pasagerului, ar trebui să utilizați mai degrabă numele decât codul de gen.

Pentru a face acest lucru, vom crea un director mic, un tabel în care vor fi doar 2 coloane (cod și nume de gen) și, respectiv, 2 rânduri.

Crearea unui cadru de date în R: tidyverse, dplyr

În exemplul de cod de mai jos, creăm cadrul de date dorit folosind funcția tibble() .

Crearea unui cadru de date în R: dplyr

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

Crearea unui cadru de date în R: data.table

Crearea unui cadru de date în R: data.table

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

Crearea unui cadru de date în Python: panda

В pandas Crearea cadrelor se realizează în mai multe etape, mai întâi creăm un dicționar, apoi convertim dicționarul într-un cadru de date.

Crearea unui cadru de date în Python: panda

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

Selectarea coloanelor

Tabelele cu care lucrați pot conține zeci sau chiar sute de coloane de date. Dar pentru a efectua o analiză, de regulă, nu aveți nevoie de toate coloanele disponibile în tabelul sursă.

Ce limbă să alegeți pentru lucrul cu date - R sau Python? Ambii! Migrarea de la panda la tidyverse și data.table și înapoi

Prin urmare, una dintre primele operațiuni pe care le veți efectua cu tabelul sursă este să îl ștergeți de informații inutile și să eliberați memoria pe care o ocupă această informație.

Selectarea coloanelor în R: tidyverse, dplyr

sintaxă dplyr este foarte asemănător cu limbajul de interogare SQL, dacă ești familiarizat cu el, vei stăpâni rapid acest pachet.

Pentru a selecta coloanele, utilizați funcția select().

Mai jos sunt exemple de cod cu care puteți selecta coloane în următoarele moduri:

  • Listarea numelor coloanelor necesare
  • Consultați numele coloanelor folosind expresii regulate
  • După tipul de date sau orice altă proprietate a datelor conținute în coloană

Selectarea coloanelor din 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)

Selectarea coloanelor din R: data.table

Aceleași operațiuni în data.table sunt realizate ușor diferit, la începutul articolului am oferit o descriere a ce argumente sunt între paranteze drepte în data.table.

DT[i,j,by]

În cazul în care:
i - unde, i.e. filtrarea pe rânduri
j - select|update|do, i.e. selectarea coloanelor și conversia acestora
după - gruparea datelor

Selectarea coloanelor din 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$")]

variabil .SD vă permite să accesați toate coloanele și .SDcols filtrați coloanele necesare folosind expresii regulate sau alte funcții pentru a filtra numele coloanelor de care aveți nevoie.

Selectarea coloanelor în Python, panda

Pentru a selecta coloanele după nume în pandas este suficient să furnizați o listă cu numele lor. Și pentru a selecta sau exclude coloane după nume folosind expresii regulate, trebuie să utilizați funcțiile drop() и filter(), și argument axa=1, cu care indicați că este necesar să procesați mai degrabă coloanele decât rândurile.

Pentru a selecta un câmp după tipul de date, utilizați funcția select_dtypes(), și în argumente include sau exclude transmiteți o listă de tipuri de date corespunzătoare câmpurilor pe care trebuie să le selectați.

Selectarea coloanelor în Python: panda

# Выбор полей по названию
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'])

Filtrarea rândurilor

De exemplu, tabelul sursă poate conține mai mulți ani de date, dar trebuie să analizați doar ultima lună. Din nou, liniile suplimentare vor încetini procesul de procesare a datelor și vor înfunda memoria computerului.

Ce limbă să alegeți pentru lucrul cu date - R sau Python? Ambii! Migrarea de la panda la tidyverse și data.table și înapoi

Filtrarea rândurilor în R: tydyverse, dplyr

В dplyr funcția este folosită pentru a filtra rândurile filter(). Este nevoie de un cadru de date ca prim argument, apoi enumerați condițiile de filtrare.

Când scrieți expresii logice pentru a filtra un tabel, în acest caz, specificați numele coloanelor fără ghilimele și fără a declara numele tabelului.

Când utilizați mai multe expresii logice pentru a filtra, utilizați următorii operatori:

  • & sau virgulă - AND logic
  • | - SAU logic

Filtrarea rândurilor în R: dplyr

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

Filtrarea rândurilor în R: data.table

După cum am scris deja mai sus, în data.table sintaxa de conversie a datelor este cuprinsă între paranteze drepte.

DT[i,j,by]

În cazul în care:
i - unde, i.e. filtrarea pe rânduri
j - select|update|do, i.e. selectarea coloanelor și conversia acestora
după - gruparea datelor

Argumentul este folosit pentru a filtra rândurile i, care are prima poziție între paranteze drepte.

Coloanele sunt accesate în expresii logice fără ghilimele și fără a specifica numele tabelului.

Expresiile logice sunt legate între ele în același mod ca în dplyr prin operatorii & și |.

Filtrarea rândurilor în R: data.table

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

Filtrarea șirurilor în Python: panda

Filtrați după rânduri în pandas similar cu filtrarea data.table, și se face între paranteze drepte.

În acest caz, accesul la coloane se realizează neapărat prin indicarea numelui cadrului de date; apoi numele coloanei poate fi indicat și între ghilimele între paranteze drepte (exemplu df['col_name']), sau fără ghilimele după punct (exemplu df.col_name).

Dacă trebuie să filtrați un cadru de date după mai multe condiții, fiecare condiție trebuie să fie plasată în paranteze. Condițiile logice sunt conectate între ele de către operatori & и |.

Filtrarea șirurilor în Python: panda

# Фильтрация строк таблицы
### фильтрация строк по одному условию
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)]

Gruparea și agregarea datelor

Una dintre cele mai frecvent utilizate operațiuni în analiza datelor este gruparea și agregarea.

Ce limbă să alegeți pentru lucrul cu date - R sau Python? Ambii! Migrarea de la panda la tidyverse și data.table și înapoi

Sintaxa pentru efectuarea acestor operații este împrăștiată în toate pachetele pe care le examinăm.

În acest caz, vom lua ca exemplu un cadru de date titanic, și calculați numărul și costul mediu al biletelor în funcție de clasa de cabină.

Gruparea și agregarea datelor în R: tidyverse, dplyr

В dplyr funcția este utilizată pentru grupare group_by(), și pentru agregare summarise(). De fapt, dplyr există o întreagă familie de funcții summarise_*(), dar scopul acestui articol este de a compara sintaxa de bază, așa că nu vom intra într-o astfel de junglă.

Funcții de bază de agregare:

  • sum() — însumarea
  • min() / max() – valoarea minimă și maximă
  • mean() - in medie
  • median() — mediană
  • length() - cantitate

Gruparea și agregarea în R: dplyr

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

A functiona group_by() am trecut tabelul ca prim argument titanic, iar apoi a indicat câmpul Pclass, prin care ne vom grupa masa. Rezultatul acestei operațiuni folosind operatorul %>% transmis ca prim argument al funcției summarise()și a adăugat încă 2 câmpuri: pasageri и avg_price. În primul, folosind funcția length() calculat numărul de bilete, iar în al doilea folosind funcția mean() a primit prețul mediu al biletului.

Gruparea și agregarea datelor în R: data.table

В data.table argumentul este folosit pentru agregare j care are o a doua pozitie intre paranteze drepte, si pentru grupare by sau keyby, care au poziţia a treia.

Lista funcțiilor de agregare în acest caz este identică cu cea descrisă în dplyr, deoarece acestea sunt funcții din sintaxa R de bază.

Gruparea și agregarea în R: date.table

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

Gruparea și agregarea datelor în Python: panda

Gruparea în pandas similar cu dplyr, dar agregarea nu este similară cu dplyr nu pe data.table.

Pentru a grupa, utilizați metoda groupby(), în care trebuie să treceți o listă de coloane după care va fi grupat cadrul de date.

Pentru agregare puteți folosi metoda agg()care acceptă un dicționar. Cheile de dicționar sunt coloanele pe care veți aplica funcțiile de agregare, iar valorile sunt numele funcțiilor de agregare.

Funcții de agregare:

  • sum() — însumarea
  • min() / max() – valoarea minimă și maximă
  • mean() - in medie
  • median() — mediană
  • count() - cantitate

Funcție reset_index() în exemplul de mai jos este folosit pentru a reseta indecșii imbricați care pandas implicit după agregarea datelor.

simbol vă permite să treceți la linia următoare.

Gruparea și agregarea în Python: panda

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

Îmbinarea verticală a meselor

O operație în care uniți două sau mai multe tabele din aceeași structură. Datele pe care le-am încărcat conțin tabele ga_nov и ga_dec. Aceste tabele sunt identice ca structură, adică au aceleași coloane și tipurile de date din aceste coloane.

Ce limbă să alegeți pentru lucrul cu date - R sau Python? Ambii! Migrarea de la panda la tidyverse și data.table și înapoi

Aceasta este o încărcare de la Google Analytics pentru lunile noiembrie și decembrie, în această secțiune vom combina aceste date într-un singur tabel.

Îmbinarea verticală a tabelelor în R: tidyverse, dplyr

В dplyr Puteți combina 2 tabele într-unul singur folosind funcția bind_rows(), trecând tabelele ca argumente.

Filtrarea rândurilor în R: dplyr

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

Unirea verticală a tabelelor în R: data.table

De asemenea, nu este nimic complicat, să folosim rbind().

Filtrarea rândurilor în R: data.table

## data.table
rbind(ga_nov, ga_dec)

Îmbinarea verticală a tabelelor în Python: panda

В pandas funcția este folosită pentru a uni tabele concat(), în care trebuie să treceți o listă de cadre pentru a le combina.

Filtrarea șirurilor în Python: panda

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

Îmbinarea orizontală a meselor

O operație în care coloanele din al doilea sunt adăugate la primul tabel prin cheie. Este adesea folosit la îmbogățirea unui tabel de fapte (de exemplu, un tabel cu date de vânzări) cu unele date de referință (de exemplu, costul unui produs).

Ce limbă să alegeți pentru lucrul cu date - R sau Python? Ambii! Migrarea de la panda la tidyverse și data.table și înapoi

Există mai multe tipuri de îmbinări:

Ce limbă să alegeți pentru lucrul cu date - R sau Python? Ambii! Migrarea de la panda la tidyverse și data.table și înapoi

În tabelul încărcat anterior titanic avem o coloană sex, care corespunde codului de gen al pasagerului:

1 - feminin
2 - masculin

De asemenea, am creat un tabel - o carte de referință sex. Pentru o prezentare mai convenabilă a datelor despre sexul pasagerilor, trebuie să adăugăm numele genului din director sex la masă titanic.

Tabel orizontal îmbinare în R: tidyverse, dplyr

В dplyr Există o întreagă familie de funcții pentru îmbinarea orizontală:

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

Cel mai des folosit în practica mea este left_join().

Ca primele două argumente, funcțiile enumerate mai sus necesită două tabele pentru a se uni și ca al treilea argument by trebuie să specificați coloanele de alăturat.

Îmbinare orizontală a mesei în R: dplyr

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

Îmbinarea orizontală a tabelelor în R: data.table

В data.table Trebuie să vă alăturați meselor prin cheie folosind funcția merge().

Argumente pentru funcția merge() în data.table

  • x, y — Tabele pentru îmbinare
  • by — Coloană care este cheia de alăturare dacă are același nume în ambele tabele
  • by.x, by.y — Numele coloanelor care urmează să fie îmbinate, dacă au nume diferite în tabele
  • all, all.x, all.y — Tipul Join, all va returna toate rândurile din ambele tabele, all.x corespunde operației LEFT JOIN (va părăsi toate rândurile primului tabel), all.y — corespunde Operația RIGHT JOIN (va lăsa toate rândurile celui de-al doilea tabel).

Îmbinarea orizontală a tabelelor în R: data.table

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

Unirea orizontală a tabelului în Python: panda

La fel ca și în data.tableÎn pandas funcția este folosită pentru a uni tabele merge().

Argumente ale funcției merge() în panda

  • cum — Tip conexiune: stânga, dreapta, exterior, interior
  • on — Coloană care este o cheie dacă are același nume în ambele tabele
  • left_on, right_on — Numele coloanelor cheie, dacă au nume diferite în tabele

Unirea orizontală a tabelului în Python: panda

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

Funcții de bază ale ferestrei și coloane calculate

Funcțiile ferestre sunt similare ca semnificație cu funcțiile de agregare și sunt adesea folosite în analiza datelor. Dar, spre deosebire de funcțiile de agregare, funcțiile ferestre nu modifică numărul de rânduri ale cadrului de date de ieșire.

Ce limbă să alegeți pentru lucrul cu date - R sau Python? Ambii! Migrarea de la panda la tidyverse și data.table și înapoi

În esență, folosind funcția fereastră, împărțim cadrul de date primit în părți în funcție de un anumit criteriu, de exemplu. prin valoarea unui câmp sau a mai multor câmpuri. Și efectuăm operații aritmetice pe fiecare fereastră. Rezultatul acestor operațiuni va fi returnat pe fiecare linie, adică. fără a modifica numărul total de rânduri din tabel.

De exemplu, să luăm masa titanic. Putem calcula ce procentaj a fost costul fiecărui bilet în cadrul clasei sale de cabină.

Pentru a face acest lucru, trebuie să obținem în fiecare linie costul total al unui bilet pentru clasa actuală de cabină căreia îi aparține biletul din această linie, apoi să împărțim costul fiecărui bilet la costul total al tuturor biletelor din aceeași clasă de cabină. .

Funcțiile ferestrei în R: tidyverse, dplyr

Pentru a adăuga coloane noi, fără a utiliza gruparea de rânduri, în dplyr serveste functiei mutate().

Puteți rezolva problema descrisă mai sus prin gruparea datelor după câmp Pclass și însumând câmpul într-o nouă coloană tarif. Apoi, degrupați tabelul și împărțiți valorile câmpului tarif la ceea ce s-a întâmplat în pasul anterior.

Funcțiile ferestrei în R: dplyr

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

Funcțiile ferestrei în R: date.table

Algoritmul de soluție rămâne același ca în dplyr, trebuie să împărțim tabelul în ferestre după câmp Pclass. Scoateți într-o coloană nouă suma pentru grupul corespunzătoare fiecărui rând și adăugați o coloană în care calculăm cota din costul fiecărui bilet din grupul său.

Pentru a adăuga coloane noi la data.table operator prezent :=. Mai jos este un exemplu de rezolvare a unei probleme folosind pachetul data.table

Funcțiile ferestrei în R: date.table

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

Funcții ferestre în Python: panda

O modalitate de a adăuga o nouă coloană la pandas - utilizați funcția assign(). Pentru a rezuma costul biletelor pe clasa de cabină, fără a grupa rândurile, vom folosi funcția transform().

Mai jos este un exemplu de soluție în care adăugăm la tabel titanic aceleasi 2 coloane.

Funcții ferestre în Python: panda

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

Tabel de corespondență funcții și metode

Mai jos este un tabel de corespondență între metodele de realizare a diferitelor operațiuni cu datele din pachetele pe care le-am luat în considerare.

descriere
tidyverse
tabel de date
panda

Încărcare date
vroom()/ readr::read_csv() / readr::read_tsv()
fread()
read_csv()

Crearea cadrelor de date
tibble()
data.table()
dict() + from_dict()

Selectarea coloanelor
select()
argument j, a doua poziţie între paranteze drepte
trecem lista coloanelor necesare între paranteze drepte / drop() / filter() / select_dtypes()

Filtrarea rândurilor
filter()
argument i, prima poziţie între paranteze drepte
Enumerăm condițiile de filtrare între paranteze drepte / filter()

Gruparea și agregarea
group_by() + summarise()
argumentele j + by
groupby() + agg()

Unirea verticală a meselor (UNION)
bind_rows()
rbind()
concat()

Îmbinarea orizontală a meselor (JOIN)
left_join() / *_join()
merge()
merge()

Funcții de bază ale ferestrei și adăugarea de coloane calculate
group_by() + mutate()
argument j folosind operatorul := + argument by
transform() + assign()

Concluzie

Poate că în articol am descris nu cele mai optime implementări de prelucrare a datelor, așa că mă voi bucura dacă îmi corectați greșelile în comentarii sau pur și simplu completați informațiile oferite în articol cu ​​alte tehnici de lucru cu date în R/Python.

După cum am scris mai sus, scopul articolului nu a fost acela de a-și impune opinia cu privire la ce limbă este mai bună, ci de a simplifica oportunitatea de a învăța ambele limbi sau, dacă este necesar, de a migra între ele.

Dacă ți-a plăcut articolul, voi fi bucuros să am noi abonați la mine youtube и telegramă canale.

Опрос

Pe care dintre următoarele pachete le folosiți în munca dvs.?

În comentarii poți scrie motivul alegerii tale.

Numai utilizatorii înregistrați pot participa la sondaj. Loghează-te, Vă rog.

Ce pachet de prelucrare a datelor utilizați (puteți selecta mai multe opțiuni)

  • 45,2%tidyverse19

  • 33,3%date.tabel14

  • 54,8%panda23

Au votat 42 de utilizatori. 9 utilizatori s-au abținut.

Sursa: www.habr.com

Adauga un comentariu