Kiun lingvon elekti por labori kun datumoj - R aŭ Python? Ambaŭ! Migrado de pandoj al tidyverse kaj data.table kaj reen

Serĉante R aŭ Python en Interreto, vi trovos milionojn da artikoloj kaj kilometrojn da diskutoj pri la temo, pri kiu oni estas pli bona, pli rapida kaj pli oportuna por labori kun datumoj. Sed bedaŭrinde ĉiuj ĉi tiuj artikoloj kaj disputoj ne estas precipe utilaj.

Kiun lingvon elekti por labori kun datumoj - R aŭ Python? Ambaŭ! Migrado de pandoj al tidyverse kaj data.table kaj reen

La celo de ĉi tiu artikolo estas kompari la bazajn datumtraktadteknikojn en la plej popularaj pakoj de ambaŭ lingvoj. Kaj helpu legantojn rapide regi ion, kion ili ankoraŭ ne scias. Por tiuj, kiuj skribas en Python, eksciu kiel fari la samon en R, kaj inverse.

Dum la artikolo ni analizos la sintakson de la plej popularaj pakaĵoj en R. Ĉi tiuj estas la pakaĵoj inkluzivitaj en la biblioteko tidyversekaj ankaŭ la pakaĵon data.table. Kaj komparu ilian sintakson kun pandas, la plej populara datuma analizpakaĵo en Python.

Ni iros paŝon post paŝo tra la tuta vojo de analizo de datumoj de ŝarĝo de ĝi ĝis plenumado de analizaj fenestraj funkcioj uzante Python kaj R.

Enhavo

Ĉi tiu artikolo povas esti uzata kiel trompfolio se vi forgesis kiel fari iun datumtraktadoperacion en unu el la pakaĵoj konsiderataj.

Kiun lingvon elekti por labori kun datumoj - R aŭ Python? Ambaŭ! Migrado de pandoj al tidyverse kaj data.table kaj reen

  1. Ĉefaj sintaksaj diferencoj inter R kaj Python
    1.1. Aliro al Pakaj Funkcioj
    1.2. Tasko
    1.3. Indeksado
    1.4. Metodoj kaj OOP
    1.5. Duktoj
    1.6. Datumaj Strukturoj
  2. Kelkajn vortojn pri la pakoj, kiujn ni uzos
    2.1. tidyverse
    2.2. datumo.tablo
    2.3. pandoj
  3. Instalante pakaĵojn
  4. Ŝarĝante Datumojn
  5. Kreante datumkadrojn
  6. Elektante la Kolumnojn, kiujn Vi Bezonas
  7. Filtrado de vicoj
  8. Grupiĝo kaj Agregado
  9. Vertikala kuniĝo de tabloj (UNION)
  10. Horizontala kunigo de tabloj (JOIN)
  11. Bazaj fenestrofunkcioj kaj kalkulitaj kolumnoj
  12. Koresponda tablo inter metodoj de prilaborado de datumoj en R kaj Python
  13. konkludo
  14. Mallonga enketo pri kiu pakaĵo vi uzas

Se vi interesiĝas pri datuma analizo, vi eble trovos mian telegramo и youtube kanaloj. La plej granda parto de kies enhavo estas dediĉita al la R-lingvo.

Ĉefaj sintaksaj diferencoj inter R kaj Python

Por faciligi al vi ŝanĝi de Python al R, aŭ inverse, mi donos kelkajn ĉefajn punktojn, kiujn vi devas atenti.

Aliro al Pakaj Funkcioj

Post kiam pakaĵo estas ŝarĝita en R, vi ne bezonas specifi la paknomon por aliri ĝiajn funkciojn. Plejofte tio ne estas ofta en R, sed ĝi estas akceptebla. Vi tute ne devas importi pakaĵon se vi bezonas unu el ĝiaj funkcioj en via kodo, sed simple voku ĝin specifante la nomon de la pako kaj la nomon de la funkcio. La apartigilo inter pakaj kaj funkcionomoj en R estas duobla dupunkto. package_name::function_name().

En Python, male, oni konsideras klasika voki la funkciojn de pakaĵo eksplicite specifante ĝian nomon. Kiam pako estas elŝutita, ĝi kutime ricevas mallongigitan nomon, ekz. pandas kutime oni uzas pseŭdonimon pd. Paka funkcio estas alirebla per punkto package_name.function_name().

Tasko

En R, estas ofte uzi sagon por atribui valoron al objekto. obj_name <- value, kvankam ununura egalsigno estas permesita, la ununura egalsigno en R estas uzata ĉefe por pasi valorojn al funkciaj argumentoj.

En Python, tasko estas farita ekskluzive kun ununura egalsigno obj_name = value.

Indeksado

Estas ankaŭ sufiĉe gravaj diferencoj ĉi tie. En R, indeksado komenciĝas je unu kaj inkluzivas ĉiujn specifitajn elementojn en la rezulta intervalo,

en Python, indeksado komenciĝas de nulo kaj la elektita gamo ne inkluzivas la lastan elementon specifitan en la indeksado. Do dezajno x[i:j] en Python ne inkluzivos la j-elementon.

Ekzistas ankaŭ diferencoj en negativa indeksado, en R-notacio x[-1] redonos ĉiujn elementojn de la vektoro krom la lasta. En Python, simila notacio resendos nur la lastan elementon.

Metodoj kaj OOP

R efektivigas OOP laŭ sia maniero, mi skribis pri tio en la artikolo "OOP en la R-lingvo (parto 1): S3-klasoj". Ĝenerale, R estas funkcia lingvo, kaj ĉio en ĝi estas konstruita sur funkcioj. Tial, ekzemple, por uzantoj de Excel, iru al tydiverse estos pli facile ol pandas. Kvankam ĉi tio povas esti mia subjektiva opinio.

Resume, objektoj en R ne havas metodojn (se ni parolas pri S3-klasoj, sed ekzistas aliaj OOP-efektivigoj, kiuj estas multe malpli oftaj). Ekzistas nur ĝeneraligitaj funkcioj kiuj prilaboras ilin alimaniere depende de la klaso de la objekto.

Duktoj

Eble ĉi tiu estas la nomo por pandas Ĝi ne estos tute ĝusta, sed mi provos klarigi la signifon.

Por ne ŝpari mezajn kalkulojn kaj ne produkti nenecesajn objektojn en la labormedio, vi povas uzi specon de dukto. Tiuj. pasigu la rezulton de kalkulo de unu funkcio al la sekva, kaj ne konservu mezajn rezultojn.

Ni prenu la sekvan kodan ekzemplon, kie ni stokas mezajn kalkulojn en apartaj objektoj:

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

Ni faris 3 operaciojn sinsekve, kaj la rezulto de ĉiu estis konservita en aparta objekto. Sed fakte, ni ne bezonas ĉi tiujn mezajn objektojn.

Aŭ eĉ pli malbona, sed pli konata al uzantoj de Excel.

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

En ĉi tiu kazo, ni ne konservis mezajn kalkulrezultojn, sed legi kodon kun nestitaj funkcioj estas ege maloportuna.

Ni rigardos plurajn alirojn al datumtraktado en R, kaj ili faras similajn operaciojn en malsamaj manieroj.

Duktoj en la biblioteko tidyverse efektivigita de la funkciigisto %>%.

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

Tiel ni prenas la rezulton de la laboro func1() kaj pasigu ĝin kiel la unuan argumenton al func2(), tiam ni pasas la rezulton de ĉi tiu kalkulo kiel la unua argumento func3(). Kaj finfine, ni skribas ĉiujn kalkulojn faritajn en la objekton obj <-.

Ĉio ĉi-supra estas ilustrita pli bone ol vortoj per ĉi tiu memo:
Kiun lingvon elekti por labori kun datumoj - R aŭ Python? Ambaŭ! Migrado de pandoj al tidyverse kaj data.table kaj reen

В data.table ĉenoj estas uzataj simile.

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

En ĉiu el la kvadrataj krampoj vi povas uzi la rezulton de la antaŭa operacio.

В pandas tiaj operacioj estas apartigitaj per punkto.

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

Tiuj. ni prenas nian tablon df kaj uzu ŝian metodon fun1(), tiam ni aplikas la metodon al la akirita rezulto fun2(), post fun3(). La rezulta rezulto estas konservita en objekton objekto .

Datumaj Strukturoj

Datenstrukturoj en R kaj Python estas similaj, sed havas malsamajn nomojn.

Priskribo
Titolo en R
Nomo en Python/pandoj

Tablostrukturo
data.frame, data.table, tibble
DataFrame

Unudimensia listo de valoroj
Vektoro
Serio en pandoj aŭ listo en pura Python

Plurnivela ne-tabula strukturo
Listo
Vortaro (dikto)

Ni rigardos kelkajn aliajn trajtojn kaj diferencojn en sintakso sube.

Kelkajn vortojn pri la pakoj, kiujn ni uzos

Unue, mi rakontos al vi iomete pri la pakaĵoj, kun kiuj vi konatiĝos dum ĉi tiu artikolo.

tidyverse

Oficiala retejo: tidyverse.org
Kiun lingvon elekti por labori kun datumoj - R aŭ Python? Ambaŭ! Migrado de pandoj al tidyverse kaj data.table kaj reen
biblioteko tidyverse verkita de Hedley Wickham, Ĉefesploristo ĉe RStudio. tidyverse konsistas el impona aro da pakaĵoj, kiuj simpligas datumtraktadon, 5 el kiuj estas inkluzivitaj en la plej bonaj 10 elŝutoj de la CRAN-deponejo.

La kerno de la biblioteko konsistas el la sekvaj pakaĵoj: ggplot2, dplyr, tidyr, readr, purrr, tibble, stringr, forcats. Ĉiu el ĉi tiuj pakoj celas solvi specifan problemon. Ekzemple dplyr kreita por manipulado de datumoj, tidyr alporti la datumojn al neta formo, stringr simpligas labori kun ŝnuroj, kaj ggplot2 estas unu el la plej popularaj datumoj bildigaj iloj.

La avantaĝo tidyverse estas la simpleco kaj facile legebla sintakso, kiu multrilate similas al la SQL-demanda lingvo.

datumo.tablo

Kiun lingvon elekti por labori kun datumoj - R aŭ Python? Ambaŭ! Migrado de pandoj al tidyverse kaj data.table kaj reenOficiala retejo: r-datatable.com

De data.table estas Matt Dole de H2O.ai.

La unua eldono de la biblioteko okazis en 2006.

La paka sintakso ne estas tiel oportuna kiel en tidyverse kaj estas pli rememoriga pri klasikaj datumkadroj en R, sed samtempe signife vastigita en funkcieco.

Ĉiuj manipuladoj kun la tabelo en ĉi tiu pako estas priskribitaj en kvadrataj krampoj, kaj se vi tradukas la sintakson data.table en SQL, vi ricevas ion tian: data.table[ WHERE, SELECT, GROUP BY ]

La forto de ĉi tiu pako estas la rapideco de prilaborado de grandaj kvantoj da datumoj.

pandoj

Oficiala retejo: pandas.pydata.org Kiun lingvon elekti por labori kun datumoj - R aŭ Python? Ambaŭ! Migrado de pandoj al tidyverse kaj data.table kaj reen

La nomo de la biblioteko venas de la ekonometria esprimo "paneldatumoj", uzita por priskribi plurdimensiajn strukturitajn arojn de informoj.

De pandas estas usonano Wes McKinney.

Kiam temas pri analizo de datumoj en Python, egale pandas Ne. Tre multfunkcia, altnivela pako, kiu ebligas al vi fari ajnan manipuladon kun datumoj, de ŝargi datumojn de iu ajn fonto ĝis bildigi ĝin.

Instalante pliajn pakaĵojn

La pakaĵoj diskutitaj en ĉi tiu artikolo ne estas inkluditaj en la bazaj R kaj Python-distribuoj. Kvankam estas malgranda averto, se vi instalis la distribuon Anaconda, tiam instalu aldone pandas ne bezonata.

Instalante pakaĵojn en R

Se vi malfermis la disvolvan medion RStudio almenaŭ unufoje, vi verŝajne jam scias kiel instali la bezonatan pakaĵon en R. Por instali pakaĵojn, uzu la norman komandon install.packages() rulante ĝin rekte en R mem.

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

Post instalado, la pakaĵoj devas esti konektitaj, por kiuj plejofte la komando estas uzata library().

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

Instalante Pakojn en Python

Do, se vi havas puran Python instalitan, tiam pandas vi devas instali ĝin permane. Malfermu komandlinion, aŭ terminalon, depende de via operaciumo kaj enigu la sekvan komandon.

pip install pandas

Poste ni revenas al Python kaj importas la instalitan pakon per la komando import.

import pandas as pd

Ŝarĝante Datumojn

Datuma minado estas unu el la plej gravaj paŝoj en datuma analizo. Kaj Python kaj R, se vi deziras, provizas al vi ampleksajn ŝancojn akiri datumojn de iuj fontoj: lokaj dosieroj, dosieroj de la Interreto, retejoj, ĉiaj datumbazoj.

Kiun lingvon elekti por labori kun datumoj - R aŭ Python? Ambaŭ! Migrado de pandoj al tidyverse kaj data.table kaj reen

Laŭlonge de la artikolo ni uzos plurajn datumajn arojn:

  1. Du elŝutoj de Google Analytics.
  2. Titanic Pasaĝera Datumaro.

Ĉiuj datumoj estas sur mia GitHub en la formo de csv kaj tsv dosieroj. De kie ni petos ilin?

Ŝargante datumojn en R: tidyverse, vroom, readr

Por ŝargi datumojn en bibliotekon tidyverse Estas du pakoj: vroom, readr. vroom pli moderna, sed estonte la pakaĵoj povas esti kombinitaj.

Citaĵo el oficiala dokumentaro vroom.

vroom vs leganto
Kion signifas la liberigo vroom signifi por readr? Nuntempe ni planas lasi la du pakaĵojn evolui aparte, sed verŝajne ni kunigos la pakaĵojn estonte. Unu malavantaĝo de la maldiligenta legado de vroom estas certaj datumproblemoj ne povas esti raportitaj antaŭe, do kiel plej bone unuigi ilin postulas iom da pripensado.

vroom vs leganto
Kion signifas liberigo? vroom por readr? Nuntempe ni planas evoluigi ambaŭ pakaĵojn aparte, sed verŝajne ni kombinos ilin estonte. Unu el la malavantaĝoj de maldiligenta legado vroom estas, ke iuj datumproblemoj ne povas esti raportitaj anticipe, do vi devas pensi pri kiel plej bone kombini ilin.

En ĉi tiu artikolo ni rigardos ambaŭ pakaĵojn pri ŝarĝo de datumoj:

Ŝargante datumojn en R: vroom-pakaĵon

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

Ŝargante datumojn en R: leganto

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

En la pakaĵo vroom, sendepende de la formato de datumoj csv / tsv, la ŝarĝo estas farita per la samnoma funkcio vroom(), en la pakaĵo readr ni uzas malsaman funkcion por ĉiu formato read_tsv() и read_csv().

Ŝargante datumojn en R: data.table

В data.table estas funkcio por ŝargi datumojn fread().

Ŝargante datumojn en R: data.table-pakaĵo

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

Ŝargante datumojn en Python: pandoj

Se ni komparas kun R-pakaĵoj, tiam en ĉi tiu kazo la sintakso estas plej proksima al pandas estos readr, ĉar pandas povas peti datumojn de ie ajn, kaj estas tuta familio de funkcioj en ĉi tiu pako read_*().

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

Kaj multaj aliaj funkcioj desegnitaj por legi datumojn el diversaj formatoj. Sed por niaj celoj ĝi sufiĉas read_table()read_csv() uzante argumenton Sep por specifi la kolumn apartigilon.

Ŝargante datumojn en Python: pandoj

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

Kreante datumkadrojn

Tablo titanic, kiun ni ŝargis, estas kampo sex, kiu stokas la seksan identigilon de la pasaĝero.

Sed por pli oportuna prezento de datumoj laŭ pasaĝera sekso, vi devus uzi la nomon prefere ol la seksa kodo.

Por fari tion, ni kreos malgrandan dosierujon, tabelon en kiu estos nur 2 kolumnoj (kodo kaj seksnomo) kaj 2 vicoj respektive.

Krei datumkadron en R: tidyverse, dplyr

En la kodekzemplo sube, ni kreas la deziratan datumkadron uzante la funkcion tibble() .

Krei datumkadron en R: dplyr

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

Krei datumkadron en R: data.table

Krei datumkadron en R: data.table

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

Krei datumkadron en Python: pandoj

В pandas La kreado de kadroj okazas en pluraj etapoj, unue ni kreas vortaron, kaj poste ni konvertas la vortaron en datumkadron.

Krei datumkadron en Python: pandoj

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

Elektante Kolumnojn

La tabeloj kun kiuj vi laboras povas enhavi dekojn aŭ eĉ centojn da kolumnoj da datumoj. Sed por efektivigi analizon, vi kutime ne bezonas ĉiujn kolumnojn disponeblajn en la fonta tabelo.

Kiun lingvon elekti por labori kun datumoj - R aŭ Python? Ambaŭ! Migrado de pandoj al tidyverse kaj data.table kaj reen

Sekve, unu el la unuaj operacioj, kiujn vi faros kun la fonta tabelo, estas forigi ĝin de nenecesaj informoj kaj liberigi la memoron, kiun ĉi tiu informo okupas.

Elektante kolumnojn en R: tidyverse, dplyr

sintakso dplyr estas tre simila al la demanda lingvo SQL, se vi konas ĝin, vi rapide regos ĉi tiun pakaĵon.

Por elekti kolumnojn, uzu la funkcion select().

Malsupre estas ekzemploj de kodo per kiu vi povas elekti kolumnojn laŭ la sekvaj manieroj:

  • Listo de la nomoj de la postulataj kolumnoj
  • Riferu al kolonnomoj uzante regulajn esprimojn
  • Laŭ datumtipo aŭ ajna alia posedaĵo de la datumoj enhavita en la kolumno

Elektante kolumnojn en 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)

Elektante kolumnojn en R: datumoj.tabelo

La samaj operacioj en data.table estas faritaj iom malsame, komence de la artikolo mi donis priskribon de kiaj argumentoj estas en kvadrataj krampoj en data.table.

DT[i,j,by]

Kie:
i - kie, t.e. filtrante per vicoj
j - elektu|ĝisdatigi|fari, t.e. elektante kolumnojn kaj konverti ilin
per - datumgrupigo

Elektante kolumnojn en R: datumoj.tabelo

## data.table
### выбрать по названию столбцов
ga_nov[ , .(date, source, sessions) ]
### исключь по названию столбцов
ga_nov[ , .SD, .SDcols = ! names(ga_nov) %like% "medium|bounces" ]
### выбрать по регулярному выражению
ga_nov[, .SD, .SDcols = patterns("s$")]

Variablo .SD permesas vin aliri ĉiujn kolumnojn, kaj .SDcols filtru la postulatajn kolumnojn uzante regulajn esprimojn, aŭ aliajn funkciojn por filtri la nomojn de la kolumnoj, kiujn vi bezonas.

Elektante kolumnojn en Python, pandoj

Elekti kolumnojn laŭ nomo en pandas sufiĉas provizi liston de iliaj nomoj. Kaj por elekti aŭ ekskludi kolumnojn laŭnome uzante regulajn esprimojn, vi devas uzi la funkciojn drop() и filter(), kaj argumento akso=1, per kiu vi indikas, ke necesas prilabori kolumnojn prefere ol vicoj.

Por elekti kampon laŭ datumtipo, uzu la funkcion select_dtypes(), kaj en argumentojn inkluziviekskludi pasigu liston de datumtipoj respondaj al kiuj kampoj vi devas elekti.

Elektante kolumnojn en Python: pandoj

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

Filtrado de vicoj

Ekzemple, la fonta tabelo povas enhavi plurajn jarojn da datumoj, sed vi nur bezonas analizi la pasintan monaton. Denove, ekstraj linioj malrapidigos la datumtraktadon kaj ŝtopos la komputilan memoron.

Kiun lingvon elekti por labori kun datumoj - R aŭ Python? Ambaŭ! Migrado de pandoj al tidyverse kaj data.table kaj reen

Filtri vicojn en R: tydyverse, dplyr

В dplyr la funkcio estas uzata por filtri vicojn filter(). Ĝi prenas datumkadron kiel la unua argumento, tiam vi listigas la filtrajn kondiĉojn.

Dum skribado de logikaj esprimoj por filtri tabelon, en ĉi tiu kazo, specifu la kolonnomojn sen citiloj kaj sen deklari la tabelnomon.

Kiam vi uzas plurajn logikajn esprimojn por filtri, uzu la sekvajn funkciigistojn:

  • & aŭ komo - logika AND
  • | - logika AŬ

Filtrado de vicoj en R: dplyr

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

Filtrado de vicoj en R: datumoj.tabelo

Kiel mi jam skribis supre, en data.table datumkonverta sintakso estas enfermita en kvadrataj krampoj.

DT[i,j,by]

Kie:
i - kie, t.e. filtrante per vicoj
j - elektu|ĝisdatigi|fari, t.e. elektante kolumnojn kaj konverti ilin
per - datumgrupigo

La argumento estas uzata por filtri vicojn i, kiu havas la unuan pozicion inter kvadrataj krampoj.

Kolumnoj estas alireblaj en logikaj esprimoj sen citiloj kaj sen specifi la tabelnomon.

Logikaj esprimoj rilatas unu al la alia same kiel en dplyr per la & kaj | operatoroj.

Filtrado de vicoj en R: datumoj.tabelo

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

Filtrado de ŝnuroj en Python: pandoj

Filtru per vicoj en pandas simila al enfiltri data.table, kaj estas farita en kvadrataj krampoj.

En ĉi tiu kazo, aliro al kolumnoj estas farata nepre indikante la nomon de la datumkadro; tiam la kolumnonomo ankaŭ povas esti indikita inter citiloj inter kvadrataj krampoj (ekzemplo df['col_name']), aŭ sen citiloj post la periodo (ekzemplo df.col_name).

Se vi bezonas filtri datumkadron per pluraj kondiĉoj, ĉiu kondiĉo devas esti metita inter krampoj. Logikaj kondiĉoj estas ligitaj unu kun la alia fare de funkciigistoj & и |.

Filtrado de ŝnuroj en Python: pandoj

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

Grupiĝo kaj agregado de datumoj

Unu el la plej ofte uzataj operacioj en datuma analizo estas grupigo kaj agregado.

Kiun lingvon elekti por labori kun datumoj - R aŭ Python? Ambaŭ! Migrado de pandoj al tidyverse kaj data.table kaj reen

La sintakso por plenumi ĉi tiujn operaciojn estas disigita tra ĉiuj pakoj, kiujn ni revizias.

En ĉi tiu kazo, ni prenos datumkadron kiel ekzemplon titanic, kaj kalkulu la nombron kaj mezan koston de biletoj depende de la kabana klaso.

Grupiĝo kaj agregado de datumoj en R: tidyverse, dplyr

В dplyr la funkcio estas uzata por grupigo group_by(), kaj por agregado summarise(). Fakte, dplyr ekzistas tuta familio de funkcioj summarise_*(), sed la celo de ĉi tiu artikolo estas kompari la bazan sintakson, do ni ne iros en tian ĝangalon.

Bazaj agregaj funkcioj:

  • sum() — sumo
  • min() / max() - minimuma kaj maksimuma valoro
  • mean() - averaĝa
  • median() — mediano
  • length() - kvanto

Grupiĝo kaj agregado en R: dplyr

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

Funkcii group_by() ni pasis la tablon kiel la unuan argumenton titanic, kaj tiam indikis la kampon Pklaso, per kiu ni grupigos nian tablon. La rezulto de ĉi tiu operacio uzante la operatoron %>% pasita kiel la unua argumento al la funkcio summarise(), kaj aldonis 2 pliajn kampojn: pasaĝeroj и mezumo_prezo. En la unua, uzante la funkcion length() kalkulis la nombron da biletoj, kaj en la dua uzante la funkcion mean() ricevis la mezan biletprezon.

Grupiĝo kaj agregado de datumoj en R: datumoj.tablo

В data.table la argumento estas uzata por agregado j kiu havas duan pozicion inter kvadrataj krampoj, kaj por grupigo bykeyby, kiuj havas la trian pozicion.

La listo de agregaciaj funkcioj en ĉi tiu kazo estas identa al tiu priskribita en dplyr, ĉar ĉi tiuj estas funkcioj de la baza R-sintakso.

Grupiĝo kaj agregado en R: datumoj.tabelo

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

Grupiĝo kaj agregado de datumoj en Python: pandoj

Grupiĝo en pandas simila al dplyr, sed la agregacio ne similas al dplyr ne sur data.table.

Por grupigi, uzu la metodon groupby(), en kiu vi devas pasi liston de kolumnoj per kiuj la datumkadro estos grupigita.

Por agregado vi povas uzi la metodon agg()kiu akceptas vortaron. La vortaraj ŝlosiloj estas la kolumnoj sur kiuj vi aplikos la agregajn funkciojn, kaj la valoroj estas la nomoj de la agregaj funkcioj.

Agregaj funkcioj:

  • sum() — sumo
  • min() / max() - minimuma kaj maksimuma valoro
  • mean() - averaĝa
  • median() — mediano
  • count() - kvanto

funkcio reset_index() en la suba ekzemplo ĝi estas uzata por restarigi nestitajn indeksojn tio pandas defaŭlte al post datuma agregado.

Simbolo permesas al vi moviĝi al la sekva linio.

Grupiĝo kaj agregado en Python: pandoj

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

Vertikala kunigo de tabloj

Operacio en kiu vi kunigas du aŭ pli da tabeloj de la sama strukturo. La datumoj, kiujn ni ŝargis, enhavas tabelojn ga_nov и ga_dec. Tiuj ĉi tabeloj estas identaj laŭ strukturo, t.e. havas la samajn kolumnojn, kaj la datumtipojn en ĉi tiuj kolumnoj.

Kiun lingvon elekti por labori kun datumoj - R aŭ Python? Ambaŭ! Migrado de pandoj al tidyverse kaj data.table kaj reen

Ĉi tio estas alŝuto de Google Analytics por la monato novembro kaj decembro, en ĉi tiu sekcio ni kombinos ĉi tiujn datumojn en unu tabelon.

Vertikale kunigante tabelojn en R: tidyverse, dplyr

В dplyr Vi povas kombini 2 tabelojn en unu uzante la funkcion bind_rows(), pasante tabelojn kiel ĝiaj argumentoj.

Filtrado de vicoj en R: dplyr

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

Vertikale kunigante tabelojn en R: datumoj.tabelo

Ĝi ankaŭ estas nenio komplika, ni uzu rbind().

Filtrado de vicoj en R: datumoj.tabelo

## data.table
rbind(ga_nov, ga_dec)

Vertikale kunigante tabelojn en Python: pandoj

В pandas la funkcio estas uzata por kunigi tabelojn concat(), en kiun vi devas pasi liston de kadroj por kombini ilin.

Filtrado de ŝnuroj en Python: pandoj

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

Horizontala kunigo de tabloj

Operacio en kiu kolumnoj de la dua estas aldonitaj al la unua tabelo per ŝlosilo. Ĝi estas ofte uzata kiam oni riĉigas faktabelon (ekzemple tabelo kun vendaj datumoj) per iuj referencaj datumoj (ekzemple la kosto de produkto).

Kiun lingvon elekti por labori kun datumoj - R aŭ Python? Ambaŭ! Migrado de pandoj al tidyverse kaj data.table kaj reen

Estas pluraj specoj de kuniĝoj:

Kiun lingvon elekti por labori kun datumoj - R aŭ Python? Ambaŭ! Migrado de pandoj al tidyverse kaj data.table kaj reen

En la antaŭe ŝargita tabelo titanic ni havas kolumnon sex, kiu egalrilatas al la sekskodo de la pasaĝero:

1 - ino
2 - masklo

Ankaŭ ni kreis tabelon - konsultlibron sekso. Por pli oportuna prezento de datumoj pri la sekso de pasaĝeroj, ni devas aldoni la nomon de la sekso el la dosierujo. sekso al la tablo titanic.

Horizontala tabelkunigo en R: tidyverse, dplyr

В dplyr Ekzistas tuta familio de funkcioj por horizontala kunigo:

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

La plej ofte uzata en mia praktiko estas left_join().

Kiel la unuaj du argumentoj, la funkcioj listigitaj supre prenas du tabelojn por kunigi, kaj kiel la tria argumento by vi devas specifi la kolumnojn por aliĝi.

Horizontala tabelkunigo en R: dplyr

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

Horizontala kunigo de tabeloj en R: datumoj.tabelo

В data.table Vi devas kunigi tabelojn per klavo uzante la funkcion merge().

Argumentoj por merge() funkcias en data.table

  • x, y — Tabeloj por kunigo
  • per — Kolumno kiu estas la ŝlosilo por kunigi se ĝi havas la saman nomon en ambaŭ tabeloj
  • by.x, by.y — Kolonnomoj kunfandaj, se ili havas malsamajn nomojn en la tabeloj
  • all, all.x, all.y — Tipo de kunigo, all resendos ĉiujn vicojn de ambaŭ tabeloj, all.x respondas al la operacio LEFT JOIN (lasos ĉiujn vicojn de la unua tabelo), all.y — respondas al la Operacio RIGHT JOIN (lasos ĉiujn vicojn de la dua tabelo).

Horizontala kunigo de tabeloj en R: datumoj.tabelo

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

Horizontala tablo-kuniĝo en Python: pandoj

Same kiel en data.tableen pandas la funkcio estas uzata por kunigi tabelojn merge().

Argumentoj de la merge() funkcias en pandoj

  • kiel — Tipo de konekto: maldekstra, dekstra, ekstera, interna
  • on — Kolumno kiu estas ŝlosilo se ĝi havas la saman nomon en ambaŭ tabeloj
  • left_on, right_on — Nomoj de ŝlosilaj kolumnoj, se ili havas malsamajn nomojn en tabeloj

Horizontala tablo-kuniĝo en Python: pandoj

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

Bazaj fenestrofunkcioj kaj kalkulitaj kolumnoj

Fenestrofunkcioj estas similaj en signifo al agregaciaj funkcioj, kaj ankaŭ estas ofte uzitaj en datenanalizo. Sed male al agregaj funkcioj, fenestraj funkcioj ne ŝanĝas la nombron da vicoj de la eksiĝinta datumkadro.

Kiun lingvon elekti por labori kun datumoj - R aŭ Python? Ambaŭ! Migrado de pandoj al tidyverse kaj data.table kaj reen

Esence, uzante la fenestrofunkcion, ni disigas la envenantan datumkadron en partojn laŭ iu kriterio, t.e. per la valoro de kampo, aŭ pluraj kampoj. Kaj ni faras aritmetikajn operaciojn sur ĉiu fenestro. La rezulto de ĉi tiuj operacioj estos resendita en ĉiu linio, t.e. sen ŝanĝi la totalan nombron de vicoj en la tabelo.

Ekzemple, ni prenu la tablon titanic. Ni povas kalkuli kian procenton la kosto de ĉiu bileto estis ene de sia kabana klaso.

Por fari tion, ni devas ricevi en ĉiu linio la totalan koston de bileto por la nuna kabana klaso al kiu la bileto en ĉi tiu linio apartenas, tiam dividu la koston de ĉiu bileto per la totalkosto de ĉiuj biletoj de la sama kabana klaso. .

Fenestraj funkcioj en R: tidyverse, dplyr

Por aldoni novajn kolumnojn, sen uzi vicigrupigon, en dplyr servas funkcion mutate().

Vi povas solvi la problemon priskribitan supre grupigante datumojn laŭ kampo Pklaso kaj sumigante la kampon en nova kolumno Tarifo. Poste, malgrupigu la tabelon kaj dividu la kampajn valorojn Tarifo al kio okazis en la antaŭa paŝo.

Fenestraj funkcioj en R: dplyr

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

Fenestraj funkcioj en R: datumoj.tabelo

La solvalgoritmo restas la sama kiel en dplyr, ni devas dividi la tabelon en fenestrojn laŭ kampo Pklaso. Eligu en nova kolumno la kvanton por la grupo responda al ĉiu linio, kaj aldonu kolumnon en kiu ni kalkulas la parton de la kosto de ĉiu bileto en ĝia grupo.

Por aldoni novajn kolumnojn al data.table ĉeestanta operatoro :=. Malsupre estas ekzemplo de solvado de problemo uzante la pakaĵon data.table

Fenestraj funkcioj en R: datumoj.tabelo

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

Fenestraj funkcioj en Python: pandoj

Unu maniero aldoni novan kolumnon al pandas - uzu la funkcion assign(). Por resumi la koston de biletoj laŭ kabana klaso, sen grupigi vicojn, ni uzos la funkcion transform().

Malsupre estas ekzemplo de solvo en kiu ni aldonas al la tabelo titanic la samaj 2 kolumnoj.

Fenestraj funkcioj en Python: pandoj

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

Tabelo de korespondado de funkcioj kaj metodoj

Malsupre estas tabelo de korespondado inter metodoj por plenumi diversajn operaciojn kun datumoj en la pakoj, kiujn ni konsideris.

Priskribo
tidyverse
datumo.tablo
pandoj

Ŝarĝante Datumojn
vroom()/ readr::read_csv() / readr::read_tsv()
fread()
read_csv()

Kreante datumkadrojn
tibble()
data.table()
dict() + from_dict()

Elektante Kolumnojn
select()
argumentado j, dua pozicio inter kvadrataj krampoj
ni pasas la liston de postulataj kolumnoj inter kvadrataj krampoj / drop() / filter() / select_dtypes()

Filtrado de vicoj
filter()
argumentado i, unua pozicio en kvadrataj krampoj
Ni listigas la filtrajn kondiĉojn en kvadrataj krampoj / filter()

Grupiĝo kaj Agregado
group_by() + summarise()
argumentoj j + by
groupby() + agg()

Vertikala kuniĝo de tabloj (UNION)
bind_rows()
rbind()
concat()

Horizontala kunigo de tabloj (JOIN)
left_join() / *_join()
merge()
merge()

Bazaj fenestrofunkcioj kaj aldonado de kalkulitaj kolumnoj
group_by() + mutate()
argumentado j uzante la operatoron := + argumento by
transform() + assign()

konkludo

Eble en la artikolo mi priskribis ne la plej optimumajn efektivigojn de datumtraktado, do mi ĝojos se vi korektos miajn erarojn en la komentoj, aŭ simple kompletigas la informojn donitajn en la artikolo per aliaj teknikoj por labori kun datumoj en R / Python.

Kiel mi skribis supre, la celo de la artikolo estis ne trudi sian opinion pri kiu lingvo estas pli bona, sed simpligi la ŝancon lerni ambaŭ lingvojn, aŭ, se necese, migri inter ili.

Se vi ŝatis la artikolon, mi ĝojos havi novajn abonantojn al mia youtube и telegramo kanaloj.

Enketo

Kiun el la sekvaj pakoj vi uzas en via laboro?

En la komentoj vi povas skribi la kialon de via elekto.

Nur registritaj uzantoj povas partopreni la enketon. Ensaluti, bonvolu.

Kiun pakaĵon pri datumtraktado vi uzas (vi povas elekti plurajn opciojn)

  • 45,2%ordigita19

  • 33,3%datumoj.tabelo14

  • 54,8%pandoj23

42 uzantoj voĉdonis. 9 uzantoj sindetenis.

fonto: www.habr.com

Aldoni komenton