Welke taal kiezen om met data te werken - R of Python? Beide! Migreren van panda's naar riddverse en data.table en terug

Door op internet naar R of Python te zoeken, vind je miljoenen artikelen en kilometers aan discussies over het onderwerp welke beter, sneller en handiger is om met data te werken. Maar helaas zijn al deze artikelen en geschillen niet bijzonder nuttig.

Welke taal kiezen om met data te werken - R of Python? Beide! Migreren van panda's naar riddverse en data.table en terug

Het doel van dit artikel is om de basistechnieken voor gegevensverwerking in de populairste pakketten van beide talen te vergelijken. En help lezers snel iets onder de knie te krijgen dat ze nog niet weten. Voor degenen die in Python schrijven: ontdek hoe je hetzelfde in R kunt doen, en omgekeerd.

Tijdens het artikel zullen we de syntaxis van de meest populaire pakketten in R analyseren. Dit zijn de pakketten die in de bibliotheek zijn opgenomen tidyverseen ook het pakket data.table. En vergelijk hun syntaxis met pandas, het populairste data-analysepakket in Python.

We zullen stap voor stap het hele pad van data-analyse doorlopen, van het laden ervan tot het uitvoeren van analytische vensterfuncties met behulp van Python en R.

Inhoud

Dit artikel kan worden gebruikt als spiekbriefje als u bent vergeten hoe u een gegevensverwerkingsbewerking moet uitvoeren in een van de pakketten in kwestie.

Welke taal kiezen om met data te werken - R of Python? Beide! Migreren van panda's naar riddverse en data.table en terug

  1. Belangrijkste syntaxisverschillen tussen R en Python
    1.1. Toegang tot pakketfuncties
    1.2. Opdracht
    1.3. Indexering
    1.4. Methoden en OOP
    1.5. Pijpleidingen
    1.6. Data structuren
  2. Een paar woorden over de pakketten die we zullen gebruiken
    2.1. opruimen
    2.2. data tafel
    2.3. panda's
  3. Pakketten installeren
  4. Data laden
  5. Dataframes maken
  6. De kolommen selecteren die u nodig hebt
  7. Rijen filteren
  8. Groeperen en aggregeren
  9. Verticale unie van tabellen (UNION)
  10. Horizontaal samenvoegen van tabellen (JIN)
  11. Basisvensterfuncties en berekende kolommen
  12. Correspondentietabel tussen gegevensverwerkingsmethoden in R en Python
  13. Conclusie
  14. Een korte enquête over welk pakket u gebruikt

Als u geïnteresseerd bent in data-analyse, kunt u mijn telegram и youtube kanalen. Het grootste deel van de inhoud is gewijd aan de R-taal.

Belangrijkste syntaxisverschillen tussen R en Python

Om het makkelijker voor je te maken om over te stappen van Python naar R, of andersom, geef ik een aantal hoofdpunten waar je op moet letten.

Toegang tot pakketfuncties

Zodra een pakket in R is geladen, hoeft u de pakketnaam niet op te geven om toegang te krijgen tot de functies ervan. In de meeste gevallen is dit niet gebruikelijk bij R, maar het is acceptabel. U hoeft helemaal geen pakket te importeren als u een van de functies ervan in uw code nodig heeft, maar roep het eenvoudigweg aan door de naam van het pakket en de naam van de functie op te geven. Het scheidingsteken tussen pakket- en functienamen in R is een dubbele dubbele punt. package_name::function_name().

In Python daarentegen wordt het als klassiek beschouwd om de functies van een pakket aan te roepen door expliciet de naam ervan op te geven. Wanneer een pakket wordt gedownload, krijgt het meestal een verkorte naam, bijvoorbeeld: pandas Meestal wordt een pseudoniem gebruikt pd. Een pakketfunctie is toegankelijk via een punt package_name.function_name().

Opdracht

In R is het gebruikelijk om een ​​pijl te gebruiken om een ​​waarde aan een object toe te kennen. obj_name <- valueHoewel een enkel gelijkteken is toegestaan, wordt het enkele gelijkteken in R voornamelijk gebruikt om waarden door te geven aan functieargumenten.

In Python wordt de toewijzing uitsluitend gedaan met een enkel gelijkteken obj_name = value.

Indexering

Ook hier zijn er behoorlijk grote verschillen. In R begint de indexering bij één en omvat alle gespecificeerde elementen in het resulterende bereik,

In Python begint het indexeren vanaf nul en omvat het geselecteerde bereik niet het laatste element dat in de index is opgegeven. Ontwerpen dus x[i:j] in Python bevat het j-element niet.

Er zijn ook verschillen in negatieve indexering, in R-notatie x[-1] retourneert alle elementen van de vector behalve de laatste. In Python retourneert een vergelijkbare notatie alleen het laatste element.

Methoden en OOP

R implementeert OOP op zijn eigen manier, hierover schreef ik in het artikel "OOP in de R-taal (deel 1): S3-klassen". Over het algemeen is R een functionele taal en alles daarin is gebaseerd op functies. Ga daarom voor Excel-gebruikers bijvoorbeeld naar tydiverse het zal gemakkelijker zijn dan pandas. Hoewel dit misschien mijn subjectieve mening is.

Kortom, objecten in R hebben geen methoden (als we het hebben over S3-klassen, maar er zijn andere OOP-implementaties die veel minder vaak voorkomen). Er zijn alleen algemene functies die ze anders verwerken, afhankelijk van de klasse van het object.

Pijpleidingen

Misschien is dit de naam voor pandas Het zal niet helemaal correct zijn, maar ik zal proberen de betekenis uit te leggen.

Om tussentijdse berekeningen niet op te slaan en geen onnodige objecten in de werkomgeving te produceren, kunt u een soort pijplijn gebruiken. Die. geef het resultaat van een berekening door van de ene functie naar de volgende en bewaar tussenresultaten niet.

Laten we het volgende codevoorbeeld nemen, waarbij we tussentijdse berekeningen in afzonderlijke objecten opslaan:

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

We hebben drie bewerkingen achter elkaar uitgevoerd en het resultaat van elke bewerking is in een afzonderlijk object opgeslagen. Maar in feite hebben we deze tussenobjecten niet nodig.

Of nog erger, maar bekender voor Excel-gebruikers.

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

In dit geval hebben we de tussentijdse berekeningsresultaten niet opgeslagen, maar het lezen van code met geneste functies is uiterst lastig.

We zullen verschillende benaderingen van gegevensverwerking in R bekijken, en deze voeren vergelijkbare bewerkingen op verschillende manieren uit.

Pijpleidingen in de bibliotheek tidyverse uitgevoerd door de exploitant %>%.

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

We nemen dus het resultaat van het werk func1() en geef het door als het eerste argument func2(), dan geven we het resultaat van deze berekening door als het eerste argument func3(). En uiteindelijk schrijven we alle uitgevoerde berekeningen in het object obj <-.

Al het bovenstaande wordt beter geïllustreerd dan woorden door deze meme:
Welke taal kiezen om met data te werken - R of Python? Beide! Migreren van panda's naar riddverse en data.table en terug

В data.table kettingen worden op een vergelijkbare manier gebruikt.

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

In elk van de vierkante haken kunt u het resultaat van de vorige bewerking gebruiken.

В pandas dergelijke bewerkingen worden gescheiden door een punt.

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

Die. wij nemen onze tafel df en gebruik haar methode fun1(), dan passen we de methode toe op het verkregen resultaat fun2()na fun3(). Het resulterende resultaat wordt opgeslagen in een object obj .

Data structuren

Datastructuren in R en Python zijn vergelijkbaar, maar hebben verschillende namen.

beschrijving
Naam in R
Naam in Python/panda's

Tabelstructuur
data.frame, data.table, tibble
dataframe

Eendimensionale lijst met waarden
Vector
Serie in panda's of lijst in pure Python

Niet-tabelvormige structuur op meerdere niveaus
Lijst
Woordenboek (dictaat)

We zullen hieronder enkele andere kenmerken en verschillen in syntaxis bekijken.

Een paar woorden over de pakketten die we zullen gebruiken

Eerst vertel ik je iets over de pakketten waarmee je in dit artikel vertrouwd zult raken.

opruimen

Официальный сайт: netjesverse.org
Welke taal kiezen om met data te werken - R of Python? Beide! Migreren van panda's naar riddverse en data.table en terug
bibliotheek tidyverse geschreven door Hedley Wickham, Senior Research Scientist bij RStudio. tidyverse bestaat uit een indrukwekkende reeks pakketten die de gegevensverwerking vereenvoudigen, waarvan er 5 zijn opgenomen in de top 10 downloads uit de CRAN-repository.

De kern van de bibliotheek bestaat uit de volgende pakketten: ggplot2, dplyr, tidyr, readr, purrr, tibble, stringr, forcats. Elk van deze pakketten is gericht op het oplossen van een specifiek probleem. Bijvoorbeeld dplyr gemaakt voor gegevensmanipulatie, tidyr om de gegevens in een nette vorm te brengen, stringr vereenvoudigt het werken met snaren, en ggplot2 is een van de meest populaire tools voor datavisualisatie.

Het voordeel tidyverse is de eenvoud en gemakkelijk leesbare syntaxis, die in veel opzichten vergelijkbaar is met de SQL-querytaal.

data tafel

Welke taal kiezen om met data te werken - R of Python? Beide! Migreren van panda's naar riddverse en data.table en terugОфициальный сайт: r-datatable.com

Door de auteur data.table is Matt Dole van H2O.ai.

De eerste release van de bibliotheek vond plaats in 2006.

De syntaxis van het pakket is niet zo handig als in tidyverse en doet meer denken aan klassieke dataframes in R, maar is tegelijkertijd aanzienlijk uitgebreid in functionaliteit.

Alle manipulaties met de tabel in dit pakket worden tussen vierkante haakjes beschreven en als u de syntaxis vertaalt data.table in SQL krijg je zoiets als dit: data.table[ WHERE, SELECT, GROUP BY ]

De kracht van dit pakket is de snelheid waarmee grote hoeveelheden data worden verwerkt.

panda's

Официальный сайт: pandas.pydata.org Welke taal kiezen om met data te werken - R of Python? Beide! Migreren van panda's naar riddverse en data.table en terug

De naam van de bibliotheek komt van de econometrische term ‘paneldata’, die wordt gebruikt om multidimensionaal gestructureerde informatiesets te beschrijven.

Door de auteur pandas is de Amerikaan Wes McKinney.

Als het gaat om data-analyse in Python, gelijk pandas Nee. Een zeer multifunctioneel pakket op hoog niveau waarmee u elke manipulatie met gegevens kunt uitvoeren, van het laden van gegevens uit welke bron dan ook tot het visualiseren ervan.

Extra pakketten installeren

De pakketten die in dit artikel worden besproken, zijn niet opgenomen in de basisdistributies van R en Python. Hoewel er een kleine waarschuwing is: als je de Anaconda-distributie hebt geïnstalleerd, installeer deze dan extra pandas niet verplicht.

Pakketten installeren in R

Als u de RStudio-ontwikkelomgeving minstens één keer hebt geopend, weet u waarschijnlijk al hoe u het vereiste pakket in R moet installeren. Om pakketten te installeren, gebruikt u de standaardopdracht install.packages() door het rechtstreeks in R zelf uit te voeren.

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

Na de installatie moeten de pakketten worden verbonden, waarvoor in de meeste gevallen het commando wordt gebruikt library().

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

Pakketten installeren in Python

Dus als je pure Python hebt geïnstalleerd, dan pandas je moet het handmatig installeren. Open een opdrachtregel of terminal, afhankelijk van uw besturingssysteem, en voer de volgende opdracht in.

pip install pandas

Vervolgens keren we terug naar Python en importeren we het geïnstalleerde pakket met de opdracht import.

import pandas as pd

Data laden

Datamining is een van de belangrijkste stappen in data-analyse. Zowel Python als R bieden u desgewenst uitgebreide mogelijkheden om gegevens uit welke bron dan ook te verkrijgen: lokale bestanden, bestanden van internet, websites, allerlei databases.

Welke taal kiezen om met data te werken - R of Python? Beide! Migreren van panda's naar riddverse en data.table en terug

In het hele artikel zullen we verschillende datasets gebruiken:

  1. Twee downloads van Google Analytics.
  2. Titanic-passagiersgegevensset.

Alle gegevens staan ​​op mijn GitHub in de vorm van csv- en tsv-bestanden. Waar gaan we ze opvragen?

Gegevens laden in R: netjesverse, vroom, reader

Om gegevens in een bibliotheek te laden tidyverse Er zijn twee pakketten: vroom, readr. vroom moderner, maar in de toekomst kunnen de pakketten gecombineerd worden.

Citaat van officiële documentatie vroom.

vroem versus lezer
Wat betekent de release van vroom betekenen voor readr? Voorlopig zijn we van plan de twee pakketten afzonderlijk te laten evolueren, maar waarschijnlijk zullen we de pakketten in de toekomst verenigen. Een nadeel van het luie lezen van Vroom is dat bepaalde dataproblemen niet van tevoren kunnen worden gemeld, dus hoe je ze het beste kunt verenigen, vereist wat nadenken.

vroem versus lezer
Wat betekent vrijgave? vroom voor readr? Op dit moment zijn we van plan om beide pakketten afzonderlijk te ontwikkelen, maar in de toekomst zullen we ze waarschijnlijk combineren. Een van de nadelen van lui lezen vroom is dat sommige problemen met de gegevens niet vooraf kunnen worden gemeld, dus je moet nadenken over hoe je ze het beste kunt combineren.

In dit artikel zullen we beide pakketten voor het laden van gegevens bekijken:

Gegevens laden in R:vroom-pakket

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

Gegevens laden in R: reader

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

In het pakket vroom, ongeacht het csv / tsv-gegevensformaat, wordt het laden uitgevoerd door de gelijknamige functie vroom(), in het pakket readr Voor elk formaat gebruiken we een andere functie read_tsv() и read_csv().

Gegevens laden in R: data.table

В data.table er is een functie voor het laden van gegevens fread().

Gegevens laden in R: data.table-pakket

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

Gegevens laden in Python: panda's

Als we vergelijken met R-pakketten, komt de syntaxis in dit geval het dichtst in de buurt pandas zullen readr, omdat pandas kan overal gegevens opvragen en er zit een hele reeks functies in dit pakket read_*().

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

En vele andere functies die zijn ontworpen om gegevens uit verschillende formaten te lezen. Maar voor onze doeleinden is het voldoende read_table() of read_csv() argumentatie gebruiken september om het kolomscheidingsteken op te geven.

Gegevens laden in Python: panda's

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

Dataframes maken

Tafel titanisch, die we hebben geladen, is er een veld Sekse, waarin de geslachtsidentificatie van de passagier wordt opgeslagen.

Maar voor een handiger weergave van de gegevens per geslacht van de passagier moet u de naam gebruiken in plaats van de geslachtscode.

Om dit te doen, zullen we een kleine map maken, een tabel waarin er respectievelijk slechts 2 kolommen (code en geslachtsnaam) en 2 rijen zullen zijn.

Een dataframe maken in R: netjesverse, dplyr

In het onderstaande codevoorbeeld maken we het gewenste dataframe met behulp van de functie tibble() .

Een dataframe maken in R: dplyr

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

Een dataframe maken in R: data.table

Een dataframe maken in R: data.table

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

Een dataframe maken in Python: panda's

В pandas Het maken van frames wordt in verschillende fasen uitgevoerd: eerst maken we een woordenboek en vervolgens zetten we het woordenboek om in een dataframe.

Een dataframe maken in Python: panda's

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

Kolommen selecteren

De tabellen waarmee u werkt, kunnen tientallen of zelfs honderden kolommen met gegevens bevatten. Maar om analyses uit te voeren, heeft u in de regel niet alle kolommen nodig die beschikbaar zijn in de brontabel.

Welke taal kiezen om met data te werken - R of Python? Beide! Migreren van panda's naar riddverse en data.table en terug

Daarom is een van de eerste bewerkingen die u met de brontabel uitvoert, het verwijderen van onnodige informatie en het vrijmaken van het geheugen dat deze informatie in beslag neemt.

Kolommen selecteren in R: netjesverse, dplyr

syntaxis dplyr lijkt erg op de SQL-querytaal, als je er bekend mee bent zul je dit pakket snel onder de knie krijgen.

Gebruik de functie om kolommen te selecteren select().

Hieronder staan ​​voorbeelden van code waarmee u op de volgende manieren kolommen kunt selecteren:

  • Lijst met de namen van de vereiste kolommen
  • Verwijs naar kolomnamen met behulp van reguliere expressies
  • Op gegevenstype of een andere eigenschap van de gegevens in de kolom

Kolommen selecteren in 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)

Kolommen selecteren in R: data.table

Dezelfde operaties in data.table worden iets anders uitgevoerd, aan het begin van het artikel heb ik een beschrijving gegeven van welke argumenten er tussen vierkante haken staan data.table.

DT[i,j,by]

Waar:
ik - waar, d.w.z. filteren op rijen
j - selecteer|bijwerken|doen, d.w.z. kolommen selecteren en converteren
door - gegevensgroepering

Kolommen selecteren in 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 geeft u toegang tot alle kolommen, en .SDcols filter de vereiste kolommen met behulp van reguliere expressies of andere functies om de namen van de kolommen die u nodig hebt te filteren.

Kolommen selecteren in Python, panda's

Om kolommen op naam te selecteren in pandas het is voldoende om een ​​lijst met hun namen te geven. En om kolommen op naam te selecteren of uit te sluiten met reguliere expressies, moet u de functies gebruiken drop() и filter(), en argumentatie as = 1, waarmee je aangeeft dat het nodig is om kolommen te verwerken in plaats van rijen.

Gebruik de functie om een ​​veld op gegevenstype te selecteren select_dtypes()en in argumenten omvatten of uitsluiten geef een lijst met gegevenstypen door die overeenkomen met de velden die u moet selecteren.

Kolommen selecteren in Python: panda's

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

Rijen filteren

De brontabel kan bijvoorbeeld meerdere jaren aan gegevens bevatten, maar u hoeft alleen de afgelopen maand te analyseren. Ook hier zullen extra regels het gegevensverwerkingsproces vertragen en het pc-geheugen verstoppen.

Welke taal kiezen om met data te werken - R of Python? Beide! Migreren van panda's naar riddverse en data.table en terug

Rijen filteren in R: tydyverse, dplyr

В dplyr de functie wordt gebruikt om rijen te filteren filter(). Er is een dataframe als eerste argument nodig, waarna u de filtervoorwaarden vermeldt.

Wanneer u logische expressies schrijft om een ​​tabel te filteren, geeft u in dit geval de kolomnamen op zonder aanhalingstekens en zonder de tabelnaam te declareren.

Wanneer u meerdere logische expressies gebruikt om te filteren, gebruikt u de volgende operators:

  • & of komma - logische AND
  • | - logische OF

Rijen filteren in R: dplyr

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

Rijen filteren in R: data.table

Zoals ik hierboven al schreef, in data.table De syntaxis van gegevensconversie staat tussen vierkante haakjes.

DT[i,j,by]

Waar:
ik - waar, d.w.z. filteren op rijen
j - selecteer|bijwerken|doen, d.w.z. kolommen selecteren en converteren
door - gegevensgroepering

Het argument wordt gebruikt om rijen te filteren i, waarbij de eerste positie tussen vierkante haken staat.

Kolommen zijn toegankelijk in logische expressies zonder aanhalingstekens en zonder de tabelnaam op te geven.

Logische uitdrukkingen zijn op dezelfde manier aan elkaar gerelateerd als in dplyr via de operatoren & en |.

Rijen filteren in R: data.table

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

Tekenreeksen filteren in Python: panda's

Filter op rijen in pandas vergelijkbaar met filteren data.table, en staat tussen vierkante haakjes.

In dit geval wordt toegang tot kolommen noodzakelijkerwijs uitgevoerd door de naam van het dataframe aan te geven; vervolgens kan de kolomnaam ook tussen aanhalingstekens tussen vierkante haken worden aangegeven (voorbeeld df['col_name']), of zonder aanhalingstekens na de punt (voorbeeld df.col_name).

Als u een dataframe op verschillende voorwaarden moet filteren, moet elke voorwaarde tussen haakjes worden geplaatst. Logische condities worden door operators met elkaar verbonden & и |.

Tekenreeksen filteren in Python: panda's

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

Groeperen en aggregeren van gegevens

Een van de meest gebruikte bewerkingen bij gegevensanalyse is groeperen en aggregeren.

Welke taal kiezen om met data te werken - R of Python? Beide! Migreren van panda's naar riddverse en data.table en terug

De syntaxis voor het uitvoeren van deze bewerkingen is verspreid over alle pakketten die we beoordelen.

In dit geval nemen we een dataframe als voorbeeld titanischen bereken het aantal en de gemiddelde kosten van tickets, afhankelijk van de reisklasse.

Groeperen en aggregeren van gegevens in R: netjesverse, dplyr

В dplyr de functie wordt gebruikt voor groeperen group_by()en voor aggregatie summarise(). In werkelijkheid, dplyr er is een hele familie van functies summarise_*(), maar het doel van dit artikel is om de basissyntaxis te vergelijken, dus we zullen niet in zo'n oerwoud duiken.

Basisaggregatiefuncties:

  • sum() – sommatie
  • min() / max() – minimum- en maximumwaarde
  • mean() - gemiddeld
  • median() – midden
  • length() - hoeveelheid

Groeperen en aggregeren in R: dplyr

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

In functie group_by() we passeerden de tafel als eerste argument titanischen gaf vervolgens het veld aan Pklasse, waarmee we onze tafel zullen groeperen. Het resultaat van deze bewerking met behulp van de operator %>% doorgegeven als het eerste argument voor de functie summarise(), en nog 2 velden toegevoegd: passagiers и gemiddelde_prijs. In de eerste plaats gebruik je de functie length() berekende het aantal tickets, en in de tweede met behulp van de functie mean() ontving de gemiddelde ticketprijs.

Groeperen en aggregeren van gegevens in R: data.table

В data.table het argument wordt gebruikt voor aggregatie j die een tweede positie tussen vierkante haakjes heeft, en voor groepering by of keyby, die de derde positie hebben.

De lijst met aggregatiefuncties is in dit geval identiek aan die beschreven in dplyr, omdat dit zijn functies uit de basis-R-syntaxis.

Groeperen en aggregeren in R: data.table

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

Groeperen en aggregeren van gegevens in Python: panda's

Groeperen pandas gelijkwaardig aan dplyr, maar de aggregatie is niet vergelijkbaar met dplyr helemaal niet data.table.

Gebruik de methode om te groeperen groupby(), waarin u een lijst met kolommen moet doorgeven waarop het dataframe zal worden gegroepeerd.

Voor aggregatie kunt u de methode gebruiken agg()die een woordenboek accepteert. De woordenboeksleutels zijn de kolommen waarop u de aggregatiefuncties gaat toepassen, en de waarden zijn de namen van de aggregatiefuncties.

Aggregatiefuncties:

  • sum() – sommatie
  • min() / max() – minimum- en maximumwaarde
  • mean() - gemiddeld
  • median() – midden
  • count() - hoeveelheid

Functie reset_index() in het onderstaande voorbeeld wordt het gebruikt om geneste indexen te resetten pandas standaard ingesteld op na gegevensaggregatie.

symbool Hiermee kunt u naar de volgende regel gaan.

Groeperen en aggregeren in Python: panda's

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

Verticale verbinding van tabellen

Een bewerking waarbij u twee of meer tabellen met dezelfde structuur samenvoegt. De gegevens die we hebben geladen, bevatten tabellen ga_nov и ga_dec. Deze tabellen zijn identiek qua structuur, d.w.z. dezelfde kolommen hebben, en de gegevenstypen in deze kolommen.

Welke taal kiezen om met data te werken - R of Python? Beide! Migreren van panda's naar riddverse en data.table en terug

Dit is een upload van Google Analytics voor de maand november en december, in deze sectie combineren we deze gegevens in één tabel.

Verticaal samenvoegen van tabellen in R: netjesverse, dplyr

В dplyr Met de functie kunt u 2 tabellen tot één combineren bind_rows(), waarbij tabellen als argumenten worden doorgegeven.

Rijen filteren in R: dplyr

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

Verticaal samenvoegen van tabellen in R: data.table

Het is ook niets ingewikkelds, laten we gebruiken rbind().

Rijen filteren in R: data.table

## data.table
rbind(ga_nov, ga_dec)

Verticaal samenvoegen van tabellen in Python: panda's

В pandas de functie wordt gebruikt om tabellen samen te voegen concat(), waarin u een lijst met frames moet doorgeven om ze te combineren.

Tekenreeksen filteren in Python: panda's

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

Horizontale verbinding van tabellen

Een bewerking waarbij kolommen uit de tweede tabel met een sleutel aan de eerste tabel worden toegevoegd. Het wordt vaak gebruikt bij het verrijken van een feitentabel (bijvoorbeeld een tabel met verkoopgegevens) met enkele referentiegegevens (bijvoorbeeld de kosten van een product).

Welke taal kiezen om met data te werken - R of Python? Beide! Migreren van panda's naar riddverse en data.table en terug

Er zijn verschillende soorten joins:

Welke taal kiezen om met data te werken - R of Python? Beide! Migreren van panda's naar riddverse en data.table en terug

In de eerder geladen tabel titanisch we hebben een kolom Sekse, wat overeenkomt met de geslachtscode van de passagier:

1 - vrouwtje
2 - mannelijk

We hebben ook een tabel gemaakt - een naslagwerk geslacht. Voor een gemakkelijkere presentatie van gegevens over het geslacht van passagiers moeten we de naam van het geslacht uit de directory toevoegen geslacht Naar de tafel titanisch.

Horizontale tafelverbinding in R: netjesverse, dplyr

В dplyr Er bestaat een hele reeks functies voor horizontale verbindingen:

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

De meest gebruikte in mijn praktijk is left_join().

Als eerste twee argumenten hebben de hierboven genoemde functies twee tabellen nodig om samen te voegen, en als derde argument by u moet de kolommen opgeven waaraan u wilt deelnemen.

Horizontale tafelverbinding in R: dplyr

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

Horizontale samenvoeging van tabellen in R: data.table

В data.table U moet tabellen samenvoegen met behulp van de functie merge().

Argumenten voor de functie merge() in data.table

  • x, y — Tabellen voor deelname
  • by — Kolom die de sleutel is om deel te nemen als deze in beide tabellen dezelfde naam heeft
  • by.x, by.y — Kolomnamen die moeten worden samengevoegd, als ze verschillende namen in de tabellen hebben
  • all, all.x, all.y — Join-type, all retourneert alle rijen uit beide tabellen, all.x komt overeen met de LEFT JOIN-bewerking (laat alle rijen van de eerste tabel staan), all.y — komt overeen met de RIGHT JOIN-bewerking (laat alle rijen van de tweede tabel staan).

Horizontale samenvoeging van tabellen in R: data.table

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

Horizontale tafel join in Python: panda's

Evenals binnen data.tableIn pandas de functie wordt gebruikt om tabellen samen te voegen merge().

Argumenten van de functie merge() in panda's

  • hoe — Type verbinding: links, rechts, buiten, binnen
  • on — Kolom die een sleutel is als deze in beide tabellen dezelfde naam heeft
  • left_on, right_on — Namen van sleutelkolommen, als deze verschillende namen hebben in tabellen

Horizontale tafel join in Python: panda's

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

Basisvensterfuncties en berekende kolommen

Vensterfuncties hebben dezelfde betekenis als aggregatiefuncties en worden ook vaak gebruikt bij gegevensanalyse. Maar in tegenstelling tot aggregatiefuncties veranderen vensterfuncties het aantal rijen van het uitgaande dataframe niet.

Welke taal kiezen om met data te werken - R of Python? Beide! Migreren van panda's naar riddverse en data.table en terug

In wezen splitsen we met behulp van de vensterfunctie het binnenkomende dataframe in delen volgens een bepaald criterium, d.w.z. op basis van de waarde van een veld of meerdere velden. En we voeren rekenkundige bewerkingen uit op elk venster. Het resultaat van deze bewerkingen wordt op elke regel geretourneerd, d.w.z. zonder het totale aantal rijen in de tabel te wijzigen.

Laten we bijvoorbeeld de tafel nemen titanisch. We kunnen berekenen welk percentage de kosten van elk ticket binnen de betreffende reisklasse waren.

Om dit te doen, moeten we in elke regel de totale kosten van een ticket voor de huidige reisklasse waartoe het ticket in deze regel behoort, verzamelen en vervolgens de kosten van elk ticket delen door de totale kosten van alle tickets van dezelfde reisklasse. .

Vensterfuncties in R: netjesverse, dplyr

Om nieuwe kolommen toe te voegen, zonder gebruik te maken van rijgroepering, in dplyr dient functie mutate().

U kunt het hierboven beschreven probleem oplossen door gegevens per veld te groeperen Pklasse en het veld optellen in een nieuwe kolom Hebben. Degroepeer vervolgens de tabel en verdeel de veldwaarden Hebben met wat er in de vorige stap is gebeurd.

Vensterfuncties in R: dplyr

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

Vensterfuncties in R: data.table

Het oplossingsalgoritme blijft hetzelfde als in dplyr, moeten we de tabel per veld in vensters splitsen Pklasse. Voer in een nieuwe kolom het bedrag uit voor de groep die overeenkomt met elke rij, en voeg een kolom toe waarin we het aandeel van de kosten van elk ticket in zijn groep berekenen.

Om nieuwe kolommen toe te voegen data.table exploitant aanwezig :=. Hieronder ziet u een voorbeeld van het oplossen van een probleem met behulp van het pakket data.table

Vensterfuncties in R: data.table

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

Vensterfuncties in Python: panda's

Eén manier om een ​​nieuwe kolom toe te voegen pandas - gebruik de functie assign(). Om de kosten van tickets per reisklasse samen te vatten, zonder rijen te groeperen, zullen we de functie gebruiken transform().

Hieronder ziet u een voorbeeld van een oplossing die we aan de tabel toevoegen titanisch dezelfde 2 kolommen.

Vensterfuncties in Python: panda's

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

Functies en methoden correspondentietabel

Hieronder vindt u een tabel met overeenkomsten tussen methoden voor het uitvoeren van verschillende bewerkingen met gegevens in de pakketten die we hebben overwogen.

beschrijving
opruimen
data tafel
panda's

Data laden
vroom()/ readr::read_csv() / readr::read_tsv()
fread()
read_csv()

Dataframes maken
tibble()
data.table()
dict() + from_dict()

Kolommen selecteren
select()
argument j, tweede positie tussen vierkante haken
we geven de lijst met vereiste kolommen door tussen vierkante haken / drop() / filter() / select_dtypes()

Rijen filteren
filter()
argument i, eerste positie tussen vierkante haken
We vermelden de filtervoorwaarden tussen vierkante haken / filter()

Groeperen en aggregeren
group_by() + summarise()
argumenten j + by
groupby() + agg()

Verticale unie van tabellen (UNION)
bind_rows()
rbind()
concat()

Horizontaal samenvoegen van tabellen (JIN)
left_join() / *_join()
merge()
merge()

Basisvensterfuncties en berekende kolommen toevoegen
group_by() + mutate()
argument j met behulp van de operator := + betoog by
transform() + assign()

Conclusie

Misschien heb ik in het artikel niet de meest optimale implementaties van gegevensverwerking beschreven, dus ik zal blij zijn als je mijn fouten in de opmerkingen corrigeert, of eenvoudigweg de informatie in het artikel aanvult met andere technieken voor het werken met gegevens in R / Python.

Zoals ik hierboven schreef, was het doel van het artikel niet om iemands mening op te dringen over welke taal beter is, maar om de mogelijkheid te vereenvoudigen om beide talen te leren, of, indien nodig, om tussen beide te migreren.

Als je het artikel leuk vond, zal ik blij zijn dat ik nieuwe abonnees op mijn heb youtube и telegram kanalen.

Interview

Welke van de volgende pakketten gebruikt u in uw werk?

In de opmerkingen kunt u de reden van uw keuze schrijven.

Alleen geregistreerde gebruikers kunnen deelnemen aan het onderzoek. Inloggen, Alsjeblieft.

Welk gegevensverwerkingspakket gebruikt u (u kunt meerdere opties selecteren)

  • 45,2%netjesvers19

  • 33,3%data.tabel14

  • 54,8%panda's23

42 gebruikers hebben gestemd. 9 gebruikers onthielden zich van stemming.

Bron: www.habr.com

Voeg een reactie