Jaký jazyk zvolit pro práci s daty – R nebo Python? Oba! Migrace z pand na tidyverse a data.table a zpět

Hledáním R nebo Pythonu na internetu najdete miliony článků a kilometry diskuzí na téma, který je lepší, rychlejší a pohodlnější pro práci s daty. Ale bohužel všechny tyto články a spory nejsou nijak zvlášť užitečné.

Jaký jazyk zvolit pro práci s daty – R nebo Python? Oba! Migrace z pand na tidyverse a data.table a zpět

Účelem tohoto článku je porovnat základní techniky zpracování dat v nejoblíbenějších balíčcích obou jazyků. A pomozte čtenářům rychle zvládnout něco, co ještě neznají. Pro ty, kteří píší v Pythonu, zjistěte, jak totéž udělat v R a naopak.

Během článku budeme analyzovat syntaxi nejoblíbenějších balíčků v R. Jedná se o balíčky zahrnuté v knihovně tidyversea také balíček data.table. A porovnejte jejich syntaxi s pandas, nejoblíbenější balíček pro analýzu dat v Pythonu.

Projdeme krok za krokem celou cestu analýzy dat od jejich načtení až po provádění analytických okenních funkcí pomocí Pythonu a R.

Obsah

Tento článek lze použít jako cheat, pokud jste zapomněli, jak provést některé operace zpracování dat v jednom z uvažovaných balíčků.

Jaký jazyk zvolit pro práci s daty – R nebo Python? Oba! Migrace z pand na tidyverse a data.table a zpět

  1. Hlavní syntaktické rozdíly mezi R a Pythonem
    1.1. Přístup k funkcím balíčku
    1.2. Úkol
    1.3. Indexování
    1.4. Metody a OOP
    1.5. Potrubí
    1.6. Datové struktury
  2. Pár slov o balíčcích, které použijeme
    2.1. pořádek
    2.2. datová tabulka
    2.3. pandy
  3. Instalace balíčků
  4. Načítání dat
  5. Vytváření datových rámců
  6. Výběr sloupců, které potřebujete
  7. Filtrování řádků
  8. Seskupování a agregace
  9. Vertikální sjednocení tabulek (UNION)
  10. Horizontální spojení tabulek (JOIN)
  11. Základní funkce okna a počítané sloupce
  12. Korespondenční tabulka mezi metodami zpracování dat v R a Pythonu
  13. Závěr
  14. Krátký průzkum o tom, jaký balíček používáte

Pokud máte zájem o analýzu dat, můžete najít můj telegram и Youtube kanály. Většina obsahu je věnována jazyku R.

Hlavní syntaktické rozdíly mezi R a Pythonem

Abychom vám usnadnili přechod z Pythonu na R nebo naopak, uvedu několik hlavních bodů, kterým je třeba věnovat pozornost.

Přístup k funkcím balíčku

Jakmile je balíček načten do R, nemusíte pro přístup k jeho funkcím zadávat název balíčku. Ve většině případů to není v R běžné, ale je to přijatelné. Pokud potřebujete jednu z jeho funkcí ve svém kódu, nemusíte balíček vůbec importovat, ale jednoduše jej zavolejte zadáním názvu balíčku a názvu funkce. Oddělovač mezi názvy balíků a funkcí v R je dvojitá dvojtečka. package_name::function_name().

V Pythonu je naopak považováno za klasické volání funkcí balíčku explicitním uvedením jeho jména. Když je balíček stažen, dostane obvykle zkrácený název, např. pandas obvykle se používá pseudonym pd. Funkce balíčku je přístupná přes tečku package_name.function_name().

Úkol

V R je běžné používat šipku k přiřazení hodnoty objektu. obj_name <- valueAčkoli je povoleno jediné znaménko rovná se, jediné znaménko rovná se v R se používá především k předávání hodnot argumentům funkce.

V Pythonu se přiřazení provádí výhradně pomocí jediného znaménka rovná se obj_name = value.

Indexování

I zde jsou poměrně výrazné rozdíly. V R začíná indexování na jedné a zahrnuje všechny zadané prvky ve výsledném rozsahu,

V Pythonu začíná indexování od nuly a vybraný rozsah nezahrnuje poslední prvek zadaný v indexu. Takže design x[i:j] v Pythonu nebude obsahovat prvek j.

Existují také rozdíly v negativním indexování, v zápisu R x[-1] vrátí všechny prvky vektoru kromě posledního. V Pythonu podobný zápis vrátí pouze poslední prvek.

Metody a OOP

R implementuje OOP po svém, o tom jsem psal v článku "OOP v jazyce R (část 1): třídy S3". Obecně je R funkční jazyk a vše v něm je postaveno na funkcích. Proto například pro uživatele Excelu přejděte na tydiverse bude to jednodušší než pandas. I když to může být můj subjektivní názor.

Stručně řečeno, objekty v R nemají metody (pokud mluvíme o třídách S3, ale existují další implementace OOP, které jsou mnohem méně běžné). Existují pouze zobecněné funkce, které je zpracovávají odlišně v závislosti na třídě objektu.

Potrubí

Možná je to název pro pandas Nebude to úplně správné, ale pokusím se vysvětlit význam.

Abyste nešetřili mezivýpočty a nevyráběli zbytečné objekty v pracovním prostředí, můžete použít jakousi pipeline. Tito. předávat výsledek výpočtu z jedné funkce do další a neukládat mezivýsledky.

Vezměme si následující příklad kódu, kde ukládáme mezivýpočty do samostatných objektů:

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

Postupně jsme provedli 3 operace a výsledek každé byl uložen do samostatného objektu. Ale ve skutečnosti tyto přechodné objekty nepotřebujeme.

Nebo ještě horší, ale uživatelům Excelu známější.

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

V tomto případě jsme neuložili mezivýsledky výpočtu, ale čtení kódu s vnořenými funkcemi je extrémně nepohodlné.

Podíváme se na několik přístupů ke zpracování dat v R, které provádějí podobné operace různými způsoby.

Potrubí v knihovně tidyverse realizované provozovatelem %>%.

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

Tak bereme výsledek práce func1() a předat jej jako první argument func2(), pak výsledek tohoto výpočtu předáme jako první argument func3(). A nakonec všechny provedené výpočty zapíšeme do objektu obj <-.

Vše výše uvedené lépe než slova ilustruje tento mem:
Jaký jazyk zvolit pro práci s daty – R nebo Python? Oba! Migrace z pand na tidyverse a data.table a zpět

В data.table řetězy se používají podobným způsobem.

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

V každé z hranatých závorek můžete použít výsledek předchozí operace.

В pandas takové operace jsou odděleny tečkou.

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

Tito. bereme náš stůl df a použít její metodu fun1(), pak metodu aplikujeme na získaný výsledek fun2()po fun3(). Výsledný výsledek se uloží do objektu Obj .

Datové struktury

Datové struktury v R a Pythonu jsou podobné, ale mají různé názvy.

popis
Jméno v R
Jméno v Pythonu/pandy

Struktura tabulky
data.frame, data.table, tibble
DataFrame

Jednorozměrný seznam hodnot
Vektor
Série v pandách nebo seznam v čistém Pythonu

Víceúrovňová netabulková struktura
Seznam
slovník (diktát)

Níže se podíváme na některé další funkce a rozdíly v syntaxi.

Pár slov o balíčcích, které použijeme

Nejprve vám řeknu něco o balíčcích, se kterými se v tomto článku seznámíte.

pořádek

Oficiální stránky: tidyverse.org
Jaký jazyk zvolit pro práci s daty – R nebo Python? Oba! Migrace z pand na tidyverse a data.table a zpět
knihovna tidyverse napsal Hedley Wickham, hlavní vědecký pracovník v RStudio. tidyverse sestává z působivé sady balíčků, které zjednodušují zpracování dat, z nichž 5 je zahrnuto mezi 10 nejčastěji staženými soubory z úložiště CRAN.

Jádro knihovny se skládá z následujících balíčků: ggplot2, dplyr, tidyr, readr, purrr, tibble, stringr, forcats. Každý z těchto balíčků je zaměřen na řešení konkrétního problému. Například dplyr vytvořené pro manipulaci s daty, tidyr převést data do úhledné podoby, stringr zjednodušuje práci s řetězci a ggplot2 je jedním z nejpopulárnějších nástrojů pro vizualizaci dat.

Výhoda tidyverse je jednoduchost a snadno čitelná syntaxe, která je v mnoha ohledech podobná dotazovacímu jazyku SQL.

datová tabulka

Jaký jazyk zvolit pro práci s daty – R nebo Python? Oba! Migrace z pand na tidyverse a data.table a zpětOficiální stránky: r-datatable.com

Podle data.table je Matt Dole z H2O.ai.

První vydání knihovny se uskutečnilo v roce 2006.

Syntaxe balíčku není tak pohodlná jako v tidyverse a připomíná spíše klasické datové rámce v R, ale zároveň výrazně rozšířil funkcionalitu.

Všechny manipulace s tabulkou v tomto balíčku jsou popsány v hranatých závorkách a pokud přeložíte syntaxi data.table v SQL získáte něco takového: data.table[ WHERE, SELECT, GROUP BY ]

Silnou stránkou tohoto balíku je rychlost zpracování velkého množství dat.

pandy

Oficiální stránky: pandas.pydata.org Jaký jazyk zvolit pro práci s daty – R nebo Python? Oba! Migrace z pand na tidyverse a data.table a zpět

Název knihovny pochází z ekonometrického termínu „panel data“, který se používá k popisu vícerozměrných strukturovaných souborů informací.

Podle pandas je Američan Wes McKinney.

Pokud jde o analýzu dat v Pythonu, rovná se pandas Ne. Velmi multifunkční balík na vysoké úrovni, který umožňuje provádět jakoukoli manipulaci s daty, od načítání dat z libovolných zdrojů až po jejich vizualizaci.

Instalace dalších balíčků

Balíčky popsané v tomto článku nejsou součástí základních distribucí R a Python. I když je zde malé upozornění, pokud jste nainstalovali distribuci Anaconda, nainstalujte dodatečně pandas není vyžadováno.

Instalace balíčků v R

Pokud jste alespoň jednou otevřeli vývojové prostředí RStudio, pravděpodobně již víte, jak nainstalovat požadovaný balíček v R. Pro instalaci balíčků použijte standardní příkaz install.packages() spuštěním přímo v R samotném.

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

Po instalaci je potřeba balíčky propojit, k čemuž ve většině případů slouží příkaz library().

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

Instalace balíčků v Pythonu

Pokud tedy máte nainstalovaný čistý Python, pak pandas musíte jej nainstalovat ručně. Otevřete příkazový řádek nebo terminál v závislosti na operačním systému a zadejte následující příkaz.

pip install pandas

Poté se vrátíme do Pythonu a příkazem importujeme nainstalovaný balíček import.

import pandas as pd

Načítání dat

Data mining je jedním z nejdůležitějších kroků v analýze dat. Jak Python, tak R, pokud si to přejete, vám poskytují rozsáhlé možnosti získávání dat z jakýchkoli zdrojů: lokální soubory, soubory z internetu, webové stránky, všechny druhy databází.

Jaký jazyk zvolit pro práci s daty – R nebo Python? Oba! Migrace z pand na tidyverse a data.table a zpět

V celém článku budeme používat několik datových sad:

  1. Dvě stažení z Google Analytics.
  2. Soubor údajů o cestujících na Titaniku.

Všechna data jsou na mém GitHub ve formě souborů csv a tsv. Odkud je budeme žádat?

Načítání dat do R: tidyverse, vroom, readr

Chcete-li načíst data do knihovny tidyverse Existují dva balíčky: vroom, readr. vroom modernější, ale v budoucnu se mohou balíčky kombinovat.

Citace z oficiální dokumentace vroom.

vroom vs čtenář
Co znamená vydání vroom znamená pro readr? Prozatím plánujeme nechat oba balíčky vyvíjet odděleně, ale pravděpodobně balíčky v budoucnu sjednotíme. Jednou nevýhodou líného čtení vroom je, že určité problémy s daty nelze nahlásit předem, takže to, jak je nejlépe sjednotit, vyžaduje trochu přemýšlení.

vroom vs čtenář
Co znamená uvolnění? vroom pro readr? V tuto chvíli plánujeme vyvíjet oba balíčky samostatně, ale pravděpodobně je v budoucnu spojíme. Jedna z nevýhod líného čtení vroom je, že některé problémy s daty nelze nahlásit předem, takže je třeba přemýšlet, jak je nejlépe zkombinovat.

V tomto článku se podíváme na oba balíčky načítání dat:

Načítání dat do balíčku R: vroom

# install.packages("vroom")
library(vroom)

# Чтение данных
## vroom
ga_nov  <- vroom("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/ga_nowember.csv")
ga_dec  <- vroom("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/ga_december.csv")
titanic <- vroom("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/titanic.csv")

Načítání dat do 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")

V balení vroombez ohledu na formát dat csv / tsv se načítání provádí stejnojmennou funkcí vroom(), v balení readr pro každý formát používáme jinou funkci read_tsv() и read_csv().

Načítání dat do R: data.table

В data.table existuje funkce pro načítání dat fread().

Načítání dat do balíku R: data.table

# install.packages("data.table")
library(data.table)

## data.table
ga_nov  <- fread("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/ga_nowember.csv")
ga_dec  <- fread("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/ga_december.csv")
titanic <- fread("https://raw.githubusercontent.com/selesnow/publications/master/data_example/r_python_data/titanic.csv")

Načítání dat v Pythonu: pandas

Pokud porovnáme s balíčky R, pak se v tomto případě syntaxe nejvíce blíží pandas vůle readrProtože pandas může požadovat data odkudkoli a tento balíček obsahuje celou řadu funkcí read_*().

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

A mnoho dalších funkcí určených ke čtení dat z různých formátů. Ale pro naše účely to stačí read_table() nebo read_csv() pomocí argumentu září k určení oddělovače sloupců.

Načítání dat v Pythonu: pandas

import pandas as pd

ga_nov  = pd.read_csv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/russian_text_in_r/ga_nowember.csv", sep = "t")
ga_dec  = pd.read_csv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/russian_text_in_r/ga_december.csv", sep = "t")
titanic = pd.read_csv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/russian_text_in_r/titanic.csv")

Vytváření datových rámců

Stůl titánský, kterou jsme naložili, je pole Sex, ve kterém je uložen identifikátor pohlaví cestujícího.

Ale pro pohodlnější prezentaci údajů z hlediska pohlaví cestujícího byste měli používat spíše jméno než kód pohlaví.

K tomu si vytvoříme malý adresář, tabulku, ve které budou pouze 2 sloupce (kód a jméno pohlaví) respektive 2 řádky.

Vytvoření datového rámce v R: tidyverse, dplyr

V níže uvedeném příkladu kódu vytvoříme požadovaný datový rámec pomocí funkce tibble() .

Vytvoření datového rámce v R: dplyr

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

Vytvoření datového rámce v R: data.table

Vytvoření datového rámce v R: data.table

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

Vytvoření datového rámce v Pythonu: pandas

В pandas Vytváření rámců probíhá v několika fázích, nejprve vytvoříme slovník a poté slovník převedeme na datový rámec.

Vytvoření datového rámce v Pythonu: pandas

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

Výběr sloupců

Tabulky, se kterými pracujete, mohou obsahovat desítky nebo dokonce stovky sloupců dat. K provedení analýzy však zpravidla nepotřebujete všechny sloupce, které jsou k dispozici ve zdrojové tabulce.

Jaký jazyk zvolit pro práci s daty – R nebo Python? Oba! Migrace z pand na tidyverse a data.table a zpět

Jednou z prvních operací, které se zdrojovou tabulkou provedete, je proto její vyčištění od nepotřebných informací a uvolnění paměti, kterou tyto informace zabírají.

Výběr sloupců v R: tidyverse, dplyr

syntax dplyr je velmi podobný dotazovacímu jazyku SQL, pokud jej znáte, rychle si osvojíte tento balíček.

Chcete-li vybrat sloupce, použijte funkci select().

Níže jsou uvedeny příklady kódu, pomocí kterého můžete vybrat sloupce následujícími způsoby:

  • Výpis názvů požadovaných sloupců
  • Odkazujte na názvy sloupců pomocí regulárních výrazů
  • Podle typu dat nebo jakékoli jiné vlastnosti dat obsažených ve sloupci

Výběr sloupců v 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)

Výběr sloupců v R: data.table

Stejné operace v data.table se provádějí trochu jinak, na začátku článku jsem uvedl popis toho, jaké argumenty jsou v hranatých závorkách data.table.

DT[i,j,by]

Kde:
i - kde, tzn. filtrování podle řádků
j - select|update|do, tzn. výběr sloupců a jejich převod
podle - seskupování dat

Výběr sloupců v 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$")]

Proměnná .SD umožňuje přístup ke všem sloupcům a .SDcols filtrujte požadované sloupce pomocí regulárních výrazů nebo jiných funkcí pro filtrování názvů sloupců, které potřebujete.

Výběr sloupců v Pythonu, pandy

Chcete-li vybrat sloupce podle názvu v pandas stačí uvést jejich jmenný seznam. A chcete-li vybrat nebo vyloučit sloupce podle názvu pomocí regulárních výrazů, musíte použít funkce drop() и filter()a argument osa=1, kterým označíte, že je nutné zpracovávat spíše sloupce než řádky.

Chcete-li vybrat pole podle typu dat, použijte funkci select_dtypes()a do argumentů obsahovat nebo vyloučit předat seznam datových typů odpovídajících polím, která musíte vybrat.

Výběr sloupců v Pythonu: pandy

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

Filtrování řádků

Zdrojová tabulka může například obsahovat data za několik let, ale stačí analyzovat pouze poslední měsíc. Opět platí, že další řádky zpomalí proces zpracování dat a zanesou paměť PC.

Jaký jazyk zvolit pro práci s daty – R nebo Python? Oba! Migrace z pand na tidyverse a data.table a zpět

Filtrování řádků v R: tydyverse, dplyr

В dplyr funkce se používá k filtrování řádků filter(). Jako první argument bere datový rámec a poté vypíšete podmínky filtrování.

Při psaní logických výrazů pro filtrování tabulky v tomto případě zadejte názvy sloupců bez uvozovek a bez deklarování názvu tabulky.

Při použití více logických výrazů k filtrování použijte následující operátory:

  • & nebo čárka - logické AND
  • | - logické NEBO

Filtrování řádků v R: dplyr

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

Filtrování řádků v R: data.table

Jak jsem již psal výše, v data.table syntaxe převodu dat je uzavřena v hranatých závorkách.

DT[i,j,by]

Kde:
i - kde, tzn. filtrování podle řádků
j - select|update|do, tzn. výběr sloupců a jejich převod
podle - seskupování dat

Argument se používá k filtrování řádků i, který má první pozici v hranatých závorkách.

Ke sloupcům se přistupuje v logických výrazech bez uvozovek a bez uvedení názvu tabulky.

Logické výrazy spolu souvisí stejně jako v dplyr prostřednictvím operátorů & a |.

Filtrování řádků v R: data.table

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

Filtrování řetězců v Pythonu: pandy

Filtrovat podle řádků v pandas podobné filtrování data.table, a je uvedeno v hranatých závorkách.

V tomto případě se přístup ke sloupcům provádí nutně uvedením názvu datového rámce; název sloupce pak může být také uveden v uvozovkách v hranatých závorkách (příklad df['col_name']), nebo bez uvozovek za tečkou (příklad df.col_name).

Pokud potřebujete filtrovat datový rámec podle několika podmínek, každá podmínka musí být umístěna v závorkách. Logické podmínky jsou vzájemně propojeny operátory & и |.

Filtrování řetězců v Pythonu: pandy

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

Seskupování a agregace dat

Jednou z nejčastěji používaných operací při analýze dat je seskupování a agregace.

Jaký jazyk zvolit pro práci s daty – R nebo Python? Oba! Migrace z pand na tidyverse a data.table a zpět

Syntaxe pro provádění těchto operací je rozptýlena ve všech balíčcích, které kontrolujeme.

V tomto případě si jako příklad vezmeme datový rámec titánskýa vypočítat počet a průměrnou cenu letenek v závislosti na třídě kabiny.

Seskupování a agregace dat v R: tidyverse, dplyr

В dplyr funkce se používá pro seskupování group_by()a pro agregaci summarise(). Ve skutečnosti, dplyr existuje celá rodina funkcí summarise_*(), ale účelem tohoto článku je porovnat základní syntaxi, takže do takové džungle zacházet nebudeme.

Základní agregační funkce:

  • sum() — shrnutí
  • min() / max() – minimální a maximální hodnota
  • mean() - průměrný
  • median() — medián
  • length() - Množství

Seskupování a agregace v R: dplyr

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

Ve funkci group_by() jako první argument jsme prošli kolem stolu titánskýa poté označili pole Pclass, podle kterého seskupíme náš stůl. Výsledek této operace pomocí operátoru %>% předán jako první argument funkci summarise()a přidal 2 další pole: cestující и průměrná_cena. V první pomocí funkce length() vypočítal počet tiketů a ve druhém pomocí funkce mean() obdržel průměrnou cenu vstupenky.

Seskupování a agregace dat v R: data.table

В data.table argument se používá pro agregaci j který má druhou pozici v hranatých závorkách a pro seskupování by nebo keyby, které mají třetí pozici.

Seznam agregačních funkcí je v tomto případě totožný se seznamem popsaným v dplyr, protože to jsou funkce ze základní syntaxe R.

Seskupování a agregace v R: data.table

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

Seskupování a agregace dat v Pythonu: pandy

Seskupování pandas podobný dplyr, ale agregace není podobná dplyr vůbec ne data.table.

Chcete-li seskupit, použijte metodu groupby(), do kterého je potřeba předat seznam sloupců, podle kterých bude datový rámec seskupen.

Pro agregaci můžete použít metodu agg()který přijímá slovník. Klíče slovníku jsou sloupce, na které použijete agregační funkce, a hodnoty jsou názvy agregačních funkcí.

Agregační funkce:

  • sum() — shrnutí
  • min() / max() – minimální a maximální hodnota
  • mean() - průměrný
  • median() — medián
  • count() - Množství

Funkce reset_index() v níže uvedeném příkladu se používá k resetování vnořených indexů, které pandas výchozí nastavení po agregaci dat.

Symbol umožňuje přejít na další řádek.

Seskupování a agregace v Pythonu: pandy

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

Svislé spojení tabulek

Operace, při které spojujete dvě nebo více tabulek stejné struktury. Data, která jsme načetli, obsahují tabulky ga_nov и ga_dec. Tyto tabulky jsou strukturou identické, tzn. mají stejné sloupce a datové typy v těchto sloupcích.

Jaký jazyk zvolit pro práci s daty – R nebo Python? Oba! Migrace z pand na tidyverse a data.table a zpět

Toto je nahrání z Google Analytics za měsíc listopad a prosinec, v této sekci tyto údaje sloučíme do jedné tabulky.

Svislé spojování stolů v R: tidyverse, dplyr

В dplyr Pomocí funkce můžete spojit 2 tabulky do jedné bind_rows(), předávání tabulek jako jeho argumentů.

Filtrování řádků v R: dplyr

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

Vertikální spojování tabulek v R: data.table

Není to také nic složitého, pojďme použít rbind().

Filtrování řádků v R: data.table

## data.table
rbind(ga_nov, ga_dec)

Vertikální spojování tabulek v Pythonu: pandy

В pandas funkce se používá ke spojení tabulek concat(), do kterého je potřeba předat seznam rámců pro jejich spojení.

Filtrování řetězců v Pythonu: pandy

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

Horizontální spojení stolů

Operace, při které se sloupce z druhé přidávají do první tabulky pomocí klíče. Často se používá při obohacení tabulky faktů (například tabulky s údaji o prodeji) o nějaké referenční údaje (například náklady na produkt).

Jaký jazyk zvolit pro práci s daty – R nebo Python? Oba! Migrace z pand na tidyverse a data.table a zpět

Existuje několik typů spojení:

Jaký jazyk zvolit pro práci s daty – R nebo Python? Oba! Migrace z pand na tidyverse a data.table a zpět

V dříve načtené tabulce titánský máme sloupec Sex, který odpovídá kódu pohlaví cestujícího:

1 - samice
2 - mužský

Také jsme vytvořili tabulku - referenční knihu rod. Pro pohodlnější prezentaci údajů o pohlaví cestujících musíme doplnit jméno pohlaví z adresáře rod ke stolu titánský.

Horizontální spojení stolu v R: tidyverse, dplyr

В dplyr Existuje celá řada funkcí pro horizontální spojování:

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

Nejčastěji se v mé praxi používá left_join().

Jako první dva argumenty přebírají funkce uvedené výše ke spojení dvě tabulky a jako třetí argument by musíte zadat sloupce, které se mají spojit.

Horizontální spojení stolu v R: dplyr

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

Horizontální spojení tabulek v R: data.table

В data.table Pomocí této funkce musíte tabulky spojit pomocí klíče merge().

Argumenty pro funkci merge() v data.table

  • x, y — Tabulky pro spojování
  • by — Sloupec, který je klíčem ke spojení, pokud má v obou tabulkách stejný název
  • by.x, by.y — Názvy sloupců, které mají být sloučeny, pokud mají v tabulkách různé názvy
  • all, all.x, all.y — typ spojení, all vrátí všechny řádky z obou tabulek, all.x odpovídá operaci LEFT JOIN (opustí všechny řádky první tabulky), all.y — odpovídá Operace RIGHT JOIN (opustí všechny řádky druhé tabulky).

Horizontální spojení tabulek v R: data.table

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

Horizontální spojení stolů v Pythonu: pandy

Stejně jako v data.tableV pandas funkce se používá ke spojení tabulek merge().

Argumenty funkce merge() v pandách

  • jak — Typ připojení: levé, pravé, vnější, vnitřní
  • on — Sloupec, který je klíčem, pokud má v obou tabulkách stejný název
  • left_on, right_on — Názvy klíčových sloupců, pokud mají v tabulkách různé názvy

Horizontální spojení stolů v Pythonu: pandy

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

Základní funkce okna a počítané sloupce

Funkce oken jsou svým významem podobné agregačním funkcím a často se také používají při analýze dat. Ale na rozdíl od agregačních funkcí nemění funkce okna počet řádků odchozího datového rámce.

Jaký jazyk zvolit pro práci s daty – R nebo Python? Oba! Migrace z pand na tidyverse a data.table a zpět

V podstatě pomocí funkce okna rozdělíme příchozí datový rámec na části podle nějakého kritéria, tzn. podle hodnoty pole nebo několika polí. A na každém okně provádíme aritmetické operace. Výsledek těchto operací se vrátí v každém řádku, tzn. beze změny celkového počtu řádků v tabulce.

Vezměme si například stůl titánský. Můžeme vypočítat, jaké procento byly náklady na každou letenku v rámci příslušné kabinové třídy.

Abychom to mohli udělat, musíme v každém řádku získat celkovou cenu jízdenky pro aktuální kabinovou třídu, do které jízdenka v této řadě patří, a poté vydělit náklady na každou jízdenku celkovou cenou všech jízdenek stejné kabinové třídy. .

Funkce okna v R: tidyverse, dplyr

Chcete-li přidat nové sloupce bez použití seskupování řádků, v dplyr slouží funkci mutate().

Výše popsaný problém můžete vyřešit seskupením dat podle polí Pclass a sečtením pole do nového sloupce Jízdné. Dále zrušte seskupení tabulky a rozdělte hodnoty polí Jízdné k tomu, co se stalo v předchozím kroku.

Funkce okna v R: dplyr

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

Funkce okna v R: data.table

Algoritmus řešení zůstává stejný jako v dplyr, musíme tabulku rozdělit na okna podle polí Pclass. Do nového sloupce zadejte částku pro skupinu odpovídající každému řádku a přidejte sloupec, ve kterém vypočítáme podíl nákladů na každý tiket v jeho skupině.

Chcete-li přidat nové sloupce do data.table přítomný operátor :=. Níže je uveden příklad řešení problému pomocí balíčku data.table

Funkce okna v R: data.table

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

Funkce okna v Pythonu: pandy

Jeden způsob, jak přidat nový sloupec do pandas - použijte funkci assign(). Pro shrnutí ceny jízdenek podle třídy kabiny, bez seskupování řádků, použijeme funkci transform().

Níže je uveden příklad řešení, ve kterém přidáme do tabulky titánský stejné 2 sloupce.

Funkce okna v Pythonu: pandy

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

Srovnávací tabulka funkcí a metod

Níže je uvedena tabulka shody mezi metodami pro provádění různých operací s daty v balíčcích, které jsme uvažovali.

popis
pořádek
datová tabulka
pandy

Načítání dat
vroom()/ readr::read_csv() / readr::read_tsv()
fread()
read_csv()

Vytváření datových rámců
tibble()
data.table()
dict() + from_dict()

Výběr sloupců
select()
argument j, druhá pozice v hranatých závorkách
předáme seznam požadovaných sloupců v hranatých závorkách / drop() / filter() / select_dtypes()

Filtrování řádků
filter()
argument i, první pozice v hranatých závorkách
Podmínky filtrování uvádíme v hranatých závorkách / filter()

Seskupování a agregace
group_by() + summarise()
argumenty j + by
groupby() + agg()

Vertikální sjednocení tabulek (UNION)
bind_rows()
rbind()
concat()

Horizontální spojení tabulek (JOIN)
left_join() / *_join()
merge()
merge()

Základní funkce okna a přidávání počítaných sloupců
group_by() + mutate()
argument j pomocí operátora := + argument by
transform() + assign()

Závěr

Možná jsem v článku popsal ne nejoptimálnější implementace zpracování dat, proto budu rád, když mé chyby v komentářích opravíte, nebo jen doplníte informace uvedené v článku o další techniky práce s daty v R/Pythonu.

Jak jsem psal výše, účelem článku nebylo vnutit svůj názor na to, který jazyk je lepší, ale zjednodušit možnost naučit se oba jazyky, případně mezi nimi migrovat.

Pokud se vám článek líbil, budu rád, když budu mít nové odběratele Youtube и telegram kanály.

Опрос

Které z následujících balíčků používáte při své práci?

Do komentářů můžete napsat důvod vaší volby.

Průzkumu se mohou zúčastnit pouze registrovaní uživatelé. Přihlásit se, prosím.

Který balíček zpracování dat používáte (můžete vybrat několik možností)

  • 45,2%pořádek 19

  • 33,3%data.tabulka14

  • 54,8%pandy23

Hlasovalo 42 uživatelů. 9 uživatelů se zdrželo hlasování.

Zdroj: www.habr.com

Přidat komentář