Hvilket sprog skal man vælge til at arbejde med data - R eller Python? Begge! Migrerer fra pandaer til tidyverse og data.table og tilbage

Ved at søge efter R eller Python på internettet, vil du finde millioner af artikler og kilometervis af diskussioner om emnet, hvilken der er bedre, hurtigere og mere bekvem til at arbejde med data. Men desværre er alle disse artikler og tvister ikke særlig nyttige.

Hvilket sprog skal man vælge til at arbejde med data - R eller Python? Begge! Migrerer fra pandaer til tidyverse og data.table og tilbage

Formålet med denne artikel er at sammenligne de grundlæggende databehandlingsteknikker i de mest populære pakker på begge sprog. Og hjælp læserne med hurtigt at mestre noget, de ikke ved endnu. For dem, der skriver i Python, så find ud af, hvordan man gør det samme i R, og omvendt.

I løbet af artiklen vil vi analysere syntaksen for de mest populære pakker i R. Det er de pakker, der er inkluderet i biblioteket tidyverseog også pakken data.table. Og sammenligne deres syntaks med pandas, den mest populære dataanalysepakke i Python.

Vi vil gå trin for trin gennem hele stien til dataanalyse fra indlæsning til udførelse af analytiske vinduesfunktioner ved hjælp af Python og R.

Indhold

Denne artikel kan bruges som et snydeark, hvis du har glemt, hvordan du udfører nogle databehandlingsoperationer i en af ​​de pakker, der overvejes.

Hvilket sprog skal man vælge til at arbejde med data - R eller Python? Begge! Migrerer fra pandaer til tidyverse og data.table og tilbage

  1. Vigtigste syntaksforskelle mellem R og Python
    1.1. Adgang til pakkefunktioner
    1.2. Opgave
    1.3. Indeksering
    1.4. Metoder og OOP
    1.5. Rørledninger
    1.6. Datastrukturer
  2. Et par ord om de pakker, vi vil bruge
    2.1. ryddelige
    2.2. data.tabel
    2.3. pandaer
  3. Installation af pakker
  4. Indlæser data
  5. Oprettelse af datarammer
  6. Valg af de kolonner, du har brug for
  7. Filtrering af rækker
  8. Gruppering og aggregering
  9. Vertikal forening af tabeller (UNION)
  10. Vandret sammenføjning af tabeller (JOIN)
  11. Grundlæggende vinduesfunktioner og beregnede kolonner
  12. Korrespondancetabel mellem databehandlingsmetoder i R og Python
  13. Konklusion
  14. En kort undersøgelse om, hvilken pakke du bruger

Hvis du er interesseret i dataanalyse, kan du finde min telegram и youtube kanaler. Det meste af indholdet er afsat til R-sproget.

Vigtigste syntaksforskelle mellem R og Python

For at gøre det nemmere for dig at skifte fra Python til R, eller omvendt, vil jeg give et par hovedpunkter, som du skal være opmærksom på.

Adgang til pakkefunktioner

Når en pakke er indlæst i R, behøver du ikke angive pakkenavnet for at få adgang til dens funktioner. I de fleste tilfælde er dette ikke almindeligt i R, men det er acceptabelt. Du behøver slet ikke at importere en pakke, hvis du har brug for en af ​​dens funktioner i din kode, men kald den blot ved at angive navnet på pakken og navnet på funktionen. Adskillelsen mellem pakke- og funktionsnavne i R er et dobbelt kolon. package_name::function_name().

I Python betragtes det tværtimod som klassisk at kalde funktionerne i en pakke ved eksplicit at angive dens navn. Når en pakke downloades, får den som regel et forkortet navn, f.eks. pandas normalt bruges et pseudonym pd. En pakkefunktion tilgås via en prik package_name.function_name().

Opgave

I R er det almindeligt at bruge en pil til at tildele en værdi til et objekt. obj_name <- value, selvom et enkelt lighedstegn er tilladt, bruges det enkelte lighedstegn i R primært til at videregive værdier til funktionsargumenter.

I Python udføres opgaven udelukkende med et enkelt lighedstegn obj_name = value.

Indeksering

Der er også ret markante forskelle her. I R starter indeksering ved én og inkluderer alle specificerede elementer i det resulterende område,

I Python starter indeksering fra nul, og det valgte område inkluderer ikke det sidste element, der er angivet i indekset. Så design x[i:j] i Python vil ikke inkludere j-elementet.

Der er også forskelle i negativ indeksering, i R-notation x[-1] vil returnere alle elementer i vektoren undtagen den sidste. I Python vil en lignende notation kun returnere det sidste element.

Metoder og OOP

R implementerer OOP på sin egen måde, det skrev jeg om i artiklen "OOP på R-sproget (del 1): S3-klasser". Generelt er R et funktionelt sprog, og alt i det er bygget på funktioner. Gå derfor for eksempel for Excel-brugere til tydiverse det bliver nemmere end pandas. Selvom det måske er min subjektive mening.

Kort sagt, objekter i R har ikke metoder (hvis vi taler om S3-klasser, men der er andre OOP-implementeringer, der er meget mindre almindelige). Der er kun generaliserede funktioner, der behandler dem forskelligt afhængigt af objektets klasse.

Rørledninger

Måske er dette navnet på pandas Det vil ikke være helt korrekt, men jeg vil prøve at forklare betydningen.

For ikke at spare mellemregninger og ikke producere unødvendige genstande i arbejdsmiljøet, kan du bruge en slags pipeline. De der. videregive resultatet af en beregning fra en funktion til den næste, og gem ikke mellemresultater.

Lad os tage følgende kodeeksempel, hvor vi gemmer mellemliggende beregninger i separate objekter:

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

Vi udførte 3 operationer sekventielt, og resultatet af hver blev gemt i et separat objekt. Men faktisk har vi ikke brug for disse mellemobjekter.

Eller endnu værre, men mere velkendt for Excel-brugere.

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

I dette tilfælde gemte vi ikke mellemliggende beregningsresultater, men at læse kode med indlejrede funktioner er ekstremt ubelejligt.

Vi vil se på flere tilgange til databehandling i R, og de udfører lignende operationer på forskellige måder.

Rørledninger i biblioteket tidyverse implementeret af operatøren %>%.

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

Således tager vi resultatet af arbejdet func1() og videregive det som det første argument til func2(), så videregiver vi resultatet af denne beregning som det første argument func3(). Og i sidste ende skriver vi alle de udførte beregninger ind i objektet obj <-.

Alt ovenstående illustreres bedre end ord af denne meme:
Hvilket sprog skal man vælge til at arbejde med data - R eller Python? Begge! Migrerer fra pandaer til tidyverse og data.table og tilbage

В data.table kæder bruges på lignende måde.

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

I hver af de firkantede parenteser kan du bruge resultatet af den forrige operation.

В pandas sådanne operationer er adskilt af en prik.

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

De der. vi tager vores bord df og bruge hendes metode fun1(), så anvender vi metoden til det opnåede resultat fun2()efter fun3(). Det resulterende resultat gemmes i et objekt obj .

Datastrukturer

Datastrukturer i R og Python ligner hinanden, men har forskellige navne.

beskrivelse
Navn i R
Navn i Python/pandaer

Bordstruktur
data.ramme, data.tabel, tibble
DataFrame

Endimensionel liste over værdier
vektor
Serier i pandaer eller liste i ren Python

Ikke-tabelstruktur på flere niveauer
Liste
Ordbog (dict)

Vi vil se på nogle andre funktioner og forskelle i syntaks nedenfor.

Et par ord om de pakker, vi vil bruge

Først vil jeg fortælle dig lidt om de pakker, som du vil blive fortrolig med i løbet af denne artikel.

ryddelige

Официальный сайт: tidyverse.org
Hvilket sprog skal man vælge til at arbejde med data - R eller Python? Begge! Migrerer fra pandaer til tidyverse og data.table og tilbage
bibliotek tidyverse skrevet af Hedley Wickham, seniorforsker ved RStudio. tidyverse består af et imponerende sæt pakker, der forenkler databehandlingen, hvoraf 5 er inkluderet i top 10 downloads fra CRAN repository.

Kernen i biblioteket består af følgende pakker: ggplot2, dplyr, tidyr, readr, purrr, tibble, stringr, forcats. Hver af disse pakker er rettet mod at løse et specifikt problem. For eksempel dplyr skabt til datamanipulation, tidyr at bringe dataene til en pæn form, stringr forenkler arbejdet med strenge, og ggplot2 er et af de mest populære datavisualiseringsværktøjer.

Fordelen tidyverse er enkelheden og letlæselig syntaks, som på mange måder ligner SQL-forespørgselssproget.

data.tabel

Hvilket sprog skal man vælge til at arbejde med data - R eller Python? Begge! Migrerer fra pandaer til tidyverse og data.table og tilbageОфициальный сайт: r-datatable.com

Forfatter data.table er Matt Dole fra H2O.ai.

Den første udgivelse af biblioteket fandt sted i 2006.

Pakkesyntaksen er ikke så praktisk som i tidyverse og minder mere om klassiske dataframes i R, men samtidig markant udvidet i funktionalitet.

Alle manipulationer med tabellen i denne pakke er beskrevet i firkantede parenteser, og hvis du oversætter syntaksen data.table i SQL får du noget som dette: data.table[ WHERE, SELECT, GROUP BY ]

Styrken ved denne pakke er hastigheden til at behandle store mængder data.

pandaer

Официальный сайт: pandas.pydata.org Hvilket sprog skal man vælge til at arbejde med data - R eller Python? Begge! Migrerer fra pandaer til tidyverse og data.table og tilbage

Navnet på biblioteket kommer fra det økonometriske udtryk "paneldata", der bruges til at beskrive flerdimensionelle strukturerede informationssæt.

Forfatter pandas er amerikanske Wes McKinney.

Når det kommer til dataanalyse i Python, lig pandas Ingen. En meget multifunktionel pakke på højt niveau, der giver dig mulighed for at udføre enhver manipulation med data, lige fra at indlæse data fra alle kilder til at visualisere dem.

Installation af yderligere pakker

Pakkerne diskuteret i denne artikel er ikke inkluderet i de grundlæggende R- og Python-distributioner. Selvom der er en lille advarsel, hvis du installerede Anaconda-distributionen, skal du installere yderligere pandas ikke påkrævet.

Installation af pakker i R

Hvis du har åbnet RStudio-udviklingsmiljøet mindst én gang, ved du sikkert allerede, hvordan du installerer den påkrævede pakke i R. For at installere pakker skal du bruge standardkommandoen install.packages() ved at køre det direkte i R selv.

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

Efter installationen skal pakkerne tilsluttes, hvilket i de fleste tilfælde kommandoen bruges til library().

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

Installation af pakker i Python

Så hvis du har ren Python installeret, så pandas du skal installere det manuelt. Åbn en kommandolinje eller terminal, afhængigt af dit operativsystem, og indtast følgende kommando.

pip install pandas

Så vender vi tilbage til Python og importerer den installerede pakke med kommandoen import.

import pandas as pd

Indlæser data

Data mining er et af de vigtigste trin i dataanalyse. Både Python og R, hvis det ønskes, giver dig omfattende muligheder for at få data fra alle kilder: lokale filer, filer fra internettet, websteder, alle slags databaser.

Hvilket sprog skal man vælge til at arbejde med data - R eller Python? Begge! Migrerer fra pandaer til tidyverse og data.table og tilbage

Igennem artiklen vil vi bruge flere datasæt:

  1. To downloads fra Google Analytics.
  2. Titanic passagerdatasæt.

Alle data er på min GitHub i form af csv- og tsv-filer. Hvor vil vi anmode om dem fra?

Indlæser data i R: tidyverse, vroom, readr

At indlæse data i et bibliotek tidyverse Der er to pakker: vroom, readr. vroom mere moderne, men i fremtiden kan pakkerne måske kombineres.

Citat fra officiel dokumentation vroom.

vroom vs læser
Hvad betyder udgivelsen af vroom betyder for readr? For nu planlægger vi at lade de to pakker udvikle sig hver for sig, men vi vil sandsynligvis forene pakkerne i fremtiden. En ulempe ved vrooms dovne læsning er, at visse dataproblemer ikke kan rapporteres på forhånd, så hvordan man bedst forener dem, kræver nogle overvejelser.

vroom vs readr
Hvad betyder frigivelse? vroom for readr? I øjeblikket planlægger vi at udvikle begge pakker separat, men vi vil sandsynligvis kombinere dem i fremtiden. En af ulemperne ved doven læsning vroom er, at nogle problemer med dataene ikke kan indberettes på forhånd, så du skal tænke over, hvordan du bedst kombinerer dem.

I denne artikel vil vi se på begge dataindlæsningspakker:

Indlæser data 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")

Indlæser data 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, uanset csv / tsv-dataformatet, udføres indlæsning af funktionen af ​​samme navn vroom(), i pakken readr vi bruger en anden funktion for hvert format read_tsv() и read_csv().

Indlæser data i R: data.table

В data.table der er en funktion til at indlæse data fread().

Indlæser data 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")

Indlæser data i Python: pandaer

Hvis vi sammenligner med R-pakker, så er syntaksen i dette tilfælde tættest på pandas vil readr, fordi pandas kan anmode om data fra hvor som helst, og der er en hel familie af funktioner i denne pakke read_*().

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

Og mange andre funktioner designet til at læse data fra forskellige formater. Men til vores formål er det nok read_table() eller read_csv() ved hjælp af argumenter september for at angive kolonneseparatoren.

Indlæser 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")

Oprettelse af datarammer

Bord Titanic, som vi læste, er der en mark Køn, som gemmer passagerens kønsidentifikator.

Men for en mere bekvem præsentation af data med hensyn til passagerkøn, bør du bruge navnet frem for kønskoden.

For at gøre dette vil vi oprette en lille mappe, en tabel, hvor der kun vil være 2 kolonner (kode og kønsnavn) og 2 rækker.

Oprettelse af en dataramme i R: tidyverse, dplyr

I kodeeksemplet nedenfor opretter vi den ønskede dataramme ved hjælp af funktionen tibble() .

Oprettelse af en dataramme i R: dplyr

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

Oprettelse af en dataramme i R: data.table

Oprettelse af en dataramme i R: data.table

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

Oprettelse af en dataramme i Python: pandas

В pandas Oprettelse af rammer udføres i flere trin, først opretter vi en ordbog, og derefter konverterer vi ordbogen til en dataramme.

Oprettelse af en dataramme i Python: pandas

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

Valg af kolonner

Tabellerne, du arbejder med, kan indeholde snesevis eller endda hundredvis af kolonner med data. Men for at udføre analyse behøver du som regel ikke alle de kolonner, der er tilgængelige i kildetabellen.

Hvilket sprog skal man vælge til at arbejde med data - R eller Python? Begge! Migrerer fra pandaer til tidyverse og data.table og tilbage

Derfor er en af ​​de første handlinger, du vil udføre med kildetabellen, at rydde den for unødvendig information og frigøre den hukommelse, som denne information optager.

Valg af kolonner i R: tidyverse, dplyr

syntaks dplyr er meget lig SQL-forespørgselssproget, hvis du er fortrolig med det, vil du hurtigt mestre denne pakke.

Brug funktionen til at vælge kolonner select().

Nedenfor er eksempler på kode, som du kan vælge kolonner med på følgende måder:

  • Liste over navnene på de påkrævede kolonner
  • Henvis til kolonnenavne ved hjælp af regulære udtryk
  • Efter datatype eller enhver anden egenskab for dataene i kolonnen

Valg af 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)

Valg af kolonner i R: data.table

De samme operationer i data.table udføres lidt anderledes, i begyndelsen af ​​artiklen gav jeg en beskrivelse af, hvilke argumenter der er inden for firkantede parenteser data.table.

DT[i,j,by]

Hvor:
i - hvor, dvs. filtrering efter rækker
j - vælg|opdater|do, dvs. at vælge kolonner og konvertere dem
efter - datagruppering

Valg af 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 giver dig adgang til alle kolonner, og .SDcols filtrer de nødvendige kolonner ved hjælp af regulære udtryk eller andre funktioner til at filtrere navnene på de kolonner, du har brug for.

Valg af kolonner i Python, pandaer

For at vælge kolonner efter navn i pandas det er nok at give en liste over deres navne. Og for at vælge eller udelukke kolonner efter navn ved hjælp af regulære udtryk, skal du bruge funktionerne drop() и filter(), og argumentation akse=1, hvormed du angiver, at det er nødvendigt at behandle kolonner frem for rækker.

Brug funktionen for at vælge et felt efter datatype select_dtypes()og ind i argumenter omfatter eller udelukke videregive en liste over datatyper svarende til hvilke felter du skal vælge.

Valg af 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 af rækker

Kildetabellen kan for eksempel indeholde flere års data, men du behøver kun at analysere den seneste måned. Igen vil ekstra linjer sinke databehandlingsprocessen og tilstoppe pc'ens hukommelse.

Hvilket sprog skal man vælge til at arbejde med data - R eller Python? Begge! Migrerer fra pandaer til tidyverse og data.table og tilbage

Filtrering af rækker i R: tydyverse, dplyr

В dplyr funktionen bruges til at filtrere rækker filter(). Det tager en dataramme som det første argument, så viser du filtreringsbetingelserne.

Når du skriver logiske udtryk for at filtrere en tabel, skal du i dette tilfælde angive kolonnenavnene uden anførselstegn og uden at angive tabelnavnet.

Når du bruger flere logiske udtryk til at filtrere, skal du bruge følgende operatorer:

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

Filtrering af rækker i R: dplyr

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

Filtrering af rækker i R: data.table

Som jeg allerede skrev ovenfor, i data.table datakonverteringssyntaks er omgivet af firkantede parenteser.

DT[i,j,by]

Hvor:
i - hvor, dvs. filtrering efter rækker
j - vælg|opdater|do, dvs. at vælge kolonner og konvertere dem
efter - datagruppering

Argumentet bruges til at filtrere rækker i, som har den første position i firkantede parenteser.

Der tilgås kolonner i logiske udtryk uden anførselstegn og uden at angive tabelnavnet.

Logiske udtryk er relateret til hinanden på samme måde som i dplyr gennem & og | operatørerne.

Filtrering af rækker i R: data.table

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

Filtrering af strenge i Python: pandaer

Filtrer efter rækker i pandas svarende til at filtrere ind data.table, og er udført i firkantede parenteser.

I dette tilfælde udføres adgang til kolonner nødvendigvis ved at angive navnet på datarammen; så kan kolonnenavnet også angives i anførselstegn i firkantede parenteser (eksempel df['col_name']), eller uden citater efter perioden (eksempel df.col_name).

Hvis du skal filtrere en dataramme efter flere betingelser, skal hver betingelse placeres i parentes. Logiske forhold er forbundet med hinanden af ​​operatører & и |.

Filtrering af strenge 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 af data

En af de mest almindeligt anvendte operationer i dataanalyse er gruppering og aggregering.

Hvilket sprog skal man vælge til at arbejde med data - R eller Python? Begge! Migrerer fra pandaer til tidyverse og data.table og tilbage

Syntaksen til at udføre disse operationer er spredt ud over alle de pakker, vi gennemgår.

I dette tilfælde vil vi tage en dataramme som eksempel Titanic, og beregn antallet og den gennemsnitlige pris for billetter afhængigt af kabineklassen.

Gruppering og aggregering af data i R: tidyverse, dplyr

В dplyr funktionen bruges til gruppering group_by()og til aggregering summarise(). Faktisk, dplyr der er en hel familie af funktioner summarise_*(), men formålet med denne artikel er at sammenligne den grundlæggende syntaks, så vi vil ikke gå ind i en sådan jungle.

Grundlæggende aggregeringsfunktioner:

  • sum() — summering
  • min() / max() – minimum og maksimum værdi
  • mean() - gennemsnitlig
  • median() - median
  • length() - antal

Gruppering og aggregering i R: dplyr

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

I funktion group_by() vi bestod bordet som det første argument Titanic, og derefter angivet feltet Pklasse, som vi vil gruppere vores tabel efter. Resultatet af denne operation ved hjælp af operatøren %>% sendt som det første argument til funktionen summarise()og tilføjede 2 felter mere: passagerer и gennemsnitspris. I den første bruger funktionen length() beregnet antallet af billetter, og i den anden ved hjælp af funktionen mean() modtaget den gennemsnitlige billetpris.

Gruppering og aggregering af data i R: data.table

В data.table argumentet bruges til aggregering j som har en anden position i firkantede parenteser og til gruppering by eller keyby, som har den tredje position.

Listen over aggregeringsfunktioner i dette tilfælde er identisk med den, der er beskrevet i dplyr, fordi disse er funktioner fra den grundlæggende R-syntaks.

Gruppering og aggregering i R: data.tabel

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

Gruppering og aggregering af data i Python: pandaer

Gruppering ind pandas svarende til dplyr, men sammenlægningen ligner ikke dplyr slet ikke data.table.

Brug metoden for at gruppere groupby(), hvor du skal sende en liste over kolonner, som datarammen vil blive grupperet efter.

Til aggregering kan du bruge metoden agg()som accepterer en ordbog. Ordbogsnøglerne er de kolonner, som du vil anvende aggregeringsfunktionerne på, og værdierne er navnene på aggregeringsfunktionerne.

Aggregationsfunktioner:

  • sum() — summering
  • min() / max() – minimum og maksimum værdi
  • mean() - gennemsnitlig
  • median() - median
  • count() - antal

Funktion reset_index() i eksemplet nedenfor bruges det til at nulstille indlejrede indekser pandas standard til efter dataaggregering.

Symbol giver dig mulighed for at gå til næste linje.

Gruppering og aggregering i Python: pandaer

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

Lodret sammenføjning af borde

En operation, hvor du forbinder to eller flere tabeller med samme struktur. De data, vi indlæste, indeholder tabeller ga_nov и ga_dec. Disse tabeller er identiske i opbygningen, dvs. har de samme kolonner, og datatyperne i disse kolonner.

Hvilket sprog skal man vælge til at arbejde med data - R eller Python? Begge! Migrerer fra pandaer til tidyverse og data.table og tilbage

Dette er en upload fra Google Analytics for november og december måned, i dette afsnit vil vi kombinere disse data i én tabel.

Lodret sammenføjning af tabeller i R: tidyverse, dplyr

В dplyr Du kan kombinere 2 borde til én ved hjælp af funktionen bind_rows(), passerer tabeller som sine argumenter.

Filtrering af rækker i R: dplyr

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

Lodret sammenføjning af tabeller i R: data.table

Det er heller ikke noget kompliceret, lad os bruge rbind().

Filtrering af rækker i R: data.table

## data.table
rbind(ga_nov, ga_dec)

Lodret sammenføjning af tabeller i Python: pandaer

В pandas funktionen bruges til at forbinde tabeller concat(), hvor du skal sende en liste over rammer for at kombinere dem.

Filtrering af strenge i Python: pandaer

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

Vandret sammenføjning af borde

En operation, hvor kolonner fra den anden føjes til den første tabel med nøgle. Det bruges ofte, når en faktatabel (for eksempel en tabel med salgsdata) beriges med nogle referencedata (for eksempel prisen på et produkt).

Hvilket sprog skal man vælge til at arbejde med data - R eller Python? Begge! Migrerer fra pandaer til tidyverse og data.table og tilbage

Der er flere typer sammenføjninger:

Hvilket sprog skal man vælge til at arbejde med data - R eller Python? Begge! Migrerer fra pandaer til tidyverse og data.table og tilbage

I den tidligere indlæste tabel Titanic vi har en kolonne Køn, som svarer til passagerens kønskode:

1 - kvinde
2 - mand

Vi har også lavet en tabel - en opslagsbog køn. For en mere bekvem præsentation af data om passagerernes køn skal vi tilføje navnet på kønnet fra kataloget køn til bordet Titanic.

Vandret bordsammenføjning i R: tidyverse, dplyr

В dplyr Der er en hel familie af funktioner til horisontal sammenføjning:

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

Den mest brugte i min praksis er left_join().

Som de første to argumenter kræver funktionerne, der er anført ovenfor, to tabeller for at forbinde, og som det tredje argument by du skal angive de kolonner, du vil deltage i.

Vandret bord sammenføjning i R: dplyr

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

Horisontal sammenføjning af tabeller i R: data.table

В data.table Du skal slutte dig til tabeller ved at bruge funktionen merge().

Argumenter til merge() funktion i data.table

  • x, y — Tabeller til sammenføjning
  • af — Kolonne, der er nøglen til at slutte sig til, hvis den har samme navn i begge tabeller
  • by.x, by.y — Kolonnenavne, der skal flettes, hvis de har forskellige navne i tabellerne
  • all, all.x, all.y — Join type, all returnerer alle rækker fra begge tabeller, all.x svarer til LEFT JOIN operationen (forlader alle rækkerne i den første tabel), all.y — svarer til RIGHT JOIN-operation (forlader alle rækkerne i den anden tabel).

Horisontal sammenføjning af tabeller i R: data.table

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

Vandret bord-tilslutning i Python: pandaer

Samt i data.tableI pandas funktionen bruges til at forbinde tabeller merge().

Argumenter for merge()-funktionen i pandaer

  • hvordan — Tilslutningstype: venstre, højre, ydre, indre
  • on — Kolonne, der er en nøgle, hvis den har samme navn i begge tabeller
  • left_on, right_on — Navne på nøglekolonner, hvis de har forskellige navne i tabeller

Vandret bord-tilslutning i Python: pandaer

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

Grundlæggende vinduesfunktioner og beregnede kolonner

Vinduesfunktioner ligner i betydningen aggregeringsfunktioner og bruges også ofte i dataanalyse. Men i modsætning til aggregeringsfunktioner ændrer vinduesfunktioner ikke antallet af rækker i den udgående dataramme.

Hvilket sprog skal man vælge til at arbejde med data - R eller Python? Begge! Migrerer fra pandaer til tidyverse og data.table og tilbage

I det væsentlige, ved at bruge vinduesfunktionen, opdeler vi den indgående dataramme i dele efter et eller andet kriterium, dvs. ved værdien af ​​et felt eller flere felter. Og vi udfører aritmetiske operationer på hvert vindue. Resultatet af disse operationer vil blive returneret i hver linje, dvs. uden at ændre det samlede antal rækker i tabellen.

Lad os for eksempel tage bordet Titanic. Vi kan beregne, hvor stor en procentdel prisen på hver billet var inden for dens kabineklasse.

For at gøre dette skal vi på hver linje få de samlede omkostninger for en billet til den aktuelle kabineklasse, som billetten på denne linje tilhører, og derefter dividere prisen på hver billet med den samlede pris for alle billetter i samme kabineklasse .

Vinduesfunktioner i R: tidyverse, dplyr

For at tilføje nye kolonner uden at bruge rækkegruppering, i dplyr tjener funktion mutate().

Du kan løse problemet beskrevet ovenfor ved at gruppere data efter felt Pklasse og summere feltet i en ny kolonne Billetpris. Derefter skal du opdele tabellen og dele feltværdierne Billetpris til hvad der skete i det foregående trin.

Vinduesfunktioner i R: dplyr

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

Vinduesfunktioner i R: data.table

Løsningsalgoritmen forbliver den samme som i dplyr, skal vi opdele tabellen i vinduer efter felt Pklasse. Udskriv i en ny kolonne beløbet for gruppen svarende til hver række, og tilføj en kolonne, hvor vi beregner andelen af ​​prisen på hver billet i dens gruppe.

For at tilføje nye kolonner til data.table operatør til stede :=. Nedenfor er et eksempel på løsning af et problem ved hjælp af pakken data.table

Vinduesfunktioner i R: data.table

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

Vinduesfunktioner i Python: pandaer

En måde at tilføje en ny kolonne til pandas - brug funktionen assign(). For at opsummere prisen på billetter efter kabineklasse, uden gruppering af rækker, vil vi bruge funktionen transform().

Nedenfor er et eksempel på en løsning, hvor vi tilføjer til tabellen Titanic de samme 2 kolonner.

Vinduesfunktioner i Python: pandaer

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

Overensstemmelsestabel for funktioner og metoder

Nedenfor er en tabel over korrespondance mellem metoder til at udføre forskellige operationer med data i de pakker, vi har overvejet.

beskrivelse
ryddelige
data.tabel
pandaer

Indlæser data
vroom()/ readr::read_csv() / readr::read_tsv()
fread()
read_csv()

Oprettelse af datarammer
tibble()
data.table()
dict() + from_dict()

Valg af kolonner
select()
argument j, anden position i firkantede parenteser
vi passerer listen over nødvendige kolonner i firkantede parenteser / drop() / filter() / select_dtypes()

Filtrering af rækker
filter()
argument i, første position i firkantede parenteser
Vi angiver filtreringsbetingelserne i firkantede parenteser / filter()

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

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

Vandret sammenføjning af tabeller (JOIN)
left_join() / *_join()
merge()
merge()

Grundlæggende vinduesfunktioner og tilføjelse af beregnede kolonner
group_by() + mutate()
argument j ved hjælp af operatøren := + argument by
transform() + assign()

Konklusion

Måske beskrev jeg i artiklen ikke de mest optimale implementeringer af databehandling, så jeg vil være glad, hvis du retter mine fejl i kommentarerne, eller blot supplerer oplysningerne i artiklen med andre teknikker til at arbejde med data i R / Python.

Som jeg skrev ovenfor, var formålet med artiklen ikke at påtvinge ens mening om, hvilket sprog der er bedst, men at forenkle muligheden for at lære begge sprog, eller om nødvendigt at migrere mellem dem.

Hvis du kunne lide artiklen, vil jeg være glad for at have nye abonnenter på min youtube и telegram kanaler.

Опрос

Hvilken af ​​følgende pakker bruger du i dit arbejde?

I kommentarerne kan du skrive årsagen til dit valg.

Kun registrerede brugere kan deltage i undersøgelsen. Log ind, Vær venlig.

Hvilken databehandlingspakke bruger du (du kan vælge flere muligheder)

  • 45,2 %ryddelig 19

  • 33,3 %data.tabel14

  • 54,8 %pandaer 23

42 brugere stemte. 9 brugere undlod at stemme.

Kilde: www.habr.com

Tilføj en kommentar