ProHoster > BLOG > administrare > Ce limbă să alegeți pentru lucrul cu date - R sau Python? Ambii! Migrarea de la panda la tidyverse și data.table și înapoi
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.
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.
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:
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:
В data.table lanțurile sunt folosite în mod similar.
Î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.
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
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.
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.
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.
Pe parcursul articolului vom folosi mai multe seturi de date:
Două descărcări de pe Google Analytics.
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.
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:
Î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().
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.
В 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ă.
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
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.
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 (exempludf['col_name']), sau fără ghilimele după punct (exempludf.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.
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ă.
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.
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).
Există mai multe tipuri de îmbinări:
Î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).
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.
Î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.
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.
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.