Millist keelt andmetega töötamiseks valida – R või Python? Mõlemad! Ränne pandadelt tidyverse'i ja data.table ja tagasi

Internetist R või Pythonit otsides leiate miljoneid artikleid ja kilomeetreid arutelusid teemal, kumb on andmetega töötamiseks parem, kiirem ja mugavam. Kuid kahjuks pole kõik need artiklid ja vaidlused eriti kasulikud.

Millist keelt andmetega töötamiseks valida – R või Python? Mõlemad! Ränne pandadelt tidyverse'i ja data.table ja tagasi

Selle artikli eesmärk on võrrelda põhilisi andmetöötlustehnikaid mõlema keele kõige populaarsemates pakettides. Ja aidake lugejatel kiiresti omandada midagi, mida nad veel ei tea. Need, kes kirjutavad Pythonis, uurige, kuidas teha sama asja R-is ja vastupidi.

Artiklis analüüsime R-i kõige populaarsemate pakettide süntaksit. Need on teegis sisalduvad paketid tidyverseja ka pakett data.table. Ja võrrelge nende süntaksit pandas, Pythoni populaarseim andmeanalüüsi pakett.

Käime samm-sammult läbi kogu andmeanalüüsi tee alates laadimisest kuni Pythoni ja R-i abil analüütiliste aknafunktsioonide täitmiseni.

Sisu

Seda artiklit saab kasutada petulehena, kui olete unustanud, kuidas mõnes vaadeldavas paketis mõnda andmetöötlustoimingut teha.

Millist keelt andmetega töötamiseks valida – R või Python? Mõlemad! Ränne pandadelt tidyverse'i ja data.table ja tagasi

  1. Peamised süntaksi erinevused R ja Pythoni vahel
    1.1. Juurdepääs paketi funktsioonidele
    1.2. Ülesandmine
    1.3. Indekseerimine
    1.4. Meetodid ja OOP
    1.5. Torujuhtmed
    1.6. Andmestruktuurid
  2. Paar sõna pakettidest, mida kasutame
    2.1. korrastatu
    2.2. andmed.tabel
    2.3. pandas
  3. Pakettide installimine
  4. Andmete laadimine
  5. Andmeraamide loomine
  6. Vajalike veergude valimine
  7. Ridade filtreerimine
  8. Rühmitamine ja koondamine
  9. Vertikaalne tabelite liit (UNION)
  10. Tabelite horisontaalne ühendamine (JOIN)
  11. Akna põhifunktsioonid ja arvutatud veerud
  12. Andmetöötlusmeetodite vastavustabel R-is ja Pythonis
  13. Järeldus
  14. Lühiküsitlus selle kohta, millist paketti te kasutate

Kui olete huvitatud andmete analüüsist, võite leida minu telegramm и youtube kanalid. Suurem osa sisust on pühendatud R-keelele.

Peamised süntaksi erinevused R ja Pythoni vahel

Pythonilt R-le või vastupidi ülemineku hõlbustamiseks annan teile mõned põhipunktid, millele peate tähelepanu pöörama.

Juurdepääs paketi funktsioonidele

Kui pakett on R-i laaditud, ei pea te selle funktsioonidele juurdepääsuks paketi nime määrama. Enamikul juhtudel pole see R-is tavaline, kuid see on vastuvõetav. Kui vajate mõnda selle funktsiooni oma koodis, ei pea te paketti üldse importima, vaid lihtsalt helistage sellele, määrates paketi nime ja funktsiooni nime. Paketi ja funktsioonide nimede eraldaja R-is on topeltkoolon. package_name::function_name().

Vastupidi, Pythonis peetakse klassikaliseks kutsuda paketi funktsioone, täpsustades selle nime. Kui pakett on alla laaditud, antakse sellele tavaliselt lühendatud nimi, nt. pandas tavaliselt kasutatakse pseudonüümi pd. Paketi funktsioonile pääseb juurde punkti kaudu package_name.function_name().

Ülesandmine

R-is kasutatakse objektile väärtuse määramiseks tavaliselt noolt. obj_name <- value, kuigi üks võrdusmärk on lubatud, kasutatakse ühte võrdusmärki R-is peamiselt väärtuste edastamiseks funktsiooni argumentidele.

Pythonis tehakse määramine ainult ühe võrdusmärgiga obj_name = value.

Indekseerimine

Siin on ka üsna olulisi erinevusi. R-is algab indekseerimine ühest ja hõlmab kõiki määratud elemente saadud vahemikus,

Pythonis algab indekseerimine nullist ja valitud vahemik ei sisalda viimast indeksis määratud elementi. Nii et disain x[i:j] Pythonis ei sisalda j elementi.

Erinevusi on ka negatiivses indekseerimises, R-tähistuses x[-1] tagastab kõik vektori elemendid peale viimase. Pythonis tagastab sarnane märge ainult viimase elemendi.

Meetodid ja OOP

R rakendab OOP-i omal moel, kirjutasin sellest artiklis "OOP R-keeles (1. osa): S3 klassid". Üldiselt on R funktsionaalne keel ja kõik selles sisalduv on üles ehitatud funktsioonidele. Seetõttu minge näiteks Exceli kasutajate jaoks aadressile tydiverse see on lihtsam kui pandas. Kuigi see võib olla minu subjektiivne arvamus.

Lühidalt öeldes pole R-i objektidel meetodeid (kui me räägime S3 klassidest, kuid on ka teisi OOP-i rakendusi, mis on palju vähem levinud). On ainult üldistatud funktsioone, mis töötlevad neid sõltuvalt objekti klassist erinevalt.

Torujuhtmed

Võib-olla on see nimi pandas See ei ole päris õige, kuid ma püüan selle tähendust selgitada.

Selleks, et mitte säästa vahepealseid arvutusi ja mitte tekitada töökeskkonnas tarbetuid objekte, võite kasutada omamoodi torujuhet. Need. edastage arvutuse tulemus ühest funktsioonist teise ja ärge salvestage vahetulemusi.

Võtame järgmise koodinäite, kus salvestame vahearvutused eraldi objektidesse:

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

Tegime järjestikku 3 toimingut ja igaühe tulemus salvestati eraldi objektile. Aga tegelikult pole meil neid vahepealseid objekte vaja.

Või veel hullem, aga Exceli kasutajatele tuttavam.

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

Antud juhul me vahepealseid arvutustulemusi ei salvestanud, kuid pesastatud funktsioonidega koodi lugemine on äärmiselt ebamugav.

Vaatleme R-is mitmeid andmetöötluse lähenemisviise ja need teostavad sarnaseid toiminguid erineval viisil.

Torud raamatukogus tidyverse rakendab operaator %>%.

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

Seega võtame töö tulemuse func1() ja andke see esimese argumendina edasi func2(), siis edastame selle arvutuse tulemuse esimese argumendina func3(). Ja lõpuks kirjutame kõik tehtud arvutused objekti sisse obj <-.

Kõike ülaltoodut illustreerib see meem sõnadest paremini:
Millist keelt andmetega töötamiseks valida – R või Python? Mõlemad! Ränne pandadelt tidyverse'i ja data.table ja tagasi

В data.table ketti kasutatakse sarnaselt.

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

Igas nurksulgudes saate kasutada eelmise toimingu tulemust.

В pandas sellised toimingud on eraldatud punktiga.

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

Need. võtame oma laua df ja kasuta tema meetodit fun1(), siis rakendame saadud tulemusele meetodit fun2()pärast fun3(). Saadud tulemus salvestatakse objekti obj .

Andmestruktuurid

R-i ja Pythoni andmestruktuurid on sarnased, kuid neil on erinevad nimed.

Kirjeldus
Nimi kirjas R
Nimi Pythonis/pandas

Tabeli struktuur
data.frame, data.table, tibble
DataFrame

Ühemõõtmeline väärtuste loend
Vektor
Sari pandades või nimekiri puhtas Pythonis

Mitmetasandiline mittetabulaarne struktuur
Nimekiri
Sõnastik (dikt)

Allpool vaatleme mõningaid muid süntaksi funktsioone ja erinevusi.

Paar sõna pakettidest, mida kasutame

Esiteks räägin teile veidi pakettidest, millega saate selle artikli jooksul tuttavaks.

korrastatu

Официальный сайт: tidyverse.org
Millist keelt andmetega töötamiseks valida – R või Python? Mõlemad! Ränne pandadelt tidyverse'i ja data.table ja tagasi
raamatukogu tidyverse kirjutas Hedley Wickham, RStudio vanemteadur. tidyverse koosneb muljetavaldavast pakettide komplektist, mis lihtsustab andmetöötlust, millest 5 on CRAN-i hoidlast 10 parima allalaadimise hulgas.

Teegi tuum koosneb järgmistest pakettidest: ggplot2, dplyr, tidyr, readr, purrr, tibble, stringr, forcats. Kõik need paketid on suunatud konkreetse probleemi lahendamisele. Näiteks dplyr loodud andmetega manipuleerimiseks, tidyr et viia andmed puhtale kujule, stringr lihtsustab stringidega töötamist ja ggplot2 on üks populaarsemaid andmete visualiseerimise tööriistu.

Eelis tidyverse on lihtsus ja kergesti loetav süntaks, mis on paljuski sarnane SQL päringukeelega.

andmed.tabel

Millist keelt andmetega töötamiseks valida – R või Python? Mõlemad! Ränne pandadelt tidyverse'i ja data.table ja tagasiОфициальный сайт: r-datatable.com

Autor data.table on Matt Dole ettevõttest H2O.ai.

Raamatukogu esimene väljalaskmine toimus 2006. aastal.

Paketi süntaks pole nii mugav kui sees tidyverse ja meenutab pigem klassikalisi andmekaare R-s, kuid samas on funktsionaalsuselt oluliselt laienenud.

Kõiki selle paketi tabeliga manipuleerimisi kirjeldatakse nurksulgudes ja kui tõlgite süntaksi data.table SQL-is saate midagi sellist: data.table[ WHERE, SELECT, GROUP BY ]

Selle paketi tugevuseks on suurte andmemahtude töötlemise kiirus.

pandas

Официальный сайт: pandas.pydata.org Millist keelt andmetega töötamiseks valida – R või Python? Mõlemad! Ränne pandadelt tidyverse'i ja data.table ja tagasi

Teegi nimi pärineb ökonomeetrilisest terminist "paneelandmed", mida kasutatakse mitmemõõtmeliste struktureeritud teabekogumite kirjeldamiseks.

Autor pandas on ameeriklane Wes McKinney.

Kui rääkida Pythonis andmete analüüsist, siis võrdne pandas Ei. Väga multifunktsionaalne kõrgetasemeline pakett, mis võimaldab teha andmetega mis tahes manipuleerimist, alates andmete laadimisest mis tahes allikatest kuni nende visualiseerimiseni.

Lisapakettide installimine

Selles artiklis käsitletud paketid ei kuulu R- ja Pythoni põhidistributsioonidesse. Kuigi on väike hoiatus, kui installisite Anaconda distributsiooni, installige lisaks pandas ei ole vajalik.

Pakettide installimine R-sse

Kui olete RStudio arenduskeskkonna vähemalt korra avanud, teate ilmselt juba, kuidas vajalik pakett R-i installida. Pakettide installimiseks kasutage tavalist käsku install.packages() käivitades selle otse R-is endas.

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

Pärast installimist tuleb paketid ühendada, mille jaoks enamasti kasutatakse käsku library().

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

Pakkide installimine Pythonis

Seega, kui teil on installitud puhas Python, siis pandas peate selle käsitsi installima. Avage olenevalt operatsioonisüsteemist käsurida või terminal ja sisestage järgmine käsk.

pip install pandas

Seejärel pöördume tagasi Pythoni juurde ja impordime installitud paketi käsuga import.

import pandas as pd

Andmete laadimine

Andmekaeve on andmeanalüüsi üks olulisemaid samme. Nii Python kui ka R pakuvad soovi korral ulatuslikke võimalusi andmete hankimiseks mis tahes allikatest: kohalikest failidest, failidest Internetist, veebisaitidelt, kõikvõimalikest andmebaasidest.

Millist keelt andmetega töötamiseks valida – R või Python? Mõlemad! Ränne pandadelt tidyverse'i ja data.table ja tagasi

Kogu artiklis kasutame mitut andmekogumit:

  1. Kaks allalaadimist Google Analyticsist.
  2. Titanicu reisijate andmekogum.

Kõik andmed on minu käes GitHub csv- ja tsv-failide kujul. Kust me neid taotleme?

Andmete laadimine R: tidyverse, vroom, readr

Andmete laadimiseks teeki tidyverse Seal on kaks paketti: vroom, readr. vroom moodsamad, kuid edaspidi võidakse pakette kombineerida.

Tsitaat pärit ametlik dokumentatsioon vroom.

vroom vs lugeja
Millest vabanemine annab vroom tähendab readr? Praegu plaanime lasta neil kahel paketil eraldi areneda, kuid tõenäoliselt ühendame need paketid tulevikus. Vroomi laisa lugemise üks puudus on see, et teatud andmeprobleemidest ei saa eelnevalt teada anda, nii et nende kõige parem ühtlustamine nõuab pisut mõtlemist.

vroom vs lugeja
Mida tähendab vabastamine? vroom eest readr? Hetkel plaanime mõlemat paketti eraldi arendada, kuid tõenäoliselt ühendame need tulevikus. Üks laisa lugemise miinuseid vroom on see, et mõningaid andmetega seotud probleeme ei saa ette teatada, seega peate mõtlema, kuidas neid kõige paremini kombineerida.

Selles artiklis vaatleme mõlemat andmete laadimise paketti:

Andmete laadimine paketti 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")

Andmete laadimine kausta 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")

Pakendis vroom, olenemata csv / tsv andmevormingust toimub laadimine samanimelise funktsiooni abil vroom(), pakendis readr kasutame iga vormingu jaoks erinevat funktsiooni read_tsv() и read_csv().

Andmete laadimine R: data.table

В data.table seal on funktsioon andmete laadimiseks fread().

Andmete laadimine paketti 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")

Andmete laadimine Pythonis: pandas

Kui võrrelda R-pakettidega, siis sel juhul on süntaks kõige lähemal pandas tahe readr, sest pandas saab andmeid küsida kõikjalt ja selles paketis on terve hulk funktsioone read_*().

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

Ja palju muid funktsioone, mis on mõeldud andmete lugemiseks erinevatest vormingutest. Kuid meie eesmärkidel sellest piisab read_table() või read_csv() argumenti kasutades september veeru eraldaja määramiseks.

Andmete laadimine Pythonis: 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")

Andmeraamide loomine

Tabel titaanlik, mille laadisime, on põld Sugu, mis salvestab reisija sootunnuse.

Kuid reisija soo osas andmete mugavamaks esitamiseks peaksite kasutama nime, mitte sookoodi.

Selleks loome väikese kataloogi, tabeli, milles on vastavalt ainult 2 veergu (kood ja soonimi) ja 2 rida.

Andmeraami loomine R: tidyverse, dplyr

Allolevas koodinäites loome funktsiooni abil soovitud andmeraami tibble() .

Andmeraami loomine rakenduses R: dplyr

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

Andmeraami loomine R: data.table

Andmeraami loomine R: data.table

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

Andmeraami loomine Pythonis: pandas

В pandas Raamide loomine toimub mitmes etapis, kõigepealt koostame sõnastiku ja seejärel teisendame sõnastiku andmeraamiks.

Andmeraami loomine Pythonis: pandas

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

Veergude valimine

Tabelid, millega töötate, võivad sisaldada kümneid või isegi sadu andmeveerge. Kuid analüüsi tegemiseks pole reeglina vaja kõiki lähtetabelis saadaolevaid veerge.

Millist keelt andmetega töötamiseks valida – R või Python? Mõlemad! Ränne pandadelt tidyverse'i ja data.table ja tagasi

Seetõttu on üks esimesi lähtetabeliga tehtavaid toiminguid selle puhastamine tarbetust teabest ja selle teabe hõivatud mälu vabastamine.

Veergude valimine R: tidyverse, dplyr

süntaks dplyr on väga sarnane SQL päringukeelega, kui olete sellega tuttav, saate selle paketi kiiresti selgeks.

Veergude valimiseks kasutage funktsiooni select().

Allpool on näited koodidest, mille abil saate veerge valida järgmistel viisidel.

  • Nõutavate veergude nimede loetlemine
  • Vaadake veergude nimesid regulaaravaldiste abil
  • Andmetüübi või veerus sisalduvate andmete mis tahes muu omaduse järgi

Veergude valimine failis 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)

Veergude valimine R: data.table

Samad toimingud sisse data.table tehakse veidi erinevalt, kirjeldasin artikli alguses, millised argumendid on nurksulgudes data.table.

DT[i,j,by]

Kui:
i - kus, st. filtreerimine ridade järgi
j - vali|värskenda|teha, s.t. veergude valimine ja teisendamine
poolt - andmete rühmitamine

Veergude valimine 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$")]

Muutuv .SD võimaldab juurdepääsu kõikidele veergudele ja .SDcols filtreerige vajalikud veerud regulaaravaldiste või muude funktsioonide abil, et filtreerida vajalike veergude nimesid.

Veergude valimine Pythonis, pandas

Veergude valimiseks nime järgi pandas piisab nende nimede loetelu esitamisest. Ja veergude valimiseks või välistamiseks nime järgi regulaaravaldiste abil peate kasutama funktsioone drop() и filter(), ja argument telg=1, millega näitate, et on vaja töödelda pigem veerge kui ridu.

Välja valimiseks andmetüübi järgi kasutage funktsiooni select_dtypes(), ja argumentidesse sisaldama või välistama edastada andmetüüpide loend, mis vastab sellele, millistele väljadele peate valima.

Pythonis veergude valimine: 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'])

Ridade filtreerimine

Näiteks võib lähtetabel sisaldada mitme aasta andmeid, kuid analüüsida tuleb vaid viimast kuud. Jällegi aeglustavad lisaliinid andmetöötlusprotsessi ja ummistavad arvuti mälu.

Millist keelt andmetega töötamiseks valida – R või Python? Mõlemad! Ränne pandadelt tidyverse'i ja data.table ja tagasi

Ridade filtreerimine R: tydyverse, dplyr

В dplyr funktsiooni kasutatakse ridade filtreerimiseks filter(). See võtab esimese argumendina andmeraami, seejärel loetlete filtreerimistingimused.

Tabeli filtreerimiseks loogiliste avaldiste kirjutamisel määrake sel juhul veergude nimed ilma jutumärkideta ja ilma tabeli nime deklareerimata.

Kui kasutate filtreerimiseks mitut loogilist avaldist, kasutage järgmisi operaatoreid:

  • & või koma – loogiline JA
  • | - loogiline VÕI

Ridade filtreerimine R: dplyr

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

Ridade filtreerimine R: data.table

Nagu ma juba eespool kirjutasin, sisse data.table andmete teisendamise süntaks on nurksulgudes.

DT[i,j,by]

Kui:
i - kus, st. filtreerimine ridade järgi
j - vali|värskenda|teha, s.t. veergude valimine ja teisendamine
poolt - andmete rühmitamine

Argumenti kasutatakse ridade filtreerimiseks i, millel on nurksulgudes esimene positsioon.

Veergudele pääseb juurde loogilistes avaldistes ilma jutumärkideta ja tabeli nime määramata.

Loogilised avaldised on omavahel seotud samamoodi nagu in dplyr operaatorite & ja | kaudu.

Ridade filtreerimine R: data.table

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

Stringide filtreerimine Pythonis: pandad

Filtreerige ridade järgi pandas sarnane sisse filtreerimisega data.table, ja seda tehakse nurksulgudes.

Sel juhul toimub juurdepääs veergudele tingimata andmeraami nime märkimisega; siis saab veeru nime näidata ka jutumärkides nurksulgudes (näide df['col_name']) või ilma jutumärkideta pärast perioodi (näide df.col_name).

Kui teil on vaja andmeraami filtreerida mitme tingimuse järgi, tuleb iga tingimus panna sulgudesse. Loogilised tingimused seovad omavahel operaatorid & и |.

Stringide filtreerimine Pythonis: pandad

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

Andmete rühmitamine ja koondamine

Üks enamkasutatavaid toiminguid andmete analüüsis on rühmitamine ja liitmine.

Millist keelt andmetega töötamiseks valida – R või Python? Mõlemad! Ränne pandadelt tidyverse'i ja data.table ja tagasi

Nende toimingute sooritamise süntaks on hajutatud kõigis ülevaadatud pakettides.

Sel juhul võtame näiteks andmeraami titaanlik, ning arvutada piletite arv ja keskmine maksumus olenevalt kajutiklassist.

Andmete rühmitamine ja koondamine R: tidyverse, dplyr

В dplyr funktsiooni kasutatakse rühmitamiseks group_by(), ja liitmiseks summarise(). Tegelikult, dplyr seal on terve funktsioonide perekond summarise_*(), kuid selle artikli eesmärk on võrrelda põhisüntaksit, nii et me ei lasku sellisesse džunglisse.

Põhilised liitmisfunktsioonid:

  • sum() — summeerimine
  • min() / max() – minimaalne ja maksimaalne väärtus
  • mean() - keskmine
  • median() - mediaan
  • length() - kogus

Rühmitamine ja liitmine R: dplyr

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

Funktsioonis group_by() me läbisime tabeli esimese argumendina titaanlikja märkis seejärel välja Pklass, mille järgi rühmitame oma tabeli. Selle toimingu tulemus, kasutades operaatorit %>% anti funktsiooni esimese argumendina summarise()ja lisas veel 2 välja: reisijad и keskmine_hind. Esimeses, kasutades funktsiooni length() arvutas piletite arvu ja teises kasutades funktsiooni mean() sai keskmise piletihinna.

R-is olevate andmete rühmitamine ja koondamine: andmed.tabel

В data.table argumenti kasutatakse liitmiseks j millel on nurksulgudes teine ​​positsioon ja rühmitamiseks by või keyby, millel on kolmas koht.

Sel juhul on liitmisfunktsioonide loend identne punktis kirjeldatuga dplyr, sest need on R põhisüntaksi funktsioonid.

Rühmitamine ja liitmine R-is: andmed.tabel

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

Andmete rühmitamine ja koondamine Pythonis: pandad

Rühmitamine pandas sarnane dplyr, kuid liitmine ei ole sarnane dplyr mitte sisse lülitatud data.table.

Rühmitamiseks kasutage meetodit groupby(), millesse peate edastama veergude loendi, mille järgi andmeraam rühmitatakse.

Liitmiseks võite kasutada meetodit agg()mis aktsepteerib sõnaraamatut. Sõnastiku võtmed on veerud, millel rakendate liitmisfunktsioone, ja väärtused on liitmisfunktsioonide nimed.

Liitmisfunktsioonid:

  • sum() — summeerimine
  • min() / max() – minimaalne ja maksimaalne väärtus
  • mean() - keskmine
  • median() - mediaan
  • count() - kogus

Funktsioon reset_index() allolevas näites kasutatakse seda pesastatud indeksite lähtestamiseks pandas vaikimisi pärast andmete koondamist.

Sümbol võimaldab liikuda järgmisele reale.

Rühmitamine ja koondamine Pythonis: pandad

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

Tabelite vertikaalne liitmine

Toiming, mille käigus ühendate kaks või enam sama struktuuriga tabelit. Laaditud andmed sisaldavad tabeleid ga_nov и ga_dec. Need tabelid on ülesehituselt identsed, st. neil on samad veerud ja nendes veergudes olevad andmetüübid.

Millist keelt andmetega töötamiseks valida – R või Python? Mõlemad! Ränne pandadelt tidyverse'i ja data.table ja tagasi

See on üleslaadimine Google Analyticsist novembri ja detsembri kuu kohta, selles jaotises ühendame need andmed ühte tabelisse.

Vertikaalselt ühendatavad tabelid R-s: tidyverse, dplyr

В dplyr Funktsiooni abil saate ühendada 2 tabelit üheks bind_rows(), esitades argumentidena tabelid.

Ridade filtreerimine R: dplyr

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

Tabelite vertikaalne ühendamine R-is: andmed.tabel

Selles pole ka midagi keerulist, kasutame ära rbind().

Ridade filtreerimine R: data.table

## data.table
rbind(ga_nov, ga_dec)

Tabelite vertikaalne ühendamine Pythonis: pandad

В pandas funktsiooni kasutatakse tabelite ühendamiseks concat(), millesse peate nende ühendamiseks edastama raamide loendi.

Stringide filtreerimine Pythonis: pandad

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

Tabelite horisontaalne liitmine

Toiming, mille käigus lisatakse esimesesse tabelisse võtmega teise veerud. Seda kasutatakse sageli faktitabeli (näiteks müügiandmetega tabeli) rikastamisel mõne võrdlusandmetega (näiteks toote maksumus).

Millist keelt andmetega töötamiseks valida – R või Python? Mõlemad! Ränne pandadelt tidyverse'i ja data.table ja tagasi

Ühendusi on mitut tüüpi:

Millist keelt andmetega töötamiseks valida – R või Python? Mõlemad! Ränne pandadelt tidyverse'i ja data.table ja tagasi

Varem laaditud tabelis titaanlik meil on veerg Sugu, mis vastab reisija sookoodile:

1 - naine
2 - meessoost

Samuti oleme loonud tabeli - teatmeteose sugu. Reisijate soo andmete mugavamaks esitamiseks peame lisama kataloogist soo nime sugu lauale titaanlik.

Horisontaalne tabeliliit R: tidyverse, dplyr

В dplyr Horisontaalseks ühendamiseks on terve rida funktsioone:

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

Minu praktikas kõige sagedamini kasutatav on left_join().

Esimese kahe argumendina vajavad ülaltoodud funktsioonid ühendamiseks kahte tabelit ja kolmanda argumendina by peate määrama ühendatavad veerud.

Horisontaalne tabeliühendus R: dplyr

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

R-i tabelite horisontaalne liitmine: andmed.tabel

В data.table Funktsiooni abil peate tabelid võtmega ühendama merge().

Argumendid merge() funktsiooni andme.tabelis

  • x, y — Tabelid ühendamiseks
  • by – veerg, mis on ühendamise võti, kui sellel on mõlemas tabelis sama nimi
  • by.x, by.y — liidetavate veergude nimed, kui neil on tabelites erinevad nimed
  • all, all.x, all.y — liitumistüüp, kõik tagastab kõik read mõlemast tabelist, all.x vastab LEFT JOIN toimingule (jätab kõik esimese tabeli read), all.y — vastab RIGHT JOIN operatsioon (jätab kõik teise tabeli read).

R-i tabelite horisontaalne liitmine: andmed.tabel

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

Horisontaalne tabeliühendus Pythonis: pandad

Nagu ka sisse data.tableSisse pandas funktsiooni kasutatakse tabelite ühendamiseks merge().

Funktsiooni merge() argumendid pandades

  • kuidas — Ühenduse tüüp: vasak, parem, välimine, sisemine
  • on – veerg, mis on võti, kui sellel on mõlemas tabelis sama nimi
  • left_on, right_on – võtmeveergude nimed, kui neil on tabelites erinevad nimed

Horisontaalne tabeliühendus Pythonis: pandad

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

Akna põhifunktsioonid ja arvutatud veerud

Aknafunktsioonid on tähenduselt sarnased koondamisfunktsioonidele ja neid kasutatakse sageli ka andmete analüüsimisel. Kuid erinevalt koondamisfunktsioonidest ei muuda aknafunktsioonid väljuva andmeraami ridade arvu.

Millist keelt andmetega töötamiseks valida – R või Python? Mõlemad! Ränne pandadelt tidyverse'i ja data.table ja tagasi

Sisuliselt jagame akna funktsiooni kasutades sissetuleva andmekaadri mingi kriteeriumi järgi osadeks, s.t. välja väärtuse või mitme välja väärtuse järgi. Ja me teostame iga aknaga aritmeetilisi tehteid. Nende toimingute tulemus tagastatakse igal real, s.o. muutmata tabeli ridade koguarvu.

Näiteks võtame tabeli titaanlik. Saame arvutada, mitu protsenti oli iga pileti maksumus selle salongiklassi piires.

Selleks peame igale reale leidma praeguse kajutiklassi pileti kogumaksumuse, kuhu selle rea pilet kuulub, seejärel jagama iga pileti maksumuse sama kajutiklassi kõigi piletite kogumaksumusega. .

Akna funktsioonid R: tidyverse, dplyr

Uute veergude lisamiseks ilma ridade rühmitamist kasutamata dplyr täidab funktsiooni mutate().

Ülalkirjeldatud probleemi saate lahendada, rühmitades andmed väljade kaupa Pklass ja välja summeerimine uude veergu pileti hind. Järgmisena rühmitage tabel lahti ja jagage välja väärtused pileti hind eelmises etapis juhtunu kohta.

Akna funktsioonid R: dplyr

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

Aknafunktsioonid R: data.table

Lahendusalgoritm jääb samaks, mis on dplyr, peame tabeli väljade kaupa akendeks jagama Pklass. Sisestage uude veergu igale reale vastav grupi summa ja lisage veerg, milles arvutame iga pileti maksumuse osa selle rühmas.

Uute veergude lisamiseks data.table operaator kohal :=. Allpool on näide probleemi lahendamisest paketi abil data.table

Aknafunktsioonid R: data.table

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

Akende funktsioonid Pythonis: pandad

Üks viis uue veeru lisamiseks pandas - kasutage funktsiooni assign(). Piletite maksumuse kokkuvõtmiseks kajutiklasside kaupa, ilma ridu rühmitamata, kasutame funktsiooni transform().

Allpool on näide lahendusest, mille lisame tabelisse titaanlik samad 2 veergu.

Akende funktsioonid Pythonis: pandad

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

Funktsioonide ja meetodite vastavustabel

Allpool on tabel erinevate toimingute sooritamise meetodite vahel meie poolt käsitletud pakettides olevate andmetega.

Kirjeldus
korrastatu
andmed.tabel
pandas

Andmete laadimine
vroom()/ readr::read_csv() / readr::read_tsv()
fread()
read_csv()

Andmeraamide loomine
tibble()
data.table()
dict() + from_dict()

Veergude valimine
select()
argument j, teine ​​positsioon nurksulgudes
edastame vajalike veergude loendi nurksulgudes / drop() / filter() / select_dtypes()

Ridade filtreerimine
filter()
argument i, esimene positsioon nurksulgudes
Filtreerimistingimused loetleme nurksulgudes / filter()

Rühmitamine ja koondamine
group_by() + summarise()
argumendid j + by
groupby() + agg()

Vertikaalne tabelite liit (UNION)
bind_rows()
rbind()
concat()

Tabelite horisontaalne ühendamine (JOIN)
left_join() / *_join()
merge()
merge()

Akna põhifunktsioonid ja arvutatud veergude lisamine
group_by() + mutate()
argument j kasutades operaatorit := + argument by
transform() + assign()

Järeldus

Võib-olla kirjeldasin artiklis mitte kõige optimaalsemaid andmetöötluse rakendusi, nii et mul on hea meel, kui parandate kommentaarides minu vead või lihtsalt täiendate artiklis esitatud teavet muude R / Pythonis andmetega töötamise tehnikatega.

Nagu eespool kirjutasin, ei olnud artikli eesmärk oma arvamust peale suruda, kumb keel on parem, vaid lihtsustada võimalust õppida mõlemat keelt või vajadusel nende vahel rännata.

Kui teile artikkel meeldis, on mul hea meel uute tellijate üle youtube и telegramm kanalid.

Опрос

Millist järgmistest pakettidest kasutate oma töös?

Kommentaaridesse võid kirjutada oma valiku põhjuse.

Küsitluses saavad osaleda ainult registreerunud kasutajad. Logi sissepalun.

Millist andmetöötluspaketti kasutate (saate valida mitu võimalust)

  • 45,2%korrastatud 19

  • 33,3%andmed.tabel14

  • 54,8%pandad23

42 kasutajat hääletas. 9 kasutajat jäi erapooletuks.

Allikas: www.habr.com

Lisa kommentaar