Kuru valodu izvēlēties darbam ar datiem - R vai Python? Abi! Migrācija no pandām uz tidyverse un data.table un atpakaļ

Internetā meklējot R vai Python, jūs atradīsiet miljoniem rakstu un kilometru diskusiju par tēmu, kurš ir labāks, ātrāks un ērtāks darbam ar datiem. Bet diemžēl visi šie raksti un strīdi nav īpaši noderīgi.

Kuru valodu izvēlēties darbam ar datiem - R vai Python? Abi! Migrācija no pandām uz tidyverse un data.table un atpakaļ

Šī raksta mērķis ir salīdzināt pamata datu apstrādes paņēmienus populārākajās abu valodu pakotnēs. Un palīdziet lasītājiem ātri apgūt kaut ko, ko viņi vēl nezina. Tiem, kas raksta Python, uzziniet, kā to pašu izdarīt ar R un otrādi.

Raksta laikā mēs analizēsim populārāko R pakotņu sintaksi. Šīs ir bibliotēkā iekļautās pakotnes. tidyverseun arī iepakojums data.table. Un salīdziniet to sintaksi ar pandas, populārākā Python datu analīzes pakotne.

Mēs soli pa solim veiksim visu datu analīzes ceļu no to ielādes līdz analītisko logu funkciju veikšanai, izmantojot Python un R.

saturs

Šo rakstu var izmantot kā apkrāptu lapu, ja esat aizmirsis, kā kādā no aplūkojamajām pakotnēm veikt kādu datu apstrādes darbību.

Kuru valodu izvēlēties darbam ar datiem - R vai Python? Abi! Migrācija no pandām uz tidyverse un data.table un atpakaļ

  1. Galvenās sintakses atšķirības starp R un Python
    1.1. Piekļuve pakotnes funkcijām
    1.2. Piešķiršana
    1.3. Indeksēšana
    1.4. Metodes un OOP
    1.5. Cauruļvadi
    1.6. Datu struktūras
  2. Daži vārdi par iepakojumiem, ko izmantosim
    2.1. sakārtotība
    2.2. dati.tabula
    2.3. pandas
  3. Pakešu instalēšana
  4. Notiek datu ielāde
  5. Datu rāmju izveide
  6. Nepieciešamo kolonnu izvēle
  7. Rindas filtrēšana
  8. Grupēšana un apkopošana
  9. Vertikālā tabulu savienība (UNION)
  10. Horizontāla tabulu savienošana (JOIN)
  11. Logu pamatfunkcijas un aprēķinātās kolonnas
  12. Atbilstības tabula starp datu apstrādes metodēm R un Python
  13. Secinājums
  14. Īsa aptauja par to, kuru pakotni izmantojat

Ja jūs interesē datu analīze, jūs varat atrast manu telegramma и youtube kanāliem. Lielākā daļa satura ir veltīta R valodai.

Galvenās sintakses atšķirības starp R un Python

Lai jums būtu vieglāk pārslēgties no Python uz R vai otrādi, es sniegšu dažus galvenos punktus, kuriem jums jāpievērš uzmanība.

Piekļuve pakotnes funkcijām

Kad pakotne ir ielādēta R, jums nav jānorāda pakotnes nosaukums, lai piekļūtu tās funkcijām. Vairumā gadījumu tas nav izplatīts R, bet tas ir pieņemams. Jums vispār nav jāimportē pakotne, ja kodā ir nepieciešama kāda no tās funkcijām, bet vienkārši izsauciet to, norādot pakotnes nosaukumu un funkcijas nosaukumu. Atdalītājs starp pakotnes un funkciju nosaukumiem R ir dubultā kola. package_name::function_name().

Gluži pretēji, Python tiek uzskatīts par klasisku pakotnes funkciju izsaukšanu, skaidri norādot tās nosaukumu. Kad pakotne tiek lejupielādēta, tai parasti tiek dots saīsināts nosaukums, piem. pandas parasti tiek lietots pseidonīms pd. Pakotnes funkcijai var piekļūt, izmantojot punktu package_name.function_name().

Piešķiršana

R valodā parasti tiek izmantota bultiņa, lai objektam piešķirtu vērtību. obj_name <- value, lai gan ir atļauta viena vienādības zīme, viena vienādības zīme R tiek izmantota galvenokārt, lai nodotu vērtības funkcijas argumentiem.

Python programmā piešķiršana tiek veikta tikai ar vienu vienādības zīmi obj_name = value.

Indeksēšana

Šeit ir arī diezgan būtiskas atšķirības. Rā indeksēšana sākas ar vienu un ietver visus norādītos elementus iegūtajā diapazonā,

Programmā Python indeksēšana sākas no nulles, un atlasītajā diapazonā nav iekļauts pēdējais rādītājā norādītais elements. Tātad dizains x[i:j] Python neiekļaus j elementu.

Atšķirības ir arī negatīvajā indeksācijā, R apzīmējumā x[-1] atgriezīs visus vektora elementus, izņemot pēdējo. Programmā Python līdzīgs apzīmējums atgriezīs tikai pēdējo elementu.

Metodes un OOP

R ievieš OOP savā veidā, par to es rakstīju rakstā "OOP R valodā (1. daļa): S3 klases". Kopumā R ir funkcionāla valoda, un viss tajā ir balstīts uz funkcijām. Tāpēc, piemēram, Excel lietotājiem dodieties uz tydiverse tas būs vieglāk nekā pandas. Lai gan tas var būt mans subjektīvais viedoklis.

Īsāk sakot, R objektiem nav metožu (ja mēs runājam par S3 klasēm, bet ir arī citas OOP implementācijas, kas ir daudz retāk sastopamas). Ir tikai vispārinātas funkcijas, kas tās apstrādā atšķirīgi atkarībā no objekta klases.

Cauruļvadi

Varbūt tas ir nosaukums pandas Tas nebūs pilnīgi pareizi, bet es mēģināšu izskaidrot nozīmi.

Lai nesaglabātu starpaprēķinus un neradītu nevajadzīgus objektus darba vidē, varat izmantot sava veida cauruļvadu. Tie. pārsūtīt aprēķina rezultātu no vienas funkcijas uz nākamo un nesaglabājiet starprezultātus.

Ņemsim šādu koda piemēru, kur mēs saglabājam starpaprēķinus atsevišķos objektos:

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

Mēs veicām 3 darbības secīgi, un katras rezultāts tika saglabāts atsevišķā objektā. Bet patiesībā mums šie starpposma objekti nav vajadzīgi.

Vai vēl sliktāk, bet vairāk pazīstams Excel lietotājiem.

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

Šajā gadījumā mēs nesaglabājām starpposma aprēķinu rezultātus, taču koda nolasīšana ar ligzdotām funkcijām ir ārkārtīgi neērta.

Mēs aplūkosim vairākas pieejas datu apstrādei R, un tās veic līdzīgas darbības dažādos veidos.

Cauruļvadi bibliotēkā tidyverse ievieš operators %>%.

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

Tādējādi mēs ņemam darba rezultātu func1() un nododiet to kā pirmo argumentu func2(), tad šī aprēķina rezultātu nododam kā pirmo argumentu func3(). Un beigās visus veiktos aprēķinus ierakstām objektā obj <-.

Visu iepriekš minēto labāk par vārdiem ilustrē šī mēma:
Kuru valodu izvēlēties darbam ar datiem - R vai Python? Abi! Migrācija no pandām uz tidyverse un data.table un atpakaļ

В data.table ķēdes tiek izmantotas līdzīgā veidā.

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

Katrā kvadrātiekavās varat izmantot iepriekšējās darbības rezultātu.

В pandas šādas darbības ir atdalītas ar punktu.

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

Tie. paņemam savu galdu df un izmantot viņas metodi fun1(), tad pielietojam metodi iegūtajam rezultātam fun2()pēc fun3(). Iegūtais rezultāts tiek saglabāts objektā objekts .

Datu struktūras

Datu struktūras R un Python ir līdzīgas, taču tām ir dažādi nosaukumi.

Apraksts
Vārds R
Vārds Python/pandas valodā

Tabulas struktūra
data.frame, data.table, tibble
DataFrame

Viendimensionāls vērtību saraksts
Vektors
Sērija pandu valodā vai saraksts tīrā Python valodā

Daudzlīmeņu netabulāra struktūra
Saraksts
Vārdnīca (dikts)

Tālāk apskatīsim dažas citas sintakses funkcijas un atšķirības.

Daži vārdi par iepakojumiem, ko izmantosim

Pirmkārt, es jums pastāstīšu nedaudz par iepakojumiem, ar kuriem jūs iepazīsities šī raksta laikā.

sakārtotība

Официальный сайт: tidyverse.org
Kuru valodu izvēlēties darbam ar datiem - R vai Python? Abi! Migrācija no pandām uz tidyverse un data.table un atpakaļ
Bibliotēka tidyverse raksta Hedlija Vikema, RStudio vecākā pētniece. tidyverse sastāv no iespaidīga pakotņu kopuma, kas vienkāršo datu apstrādi, no kurām 5 ir iekļautas 10 populārāko lejupielāžu sarakstā no CRAN repozitorija.

Bibliotēkas kodols sastāv no šādām pakotnēm: ggplot2, dplyr, tidyr, readr, purrr, tibble, stringr, forcats. Katra no šīm pakotnēm ir paredzēta konkrētas problēmas risināšanai. Piemēram dplyr radīts datu apstrādei, tidyr lai datus sakārtotu formātā, stringr vienkāršo darbu ar stīgām, un ggplot2 ir viens no populārākajiem datu vizualizācijas rīkiem.

Priekšrocība tidyverse ir vienkāršība un viegli lasāma sintakse, kas daudzējādā ziņā ir līdzīga SQL vaicājumu valodai.

dati.tabula

Kuru valodu izvēlēties darbam ar datiem - R vai Python? Abi! Migrācija no pandām uz tidyverse un data.table un atpakaļОфициальный сайт: r-datatable.com

Autors data.table ir Mets Dole no H2O.ai.

Pirmā bibliotēkas izdošana notika 2006. gadā.

Pakešu sintakse nav tik ērta kā iekšā tidyverse un vairāk atgādina klasiskos datu kadrus R, bet tajā pašā laikā ievērojami paplašināta funkcionalitāte.

Visas manipulācijas ar tabulu šajā pakotnē ir aprakstītas kvadrātiekavās un, ja tulkojat sintaksi data.table SQL, jūs saņemat kaut ko līdzīgu šim: data.table[ WHERE, SELECT, GROUP BY ]

Šīs pakotnes priekšrocība ir liela datu apjoma apstrādes ātrums.

pandas

Официальный сайт: pandas.pydata.org Kuru valodu izvēlēties darbam ar datiem - R vai Python? Abi! Migrācija no pandām uz tidyverse un data.table un atpakaļ

Bibliotēkas nosaukums cēlies no ekonometriskā termina “paneļa dati”, ko izmanto, lai aprakstītu daudzdimensiju strukturētas informācijas kopas.

Autors pandas ir amerikānis Vess Makkinijs.

Runājot par datu analīzi Python, vienāds pandas Nē. Ļoti daudzfunkcionāla, augsta līmeņa pakotne, kas ļauj veikt jebkādas manipulācijas ar datiem, sākot no datu ielādes no jebkuriem avotiem līdz to vizualizācijai.

Papildu pakotņu instalēšana

Šajā rakstā aplūkotās pakotnes nav iekļautas pamata R un Python izplatījumos. Lai gan ir neliels brīdinājums, ja instalējāt Anaconda izplatīšanu, instalējiet papildus pandas nav nepieciešams.

Pakešu instalēšana R

Ja esat vismaz vienu reizi atvēris RStudio izstrādes vidi, iespējams, jau zināt, kā instalēt nepieciešamo pakotni R. Lai instalētu pakotnes, izmantojiet standarta komandu install.packages() palaižot to tieši pašā R.

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

Pēc instalēšanas pakotnes ir jāsavieno, kam vairumā gadījumu tiek izmantota komanda library().

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

Pakešu instalēšana programmā Python

Tātad, ja jums ir instalēts tīrs Python, tad pandas jums tas jāinstalē manuāli. Atveriet komandrindu vai termināli atkarībā no operētājsistēmas un ievadiet šo komandu.

pip install pandas

Pēc tam mēs atgriežamies pie Python un importējam instalēto pakotni ar komandu import.

import pandas as pd

Notiek datu ielāde

Datu ieguve ir viens no svarīgākajiem datu analīzes posmiem. Gan Python, gan R, ja vēlaties, sniedz jums plašas iespējas iegūt datus no jebkuriem avotiem: lokāliem failiem, failiem no interneta, vietnēm, visa veida datu bāzēm.

Kuru valodu izvēlēties darbam ar datiem - R vai Python? Abi! Migrācija no pandām uz tidyverse un data.table un atpakaļ

Visā rakstā mēs izmantosim vairākas datu kopas:

  1. Divas lejupielādes no Google Analytics.
  2. Titānika pasažieru datu kopa.

Visi dati ir manā GitHub csv un tsv failu veidā. No kurienes mēs tos pieprasīsim?

Datu ielāde R: tidyverse, vroom, readr

Lai ielādētu datus bibliotēkā tidyverse Ir divi iepakojumi: vroom, readr. vroom modernāks, taču nākotnē iepakojumi var tikt kombinēti.

Citāts no oficiālā dokumentācija vroom.

vroom pret lasītāju
Ko nozīmē atbrīvošana no vroom nozīmē readr? Pagaidām mēs plānojam ļaut abām pakotnēm attīstīties atsevišķi, taču, visticamāk, nākotnē mēs tās apvienosim. Viens no vroom slinkās lasīšanas trūkumiem ir tas, ka par dažām datu problēmām nevar ziņot iepriekš, tāpēc ir jāapdomā, kā tās vislabāk apvienot.

vroom vs lasītājs
Ko nozīmē atbrīvošana? vroom par readr? Šobrīd plānojam abas paketes izstrādāt atsevišķi, taču, iespējams, nākotnē tās apvienosim. Viens no slinkas lasīšanas trūkumiem vroom ir tas, ka dažas problēmas ar datiem nevar ziņot iepriekš, tāpēc jums ir jādomā, kā tās vislabāk apvienot.

Šajā rakstā mēs apskatīsim abas datu ielādes pakotnes:

Notiek datu ielāde R: vroom pakotnē

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

Datu ielāde R: lasītājs

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

Iepakojumā vroom, neatkarīgi no csv / tsv datu formāta, ielāde tiek veikta ar tāda paša nosaukuma funkciju vroom(), iepakojumā readr mēs izmantojam atšķirīgu funkciju katram formātam read_tsv() и read_csv().

Datu ielāde R: data.table

В data.table ir datu ielādes funkcija fread().

Datu ielāde R: data.table pakotnē

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

Datu ielāde Python: pandas

Ja salīdzinām ar R pakotnēm, tad šajā gadījumā sintakse ir vistuvākā pandas griba readr, jo pandas var pieprasīt datus no jebkuras vietas, un šajā pakotnē ir vesela funkciju saime read_*().

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

Un daudzas citas funkcijas, kas paredzētas dažādu formātu datu nolasīšanai. Bet mūsu mērķiem ar to pietiek read_table() vai read_csv() izmantojot argumentu septembris lai norādītu kolonnu atdalītāju.

Datu ielāde 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")

Datu rāmju izveide

Tabula titānisks, kuru mēs ielādējām, ir lauks Dzimums, kurā tiek saglabāts pasažiera dzimuma identifikators.

Bet, lai ērtāk attēlotu datus attiecībā uz pasažiera dzimumu, jums vajadzētu izmantot vārdu, nevis dzimuma kodu.

Lai to izdarītu, mēs izveidosim nelielu direktoriju, tabulu, kurā būs attiecīgi tikai 2 kolonnas (kods un dzimuma vārds) un 2 rindas.

Datu rāmja izveide programmā R: tidyverse, dplyr

Tālāk esošajā koda piemērā mēs izveidojam vajadzīgo datu rāmi, izmantojot funkciju tibble() .

Datu rāmja izveide programmā R: dplyr

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

Datu rāmja izveide R: data.table

Datu rāmja izveide R: data.table

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

Datu rāmja izveide programmā Python: pandas

В pandas rāmju izveide tiek veikta vairākos posmos, vispirms izveidojam vārdnīcu un pēc tam vārdnīcu pārvēršam par datu rāmi.

Datu rāmja izveide programmā Python: pandas

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

Kolonnu atlasīšana

Tabulās, ar kurām strādājat, var būt desmitiem vai pat simtiem datu kolonnu. Bet, lai veiktu analīzi, parasti nav vajadzīgas visas kolonnas, kas ir pieejamas avota tabulā.

Kuru valodu izvēlēties darbam ar datiem - R vai Python? Abi! Migrācija no pandām uz tidyverse un data.table un atpakaļ

Tāpēc viena no pirmajām darbībām, ko veiksit ar avota tabulu, ir notīrīt to no nevajadzīgas informācijas un atbrīvot atmiņu, ko šī informācija aizņem.

Kolonnu atlase R: tidyverse, dplyr

sintakse dplyr ir ļoti līdzīga SQL vaicājumu valodai, ja jūs to pārzināt, jūs ātri apgūsit šo pakotni.

Lai atlasītu kolonnas, izmantojiet funkciju select().

Tālāk ir sniegti koda piemēri, ar kuriem kolonnas var atlasīt šādos veidos.

  • Nepieciešamo kolonnu nosaukumu uzskaitīšana
  • Skatiet kolonnu nosaukumus, izmantojot regulārās izteiksmes
  • Pēc datu veida vai jebkura cita kolonnā ietverto datu rekvizīta

Kolonnu atlase 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)

Kolonnu atlase R: data.table

Tās pašas operācijas data.table tiek izpildīti nedaudz atšķirīgi, raksta sākumā es sniedzu aprakstu par to, kādi argumenti ir ievietoti kvadrātiekavās data.table.

DT[i,j,by]

Kur:
es - kur, t.i. filtrēšana pēc rindām
j - atlasīt|atjaunināt|darīt, t.i. kolonnu atlase un konvertēšana
pēc - datu grupēšana

Kolonnu atlase 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$")]

Mainīgs .SD ļauj piekļūt visām kolonnām un .SDcols filtrējiet vajadzīgās kolonnas, izmantojot regulāras izteiksmes vai citas funkcijas, lai filtrētu vajadzīgo kolonnu nosaukumus.

Kolonnu atlase programmā Python, pandas

Lai atlasītu kolonnas pēc nosaukuma pandas pietiek ar to vārdu sarakstu. Un, lai atlasītu vai izslēgtu kolonnas pēc nosaukuma, izmantojot regulārās izteiksmes, jums ir jāizmanto funkcijas drop() и filter(), un arguments ass=1, ar kuru jūs norādāt, ka ir nepieciešams apstrādāt kolonnas, nevis rindas.

Lai atlasītu lauku pēc datu veida, izmantojiet funkciju select_dtypes(), un argumentos ietvert vai izslēgt nododiet datu tipu sarakstu, kas atbilst tiem laukiem, kas jums jāatlasa.

Kolonnu atlase programmā 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'])

Rindas filtrēšana

Piemēram, avota tabulā var būt vairāku gadu dati, taču jums ir jāanalizē tikai pēdējais mēnesis. Atkal papildu līnijas palēninās datu apstrādes procesu un aizsprosto datora atmiņu.

Kuru valodu izvēlēties darbam ar datiem - R vai Python? Abi! Migrācija no pandām uz tidyverse un data.table un atpakaļ

Filtrēšanas rindas R: tydyverse, dplyr

В dplyr funkcija tiek izmantota rindu filtrēšanai filter(). Kā pirmais arguments tiek izmantots datu rāmis, pēc tam jūs uzskaitāt filtrēšanas nosacījumus.

Rakstot loģiskās izteiksmes tabulas filtrēšanai, šajā gadījumā norādiet kolonnu nosaukumus bez pēdiņām un nedeklarējot tabulas nosaukumu.

Ja filtrēšanai izmantojat vairākas loģiskās izteiksmes, izmantojiet šādus operatorus:

  • & vai komats — loģisks UN
  • | - loģisks VAI

Rindu filtrēšana R: dplyr

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

Rindu filtrēšana R: data.table

Kā jau rakstīju iepriekš, in data.table datu konvertēšanas sintakse ir ievietota kvadrātiekavās.

DT[i,j,by]

Kur:
es - kur, t.i. filtrēšana pēc rindām
j - atlasīt|atjaunināt|darīt, t.i. kolonnu atlase un konvertēšana
pēc - datu grupēšana

Arguments tiek izmantots rindu filtrēšanai i, kurai kvadrātiekavās ir pirmā pozīcija.

Kolonnām var piekļūt loģiskās izteiksmēs bez pēdiņām un nenorādot tabulas nosaukumu.

Loģiskās izteiksmes ir saistītas viena ar otru tādā pašā veidā kā dplyr izmantojot & un | operatorus.

Rindu filtrēšana R: data.table

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

Virkņu filtrēšana Python: pandas

Filtrēt pēc rindām pandas līdzīgi kā filtrēšana data.table, un tiek darīts kvadrātiekavās.

Šajā gadījumā piekļuve kolonnām tiek veikta obligāti, norādot datu rāmja nosaukumu; tad kolonnas nosaukumu var norādīt arī pēdiņās kvadrātiekavās (piemērs df['col_name']), vai bez pēdiņām pēc perioda (piemērs df.col_name).

Ja datu rāmis jāfiltrē pēc vairākiem nosacījumiem, katrs nosacījums jāievieto iekavās. Loģiskos nosacījumus savā starpā savieno operatori & и |.

Virkņu filtrēšana 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)]

Datu grupēšana un apkopošana

Viena no visbiežāk izmantotajām operācijām datu analīzē ir grupēšana un apkopošana.

Kuru valodu izvēlēties darbam ar datiem - R vai Python? Abi! Migrācija no pandām uz tidyverse un data.table un atpakaļ

Šo darbību veikšanas sintakse ir izkaisīta visās mūsu pārskatāmajās pakotnēs.

Šajā gadījumā kā piemēru ņemsim datu rāmi titānisks, un aprēķiniet biļešu skaitu un vidējās izmaksas atkarībā no salona klases.

Datu grupēšana un apkopošana R: tidyverse, dplyr

В dplyr funkcija tiek izmantota grupēšanai group_by(), un apkopošanai summarise(). Patiesībā, dplyr ir vesela funkciju saime summarise_*(), taču šī raksta mērķis ir salīdzināt pamata sintaksi, tāpēc tādos džungļos neiedziļināsimies.

Galvenās apkopošanas funkcijas:

  • sum() — summēšana
  • min() / max() – minimālā un maksimālā vērtība
  • mean() - vidēji
  • median() — mediāna
  • length() - daudzums

Grupēšana un apkopošana R: dplyr

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

Funkcijā group_by() mēs izturējām tabulu kā pirmo argumentu titānisksun pēc tam norādīja lauku Pklase, pēc kuras mēs sagrupēsim savu tabulu. Šīs operācijas rezultāts, izmantojot operatoru %>% tika nodots kā pirmais funkcijas arguments summarise()un pievienoja vēl 2 laukus: pasažieriem и avg_price. Pirmajā, izmantojot funkciju length() aprēķināja biļešu skaitu, bet otrajā izmantojot funkciju mean() saņēma vidējo biļetes cenu.

Datu grupēšana un apkopošana R: dati.tabula

В data.table arguments tiek izmantots apkopošanai j kurai kvadrātiekavās ir otrā pozīcija, un grupēšanai by vai keyby, kuriem ir trešā pozīcija.

Apkopošanas funkciju saraksts šajā gadījumā ir identisks aprakstītajam dplyr, jo tās ir funkcijas no pamata R sintakses.

Grupēšana un apkopošana R: dati.tabula

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

Datu grupēšana un apkopošana Python: pandas

Grupēšana iekšā pandas līdzīgs dplyr, bet apkopojums nav līdzīgs dplyr nav ieslēgts data.table.

Lai grupētu, izmantojiet metodi groupby(), kurā jāievada kolonnu saraksts, pēc kurām tiks grupēts datu rāmis.

Apkopošanai varat izmantot metodi agg()kas pieņem vārdnīcu. Vārdnīcas atslēgas ir kolonnas, kurās izmantosit apkopošanas funkcijas, un vērtības ir apkopošanas funkciju nosaukumi.

Apkopošanas funkcijas:

  • sum() — summēšana
  • min() / max() – minimālā un maksimālā vērtība
  • mean() - vidēji
  • median() — mediāna
  • count() - daudzums

Funkcija reset_index() tālāk esošajā piemērā tas tiek izmantots, lai atiestatītu ligzdotos indeksus, kas pandas noklusējuma vērtība ir pēc datu apkopošanas.

Simbols ļauj pāriet uz nākamo rindu.

Grupēšana un apkopošana Python: pandas

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

Vertikāls tabulu savienojums

Darbība, kurā jūs savienojat divas vai vairākas vienas un tās pašas struktūras tabulas. Ielādētie dati satur tabulas ga_nov и ga_dec. Šīs tabulas pēc struktūras ir identiskas, t.i. ir vienādas kolonnas un datu tipi šajās kolonnās.

Kuru valodu izvēlēties darbam ar datiem - R vai Python? Abi! Migrācija no pandām uz tidyverse un data.table un atpakaļ

Šī ir augšupielāde no Google Analytics par novembri un decembri. Šajā sadaļā mēs apvienosim šos datus vienā tabulā.

Vertikāli savienojamas tabulas R: tidyverse, dplyr

В dplyr Izmantojot funkciju, varat apvienot 2 tabulas vienā bind_rows(), nododot tabulas kā argumentus.

Rindu filtrēšana R: dplyr

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

Vertikāli savienojot tabulas R: data.table

Tas arī nav nekas sarežģīts, izmantosim rbind().

Rindu filtrēšana R: data.table

## data.table
rbind(ga_nov, ga_dec)

Vertikāli savienotas tabulas Python: pandas

В pandas funkcija tiek izmantota tabulu savienošanai concat(), kurā jums ir jānodod kadru saraksts, lai tos apvienotu.

Virkņu filtrēšana Python: pandas

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

Horizontāla tabulu savienošana

Darbība, kurā kolonnas no otrās tiek pievienotas pirmajai tabulai pēc atslēgas. To bieži izmanto, bagātinot faktu tabulu (piemēram, tabulu ar pārdošanas datiem) ar dažiem atsauces datiem (piemēram, produkta izmaksām).

Kuru valodu izvēlēties darbam ar datiem - R vai Python? Abi! Migrācija no pandām uz tidyverse un data.table un atpakaļ

Ir vairāki savienojumu veidi:

Kuru valodu izvēlēties darbam ar datiem - R vai Python? Abi! Migrācija no pandām uz tidyverse un data.table un atpakaļ

Iepriekš ielādētajā tabulā titānisks mums ir kolonna Dzimums, kas atbilst pasažiera dzimuma kodam:

1 - sieviete
2 - vīrietis

Tāpat esam izveidojuši tabulu – uzziņu grāmatu vecāka dzimumam. Lai ērtāk parādītu datus par pasažieru dzimumu, mums ir jāpievieno dzimuma nosaukums no direktorijas vecāka dzimumam pie galda titānisks.

Horizontālais galda savienojums R: tidyverse, dplyr

В dplyr Ir visa funkciju saime horizontālai savienošanai:

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

Manā praksē visbiežāk izmantotais ir left_join().

Kā pirmie divi argumenti, iepriekš uzskaitītajām funkcijām ir vajadzīgas divas tabulas, lai tās apvienotu, un kā trešo argumentu by jums ir jānorāda kolonnas, kurām pievienoties.

Horizontālā galda savienošana R: dplyr

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

Horizontālais tabulu savienojums R: data.table

В data.table Tabulas jāsavieno ar taustiņu, izmantojot funkciju merge().

Argumenti, lai apvienotu() funkciju tabulā data.table

  • x, y — tabulas savienošanai
  • by — kolonna, kas ir savienojuma atslēga, ja tai ir vienāds nosaukums abās tabulās
  • by.x, by.y — sapludināmo kolonnu nosaukumi, ja tiem tabulās ir dažādi nosaukumi
  • all, all.x, all.y — savienojuma veids, visi atgriezīs visas rindas no abām tabulām, all.x atbilst darbībai LEFT JOIN (atstās visas pirmās tabulas rindas), all.y — atbilst RIGHT JOIN darbība (atstās visas otrās tabulas rindas).

Horizontālais tabulu savienojums R: data.table

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

Horizontālā galda pievienošana Python: pandas

Kā arī iekšā data.tableUz pandas funkcija tiek izmantota tabulu savienošanai merge().

Funkcijas merge() argumenti pandās

  • kā — Savienojuma veids: kreisais, labais, ārējais, iekšējais
  • on — kolonna, kas ir atslēga, ja tai ir vienāds nosaukums abās tabulās
  • left_on, right_on — atslēgu kolonnu nosaukumi, ja tām tabulās ir dažādi nosaukumi

Horizontālā galda pievienošana Python: pandas

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

Logu pamatfunkcijas un aprēķinātās kolonnas

Logu funkcijas pēc nozīmes ir līdzīgas apkopošanas funkcijām, un tās bieži izmanto arī datu analīzē. Taču atšķirībā no apkopošanas funkcijām loga funkcijas nemaina izejošā datu rāmja rindu skaitu.

Kuru valodu izvēlēties darbam ar datiem - R vai Python? Abi! Migrācija no pandām uz tidyverse un data.table un atpakaļ

Būtībā, izmantojot loga funkciju, mēs sadalām ienākošo datu rāmi daļās pēc kāda kritērija, t.i. pēc lauka vērtības vai vairākiem laukiem. Un mēs veicam aritmētiskās darbības katrā logā. Šo darbību rezultāts tiks atgriezts katrā rindā, t.i. nemainot kopējo rindu skaitu tabulā.

Piemēram, ņemsim tabulu titānisks. Mēs varam aprēķināt, cik procentu katras biļetes izmaksas bija tās salona klasē.

Lai to izdarītu, katrā rindā jāiekļauj kopējās biļetes izmaksas pašreizējai kajītes klasei, kurai pieder šīs rindas biļete, pēc tam katras biļetes izmaksas jāsadala ar visu tās pašas klases biļešu kopējām izmaksām. .

Logu funkcijas R: tidyverse, dplyr

Lai pievienotu jaunas kolonnas, neizmantojot rindu grupēšanu, in dplyr pilda funkciju mutate().

Iepriekš aprakstīto problēmu var atrisināt, grupējot datus pa laukiem Pklase un lauku summēšana jaunā kolonnā Maksa. Pēc tam atgrupējiet tabulu un sadaliet lauku vērtības Maksa uz to, kas notika iepriekšējā solī.

Logu funkcijas R: dplyr

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

Logu funkcijas R: data.table

Risinājuma algoritms paliek tāds pats kā šeit dplyr, mums ir jāsadala tabula logos pēc lauka Pklase. Jaunā kolonnā ievadiet katrai rindai atbilstošo grupas summu un pievienojiet kolonnu, kurā mēs aprēķinām katras biļetes izmaksu daļu savā grupā.

Lai pievienotu jaunas kolonnas data.table operators klāt :=. Tālāk ir sniegts piemērs problēmas risināšanai, izmantojot paketi data.table

Logu funkcijas R: data.table

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

Logu funkcijas Python: pandas

Viens veids, kā pievienot jaunu kolonnu pandas - izmantojiet funkciju assign(). Lai apkopotu biļešu izmaksas pēc kajītes klasēm, negrupējot rindas, izmantosim funkciju transform().

Zemāk ir risinājuma piemērs, kuru pievienojam tabulai titānisks tās pašas 2 kolonnas.

Logu funkcijas Python: pandas

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

Funkciju un metožu atbilstības tabula

Zemāk ir atbilstības tabula starp metodēm dažādu darbību veikšanai ar datiem mūsu apskatītajās pakotnēs.

Apraksts
sakārtotība
dati.tabula
pandas

Notiek datu ielāde
vroom()/ readr::read_csv() / readr::read_tsv()
fread()
read_csv()

Datu rāmju izveide
tibble()
data.table()
dict() + from_dict()

Kolonnu atlasīšana
select()
arguments j, otrā pozīcija kvadrātiekavās
mēs nododam nepieciešamo kolonnu sarakstu kvadrātiekavās / drop() / filter() / select_dtypes()

Rindas filtrēšana
filter()
arguments i, pirmā pozīcija kvadrātiekavās
Mēs uzskaitām filtrēšanas nosacījumus kvadrātiekavās / filter()

Grupēšana un apkopošana
group_by() + summarise()
argumenti j + by
groupby() + agg()

Vertikālā tabulu savienība (UNION)
bind_rows()
rbind()
concat()

Horizontāla tabulu savienošana (JOIN)
left_join() / *_join()
merge()
merge()

Logu pamatfunkcijas un aprēķināto kolonnu pievienošana
group_by() + mutate()
arguments j izmantojot operatoru := + arguments by
transform() + assign()

Secinājums

Iespējams, rakstā es aprakstīju ne optimālākos datu apstrādes variantus, tāpēc priecāšos, ja komentāros izlabosit manas kļūdas vai vienkārši papildināsiet rakstā sniegto informāciju ar citiem paņēmieniem darbam ar datiem R / Python.

Kā jau rakstīju iepriekš, raksta mērķis nebija uzspiest savu viedokli par to, kura valoda ir labāka, bet gan vienkāršot iespēju apgūt abas valodas vai, ja nepieciešams, migrēt starp tām.

Ja jums patika raksts, es priecāšos, ja man būs jauni abonenti youtube и telegramma kanāliem.

Опрос

Kuru no tālāk norādītajām pakotnēm jūs izmantojat savā darbā?

Komentāros varat ierakstīt savas izvēles iemeslu.

Aptaujā var piedalīties tikai reģistrēti lietotāji. Ielogoties, lūdzu.

Kuru datu apstrādes pakotni izmantojat (var izvēlēties vairākas iespējas)

  • 45,2%sakopts verse19

  • 33,3%dati.tabula14

  • 54,8%pandas23

Nobalsoja 42 lietotāji. 9 lietotāji atturējās.

Avots: www.habr.com

Pievieno komentāru