Hvilket språk skal jeg velge for å jobbe med data - R eller Python? Både! Migrerer fra pandaer til tidyverse og data.table og tilbake

Ved å søke etter R eller Python på Internett vil du finne millioner av artikler og kilometer med diskusjoner om hvilken som er bedre, raskere og mer praktisk for å jobbe med data. Men dessverre er ikke alle disse artiklene og tvistene spesielt nyttige.

Hvilket språk skal jeg velge for å jobbe med data - R eller Python? Både! Migrerer fra pandaer til tidyverse og data.table og tilbake

Hensikten med denne artikkelen er å sammenligne de grunnleggende databehandlingsteknikkene i de mest populære pakkene på begge språk. Og hjelp leserne raskt å mestre noe de ikke vet ennå. For de som skriver i Python, finn ut hvordan du gjør det samme i R, og omvendt.

I løpet av artikkelen vil vi analysere syntaksen til de mest populære pakkene i R. Dette er pakkene som er inkludert i biblioteket tidyverseog også pakken data.table. Og sammenligne deres syntaks med pandas, den mest populære dataanalysepakken i Python.

Vi vil gå trinn for trinn gjennom hele banen til dataanalyse fra å laste den til å utføre analytiske vindusfunksjoner ved hjelp av Python og R.

Innhold

Denne artikkelen kan brukes som et jukseark hvis du har glemt hvordan du utfører en databehandlingsoperasjon i en av pakkene som vurderes.

Hvilket språk skal jeg velge for å jobbe med data - R eller Python? Både! Migrerer fra pandaer til tidyverse og data.table og tilbake

  1. Hovedsyntaksforskjeller mellom R og Python
    1.1. Få tilgang til pakkefunksjoner
    1.2. Oppdrag
    1.3. Indeksering
    1.4. Metoder og OOP
    1.5. Rørledninger
    1.6. Datastrukturer
  2. Noen få ord om pakkene vi skal bruke
    2.1. ryddig
    2.2. data bord
    2.3. pandaer
  3. Installerer pakker
  4. Laster inn data
  5. Opprette datarammer
  6. Velge kolonnene du trenger
  7. Filtrering av rader
  8. Gruppering og aggregering
  9. Vertikal forening av tabeller (UNION)
  10. Horisontal sammenføyning av tabeller (JOIN)
  11. Grunnleggende vindusfunksjoner og beregnede kolonner
  12. Korrespondansetabell mellom databehandlingsmetoder i R og Python
  13. Konklusjon
  14. En kort spørreundersøkelse om hvilken pakke du bruker

Hvis du er interessert i dataanalyse, kan du finne min telegram и youtube kanaler. Det meste av innholdet er dedikert til R-språket.

Hovedsyntaksforskjeller mellom R og Python

For å gjøre det lettere for deg å bytte fra Python til R, eller omvendt, vil jeg gi noen hovedpunkter som du må være oppmerksom på.

Få tilgang til pakkefunksjoner

Når en pakke er lastet inn i R, trenger du ikke spesifisere pakkenavnet for å få tilgang til funksjonene. I de fleste tilfeller er dette ikke vanlig i R, men det er akseptabelt. Du trenger ikke å importere en pakke i det hele tatt hvis du trenger en av funksjonene i koden din, men bare kall den ved å spesifisere navnet på pakken og navnet på funksjonen. Skillelinjen mellom pakke- og funksjonsnavn i R er et dobbelt kolon. package_name::function_name().

I Python, tvert imot, anses det som klassisk å kalle funksjonene til en pakke ved eksplisitt å spesifisere navnet. Når en pakke lastes ned får den vanligvis et forkortet navn, f.eks. pandas vanligvis brukes et pseudonym pd. En pakkefunksjon er tilgjengelig via en prikk package_name.function_name().

Oppdrag

I R er det vanlig å bruke en pil for å tildele en verdi til et objekt. obj_name <- value, selv om et enkelt likhetstegn er tillatt, brukes det enkle likhetstegnet i R hovedsakelig for å sende verdier til funksjonsargumenter.

I Python gjøres tildeling utelukkende med et enkelt likhetstegn obj_name = value.

Indeksering

Det er også ganske betydelige forskjeller her. I R starter indeksering med én og inkluderer alle spesifiserte elementer i det resulterende området,

I Python starter indeksering fra null og det valgte området inkluderer ikke det siste elementet spesifisert i indeksen. Så design x[i:j] i Python vil ikke inkludere j-elementet.

Det er også forskjeller i negativ indeksering, i R-notasjon x[-1] vil returnere alle elementene i vektoren unntatt den siste. I Python vil en lignende notasjon bare returnere det siste elementet.

Metoder og OOP

R implementerer OOP på sin egen måte, jeg skrev om dette i artikkelen "OOP på R-språket (del 1): S3-klasser". Generelt er R et funksjonelt språk, og alt i det er bygget på funksjoner. Derfor, for eksempel for Excel-brukere, gå til tydiverse det blir lettere enn pandas. Selv om dette kan være min subjektive mening.

Kort sagt, objekter i R har ikke metoder (hvis vi snakker om S3-klasser, men det er andre OOP-implementeringer som er mye mindre vanlige). Det er bare generaliserte funksjoner som behandler dem forskjellig avhengig av klassen til objektet.

Rørledninger

Kanskje dette er navnet på pandas Det blir ikke helt riktig, men jeg skal prøve å forklare betydningen.

For ikke å spare mellomberegninger og ikke produsere unødvendige gjenstander i arbeidsmiljøet, kan du bruke en slags rørledning. De. overføre resultatet av en beregning fra en funksjon til den neste, og ikke lagre mellomresultater.

La oss ta følgende kodeeksempel, der vi lagrer mellomliggende beregninger i separate objekter:

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

Vi utførte 3 operasjoner sekvensielt, og resultatet av hver ble lagret i et eget objekt. Men faktisk trenger vi ikke disse mellomobjektene.

Eller enda verre, men mer kjent for Excel-brukere.

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

I dette tilfellet lagret vi ikke mellomliggende beregningsresultater, men å lese kode med nestede funksjoner er ekstremt upraktisk.

Vi skal se på flere tilnærminger til databehandling i R, og de utfører lignende operasjoner på forskjellige måter.

Rørledninger i biblioteket tidyverse implementert av operatøren %>%.

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

Dermed tar vi resultatet av arbeidet func1() og gi det som det første argumentet til func2(), så passerer vi resultatet av denne beregningen som det første argumentet func3(). Og til slutt skriver vi alle beregningene som er utført i objektet obj <-.

Alt det ovennevnte er illustrert bedre enn ord av denne memen:
Hvilket språk skal jeg velge for å jobbe med data - R eller Python? Både! Migrerer fra pandaer til tidyverse og data.table og tilbake

В data.table kjeder brukes på lignende måte.

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

I hver av de firkantede parentesene kan du bruke resultatet av forrige operasjon.

В pandas slike operasjoner er atskilt med en prikk.

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

De. vi tar vårt bord df og bruke metoden hennes fun1(), så bruker vi metoden på det oppnådde resultatet fun2()etter fun3(). Det resulterende resultatet lagres i et objekt obj .

Datastrukturer

Datastrukturer i R og Python er like, men har forskjellige navn.

beskrivelse
Navn i R
Navn i Python/pandas

Tabellstruktur
data.frame, data.table, tibble
Dataramme

Endimensjonal liste over verdier
Vector
Serier i pandaer eller liste i ren Python

Ikke-tabellstruktur på flere nivåer
Liste
Ordbok (dikt)

Vi vil se på noen andre funksjoner og forskjeller i syntaks nedenfor.

Noen få ord om pakkene vi skal bruke

Først vil jeg fortelle deg litt om pakkene du vil bli kjent med i løpet av denne artikkelen.

ryddig

Официальный сайт: tidyverse.org
Hvilket språk skal jeg velge for å jobbe med data - R eller Python? Både! Migrerer fra pandaer til tidyverse og data.table og tilbake
Bibliotek tidyverse skrevet av Hedley Wickham, seniorforsker ved RStudio. tidyverse består av et imponerende sett med pakker som forenkler databehandling, hvorav 5 er inkludert i topp 10 nedlastinger fra CRAN-depotet.

Kjernen i biblioteket består av følgende pakker: ggplot2, dplyr, tidyr, readr, purrr, tibble, stringr, forcats. Hver av disse pakkene er rettet mot å løse et spesifikt problem. For eksempel dplyr laget for datamanipulering, tidyr å bringe dataene til en pen form, stringr forenkler arbeidet med strenger, og ggplot2 er et av de mest populære datavisualiseringsverktøyene.

Fordelen tidyverse er enkelheten og lettlest syntaks, som på mange måter ligner SQL-spørringsspråket.

data bord

Hvilket språk skal jeg velge for å jobbe med data - R eller Python? Både! Migrerer fra pandaer til tidyverse og data.table og tilbakeОфициальный сайт: r-datatable.com

Av forfatteren data.table er Matt Dole fra H2O.ai.

Den første utgivelsen av biblioteket fant sted i 2006.

Pakkesyntaksen er ikke så praktisk som i tidyverse og minner mer om klassiske datarammer i R, men samtidig betydelig utvidet i funksjonalitet.

Alle manipulasjoner med tabellen i denne pakken er beskrevet i hakeparenteser, og hvis du oversetter syntaksen data.table i SQL får du noe sånt som dette: data.table[ WHERE, SELECT, GROUP BY ]

Styrken til denne pakken er hastigheten på behandlingen av store datamengder.

pandaer

Официальный сайт: pandas.pydata.org Hvilket språk skal jeg velge for å jobbe med data - R eller Python? Både! Migrerer fra pandaer til tidyverse og data.table og tilbake

Navnet på biblioteket kommer fra det økonometriske begrepet "paneldata", som brukes til å beskrive flerdimensjonale strukturerte sett med informasjon.

Av forfatteren pandas er amerikanske Wes McKinney.

Når det gjelder dataanalyse i Python, like pandas Nei. En veldig multifunksjonell pakke på høyt nivå som lar deg utføre enhver manipulasjon med data, fra å laste data fra alle kilder til å visualisere dem.

Installerer tilleggspakker

Pakkene som er omtalt i denne artikkelen er ikke inkludert i de grunnleggende R- og Python-distribusjonene. Selv om det er en liten advarsel, hvis du installerte Anaconda-distribusjonen, installer i tillegg pandas ikke obligatorisk.

Installere pakker i R

Hvis du har åpnet RStudio-utviklingsmiljøet minst én gang, vet du sannsynligvis allerede hvordan du installerer den nødvendige pakken i R. For å installere pakker, bruk standardkommandoen install.packages() ved å kjøre den direkte i R selv.

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

Etter installasjonen må pakkene kobles til, som i de fleste tilfeller kommandoen brukes til library().

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

Installere pakker i Python

Så hvis du har ren Python installert, da pandas du må installere det manuelt. Åpne en kommandolinje eller terminal, avhengig av operativsystemet ditt, og skriv inn følgende kommando.

pip install pandas

Deretter går vi tilbake til Python og importerer den installerte pakken med kommandoen import.

import pandas as pd

Laster inn data

Data mining er et av de viktigste trinnene i dataanalyse. Både Python og R, om ønskelig, gir deg omfattende muligheter til å hente data fra alle kilder: lokale filer, filer fra Internett, nettsider, alle typer databaser.

Hvilket språk skal jeg velge for å jobbe med data - R eller Python? Både! Migrerer fra pandaer til tidyverse og data.table og tilbake

Gjennom artikkelen vil vi bruke flere datasett:

  1. To nedlastinger fra Google Analytics.
  2. Titanic passasjerdatasett.

Alle data er på min GitHub i form av csv- og tsv-filer. Hvor skal vi be om dem fra?

Laster data til R: tidyverse, vroom, readr

For å laste data inn i et bibliotek tidyverse Det er to pakker: vroom, readr. vroom mer moderne, men i fremtiden kan pakkene kombineres.

Sitat fra offisiell dokumentasjon vroom.

vroom vs leser
Hva betyr utgivelsen av vroom mener for readr? Foreløpig planlegger vi å la de to pakkene utvikle seg hver for seg, men sannsynligvis vil vi forene pakkene i fremtiden. En ulempe med vrooms late lesing er at visse dataproblemer ikke kan rapporteres på forhånd, så hvordan man best kan forene dem krever litt omtanke.

vroom vs readr
Hva betyr frigjøring? vroom for readr? For øyeblikket planlegger vi å utvikle begge pakkene separat, men vi kommer nok til å kombinere dem i fremtiden. En av ulempene med lat lesing vroom er at noen problemer med dataene ikke kan meldes på forhånd, så du må tenke på hvordan du best kan kombinere dem.

I denne artikkelen skal vi se på begge datalastingspakkene:

Laster data inn i R: vroom-pakken

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

Laster data inn i 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")

I pakken vroom, uavhengig av csv / tsv-dataformatet, utføres lasting av funksjonen med samme navn vroom(), i pakken readr vi bruker en annen funksjon for hvert format read_tsv() и read_csv().

Laster data til R: data.table

В data.table det er en funksjon for å laste data fread().

Laster data inn i R: data.table-pakken

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

Laster data i Python: pandaer

Hvis vi sammenligner med R-pakker, så er syntaksen i dette tilfellet nærmest pandas vil readr, fordi pandas kan be om data fra hvor som helst, og det er en hel familie av funksjoner i denne pakken read_*().

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

Og mange andre funksjoner designet for å lese data fra forskjellige formater. Men for våre formål er det nok read_table() eller read_csv() bruker argument september for å spesifisere kolonneseparatoren.

Laster data i Python: pandaer

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

Opprette datarammer

Bord titanic, som vi lastet, er det et felt Kjønn, som lagrer passasjerens kjønnsidentifikator.

Men for en mer praktisk presentasjon av data etter passasjerkjønn, bør du bruke navnet i stedet for kjønnskoden.

For å gjøre dette vil vi lage en liten katalog, en tabell der det bare vil være 2 kolonner (kode og kjønnsnavn) og 2 rader.

Opprette en dataramme i R: tidyverse, dplyr

I kodeeksemplet nedenfor lager vi ønsket dataramme ved hjelp av funksjonen tibble() .

Opprette en dataramme i R: dplyr

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

Opprette en dataramme i R: data.table

Opprette en dataramme i R: data.table

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

Opprette en dataramme i Python: pandas

В pandas Opprettelsen av rammer utføres i flere stadier, først lager vi en ordbok, og deretter konverterer vi ordboken til en dataramme.

Opprette en dataramme i Python: pandas

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

Velge kolonner

Tabellene du jobber med kan inneholde dusinvis eller til og med hundrevis av kolonner med data. Men for å utføre analyse trenger du som regel ikke alle kolonnene som er tilgjengelige i kildetabellen.

Hvilket språk skal jeg velge for å jobbe med data - R eller Python? Både! Migrerer fra pandaer til tidyverse og data.table og tilbake

Derfor er en av de første operasjonene du vil utføre med kildetabellen å fjerne den for unødvendig informasjon og frigjøre minnet som denne informasjonen opptar.

Velge kolonner i R: tidyverse, dplyr

syntaks dplyr er veldig lik SQL-spørringsspråket, hvis du er kjent med det vil du raskt mestre denne pakken.

For å velge kolonner, bruk funksjonen select().

Nedenfor er eksempler på kode som du kan velge kolonner med på følgende måter:

  • Viser navnene på de nødvendige kolonnene
  • Se kolonnenavn ved å bruke regulære uttrykk
  • Etter datatype eller annen egenskap for dataene i kolonnen

Velge kolonner i 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)

Velge kolonner i R: data.table

De samme operasjonene i data.table utføres litt annerledes, i begynnelsen av artikkelen ga jeg en beskrivelse av hvilke argumenter som er innenfor hakeparenteser data.table.

DT[i,j,by]

Hvor:
i - hvor, dvs. filtrering etter rader
j - velg|oppdater|do, dvs. velge kolonner og konvertere dem
etter - datagruppering

Velge kolonner i 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$")]

variabel .SD lar deg få tilgang til alle kolonner, og .SDcols filtrer de nødvendige kolonnene ved hjelp av regulære uttrykk, eller andre funksjoner for å filtrere navnene på kolonnene du trenger.

Velge kolonner i Python, pandaer

For å velge kolonner etter navn i pandas det er nok å gi en liste over navnene deres. Og for å velge eller ekskludere kolonner etter navn ved hjelp av regulære uttrykk, må du bruke funksjonene drop() и filter(), og argumentasjon akse=1, som du indikerer at det er nødvendig å behandle kolonner i stedet for rader.

For å velge et felt etter datatype, bruk funksjonen select_dtypes(), og inn i argumenter inkludere eller ekskludere sende en liste over datatyper som tilsvarer hvilke felt du må velge.

Velge kolonner i Python: pandaer

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

Filtrering av rader

Kildetabellen kan for eksempel inneholde flere år med data, men du trenger bare å analysere den siste måneden. Igjen vil ekstra linjer bremse databehandlingsprosessen og tette PC-minnet.

Hvilket språk skal jeg velge for å jobbe med data - R eller Python? Både! Migrerer fra pandaer til tidyverse og data.table og tilbake

Filtrering av rader i R: tydyverse, dplyr

В dplyr funksjonen brukes til å filtrere rader filter(). Det tar en dataramme som det første argumentet, så viser du filtreringsbetingelsene.

Når du skriver logiske uttrykk for å filtrere en tabell, spesifiser i dette tilfellet kolonnenavnene uten anførselstegn og uten å deklarere tabellnavnet.

Når du bruker flere logiske uttrykk for å filtrere, bruk følgende operatorer:

  • & eller komma - logisk OG
  • | - logisk ELLER

Filtrering av rader i R: dplyr

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

Filtrering av rader i R: data.table

Som jeg allerede skrev ovenfor, i data.table datakonverteringssyntaks er omgitt av hakeparenteser.

DT[i,j,by]

Hvor:
i - hvor, dvs. filtrering etter rader
j - velg|oppdater|do, dvs. velge kolonner og konvertere dem
etter - datagruppering

Argumentet brukes til å filtrere rader i, som har den første posisjonen i hakeparenteser.

Kolonner åpnes i logiske uttrykk uten anførselstegn og uten å spesifisere tabellnavnet.

Logiske uttrykk er relatert til hverandre på samme måte som i dplyr gjennom & og |-operatørene.

Filtrering av rader i R: data.table

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

Filtrere strenger i Python: pandaer

Filtrer etter rader i pandas ligner på å filtrere inn data.table, og gjøres i firkantede parenteser.

I dette tilfellet utføres tilgang til kolonner nødvendigvis ved å angi navnet på datarammen; da kan kolonnenavnet også angis i anførselstegn i hakeparenteser (eksempel df['col_name']), eller uten anførselstegn etter perioden (eksempel df.col_name).

Hvis du trenger å filtrere en dataramme etter flere forhold, må hver betingelse settes i parentes. Logiske forhold er forbundet med hverandre av operatører & и |.

Filtrere strenger i Python: pandaer

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

Gruppering og aggregering av data

En av de mest brukte operasjonene i dataanalyse er gruppering og aggregering.

Hvilket språk skal jeg velge for å jobbe med data - R eller Python? Både! Migrerer fra pandaer til tidyverse og data.table og tilbake

Syntaksen for å utføre disse operasjonene er spredt over alle pakkene vi vurderer.

I dette tilfellet vil vi ta en dataramme som eksempel titanic, og beregne antall og gjennomsnittlig pris på billetter avhengig av hytteklassen.

Gruppering og aggregering av data i R: tidyverse, dplyr

В dplyr funksjonen brukes til gruppering group_by(), og for aggregering summarise(). Faktisk, dplyr det er en hel familie av funksjoner summarise_*(), men hensikten med denne artikkelen er å sammenligne den grunnleggende syntaksen, så vi vil ikke gå inn i en slik jungel.

Grunnleggende aggregeringsfunksjoner:

  • sum() — summering
  • min() / max() – minimum og maksimum verdi
  • mean() - gjennomsnitt
  • median() - median
  • length() - mengde

Gruppering og aggregering i R: dplyr

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

I funksjon group_by() vi passerte tabellen som det første argumentet titanic, og indikerte deretter feltet Pclass, som vi vil gruppere bordet vårt etter. Resultatet av denne operasjonen ved å bruke operatøren %>% sendt som det første argumentet til funksjonen summarise(), og la til 2 felt til: passasjerer и avg_price. I det første bruker du funksjonen length() beregnet antall billetter, og i den andre ved hjelp av funksjonen mean() mottatt gjennomsnittlig billettpris.

Gruppering og aggregering av data i R: data.tabell

В data.table argumentet brukes til aggregering j som har en andre plassering i hakeparenteser, og for gruppering by eller keyby, som har den tredje posisjonen.

Listen over aggregeringsfunksjoner i dette tilfellet er identisk med den som er beskrevet i dplyr, fordi dette er funksjoner fra den grunnleggende R-syntaksen.

Gruppering og aggregering i R: data.tabell

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

Gruppering og aggregering av data i Python: pandaer

Gruppering inn pandas lik dplyr, men aggregeringen er ikke lik dplyr ikke på data.table.

For å gruppere, bruk metoden groupby(), der du må sende en liste over kolonner som datarammen vil bli gruppert etter.

For aggregering kan du bruke metoden agg()som godtar en ordbok. Ordboknøklene er kolonnene du skal bruke aggregeringsfunksjonene på, og verdiene er navnene på aggregeringsfunksjonene.

Aggregasjonsfunksjoner:

  • sum() — summering
  • min() / max() – minimum og maksimum verdi
  • mean() - gjennomsnitt
  • median() - median
  • count() - mengde

Funksjon reset_index() i eksemplet nedenfor brukes det til å tilbakestille nestede indekser som pandas standard til etter dataaggregering.

Symbol lar deg gå til neste linje.

Gruppering og aggregering i Python: pandaer

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

Vertikal sammenføyning av tabeller

En operasjon der du kobler sammen to eller flere tabeller med samme struktur. Dataene vi lastet inn inneholder tabeller ga_nov и ga_des. Disse tabellene er identiske i strukturen, dvs. har de samme kolonnene, og datatypene i disse kolonnene.

Hvilket språk skal jeg velge for å jobbe med data - R eller Python? Både! Migrerer fra pandaer til tidyverse og data.table og tilbake

Dette er en opplasting fra Google Analytics for november og desember, i denne delen vil vi kombinere disse dataene i én tabell.

Vertikalt sammenføyende tabeller i R: tidyverse, dplyr

В dplyr Du kan kombinere 2 tabeller til ett ved hjelp av funksjonen bind_rows(), passerer tabeller som sine argumenter.

Filtrering av rader i R: dplyr

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

Vertikal sammenføyning av tabeller i R: data.table

Det er heller ikke noe komplisert, la oss bruke rbind().

Filtrering av rader i R: data.table

## data.table
rbind(ga_nov, ga_dec)

Vertikalt sammenføyning av tabeller i Python: pandaer

В pandas funksjonen brukes til å slå sammen tabeller concat(), der du må sende en liste over rammer for å kombinere dem.

Filtrere strenger i Python: pandaer

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

Horisontal sammenføyning av tabeller

En operasjon der kolonner fra den andre legges til den første tabellen med nøkkel. Det brukes ofte når du beriker en faktatabell (for eksempel en tabell med salgsdata) med noen referansedata (for eksempel kostnaden for et produkt).

Hvilket språk skal jeg velge for å jobbe med data - R eller Python? Både! Migrerer fra pandaer til tidyverse og data.table og tilbake

Det finnes flere typer sammenføyninger:

Hvilket språk skal jeg velge for å jobbe med data - R eller Python? Både! Migrerer fra pandaer til tidyverse og data.table og tilbake

I den tidligere lastede tabellen titanic vi har en kolonne Kjønn, som tilsvarer passasjerens kjønnskode:

1 - kvinne
2 - hann

Dessuten har vi laget en tabell - en oppslagsbok kjønn. For en mer praktisk presentasjon av data om kjønn på passasjerer, må vi legge til navnet på kjønnet fra katalogen kjønn til bordet titanic.

Horisontalt bord sammenføyning i R: tidyverse, dplyr

В dplyr Det er en hel familie av funksjoner for horisontal sammenføyning:

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

Det mest brukte i min praksis er left_join().

Som de to første argumentene tar funksjonene som er oppført ovenfor to tabeller for å slå seg sammen, og som det tredje argumentet by du må spesifisere kolonnene for å bli med.

Horisontal tabell sammenføyning i R: dplyr

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

Horisontal sammenføyning av tabeller i R: data.tabell

В data.table Du må slå sammen tabeller med nøkkel ved å bruke funksjonen merge().

Argumenter for å merge() fungerer i data.table

  • x, y — Tabeller for sammenføyning
  • av — Kolonne som er nøkkelen til å bli med hvis den har samme navn i begge tabellene
  • by.x, by.y — Kolonnenavn som skal slås sammen, hvis de har forskjellige navn i tabellene
  • all, all.x, all.y — Sammenføyningstype, alle vil returnere alle rader fra begge tabellene, all.x tilsvarer LEFT JOIN-operasjonen (vil forlate alle radene i den første tabellen), all.y — tilsvarer RIGHT JOIN-operasjon (vil forlate alle radene i den andre tabellen).

Horisontal sammenføyning av tabeller i R: data.tabell

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

Horisontalt bord bli med i Python: pandaer

Samt i data.tableI pandas funksjonen brukes til å slå sammen tabeller merge().

Argumenter for funksjonen merge() i pandaer

  • hvordan — Tilkoblingstype: venstre, høyre, ytre, indre
  • på — Kolonne som er en nøkkel hvis den har samme navn i begge tabellene
  • left_on, right_on — Navn på nøkkelkolonner, hvis de har forskjellige navn i tabeller

Horisontalt bord bli med i Python: pandaer

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

Grunnleggende vindusfunksjoner og beregnede kolonner

Vindusfunksjoner ligner i betydningen aggregeringsfunksjoner, og brukes også ofte i dataanalyse. Men i motsetning til aggregeringsfunksjoner, endrer ikke vindusfunksjoner antall rader i den utgående datarammen.

Hvilket språk skal jeg velge for å jobbe med data - R eller Python? Både! Migrerer fra pandaer til tidyverse og data.table og tilbake

Ved å bruke vindusfunksjonen deler vi i hovedsak den innkommende datarammen i deler i henhold til et eller annet kriterium, dvs. ved verdien av et felt, eller flere felt. Og vi utfører aritmetiske operasjoner på hvert vindu. Resultatet av disse operasjonene vil bli returnert i hver linje, dvs. uten å endre det totale antallet rader i tabellen.

La oss for eksempel ta bordet titanic. Vi kan beregne hvor stor prosentandel kostnaden for hver billett var innenfor sin hytteklasse.

For å gjøre dette må vi på hver linje få den totale kostnaden for en billett for den gjeldende hytteklassen som billetten på denne linjen tilhører, og deretter dele kostnaden for hver billett med den totale kostnaden for alle billetter i samme hytteklasse .

Vindusfunksjoner i R: tidyverse, dplyr

For å legge til nye kolonner, uten å bruke radgruppering, i dplyr tjener funksjon mutate().

Du kan løse problemet beskrevet ovenfor ved å gruppere data etter felt Pclass og summere feltet i en ny kolonne Billettpris. Deretter fjerner du grupperingen av tabellen og deler feltverdiene Billettpris til det som skjedde i forrige trinn.

Vindufunksjoner i R: dplyr

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

Vindufunksjoner i R: data.table

Løsningsalgoritmen forblir den samme som i dplyr, må vi dele tabellen i vinduer etter felt Pclass. Skriv ut beløpet for gruppen som tilsvarer hver rad i en ny kolonne, og legg til en kolonne der vi beregner andelen av kostnadene for hver billett i gruppen.

For å legge til nye kolonner data.table operatør til stede :=. Nedenfor er et eksempel på å løse et problem ved å bruke pakken data.table

Vindufunksjoner i R: data.table

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

Vindufunksjoner i Python: pandaer

En måte å legge til en ny kolonne på pandas - bruk funksjonen assign(). For å oppsummere billettkostnaden etter hytteklasse, uten gruppering av rader, vil vi bruke funksjonen transform().

Nedenfor er et eksempel på en løsning der vi legger til i tabellen titanic de samme 2 kolonnene.

Vindufunksjoner i Python: pandaer

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

Korrespondansetabell for funksjoner og metoder

Nedenfor er en samsvarstabell mellom metoder for å utføre ulike operasjoner med data i pakkene vi har vurdert.

beskrivelse
ryddig
data bord
pandaer

Laster inn data
vroom()/ readr::read_csv() / readr::read_tsv()
fread()
read_csv()

Opprette datarammer
tibble()
data.table()
dict() + from_dict()

Velge kolonner
select()
argument j, andre posisjon i hakeparenteser
vi passerer listen over nødvendige kolonner i hakeparenteser / drop() / filter() / select_dtypes()

Filtrering av rader
filter()
argument i, første plassering i hakeparenteser
Vi viser filtreringsbetingelsene i hakeparenteser / filter()

Gruppering og aggregering
group_by() + summarise()
argumenter j + by
groupby() + agg()

Vertikal forening av tabeller (UNION)
bind_rows()
rbind()
concat()

Horisontal sammenføyning av tabeller (JOIN)
left_join() / *_join()
merge()
merge()

Grunnleggende vindusfunksjoner og å legge til beregnede kolonner
group_by() + mutate()
argument j ved å bruke operatøren := + argument by
transform() + assign()

Konklusjon

Kanskje i artikkelen beskrev jeg ikke de mest optimale implementeringene av databehandling, så jeg vil være glad hvis du retter opp feilene mine i kommentarene, eller bare supplerer informasjonen gitt i artikkelen med andre teknikker for å jobbe med data i R / Python.

Som jeg skrev ovenfor, var ikke hensikten med artikkelen å pålegge ens mening om hvilket språk som er best, men å forenkle muligheten til å lære begge språkene, eller om nødvendig migrere mellom dem.

Hvis du likte artikkelen, vil jeg gjerne ha nye abonnenter på min youtube и telegram kanaler.

Опрос

Hvilken av følgende pakker bruker du i arbeidet ditt?

I kommentarfeltet kan du skrive begrunnelsen for valget ditt.

Kun registrerte brukere kan delta i undersøkelsen. Logg inn, vær så snill.

Hvilken databehandlingspakke bruker du (du kan velge flere alternativer)

  • 45,2%ryddig 19

  • 33,3%data.tabell14

  • 54,8%pandaer 23

42 brukere stemte. 9 brukere avsto.

Kilde: www.habr.com

Legg til en kommentar