Jaki język wybrać do pracy z danymi – R czy Python? Obydwa! Migracja z pand do tidyverse i data.table i z powrotem

Jeśli poszukasz R lub Pythona w Internecie, znajdziesz miliony artykułów i kilometrowe dyskusje na temat tego, który z nich jest lepszy, szybszy i wygodniejszy do pracy z danymi. Ale niestety wszystkie te artykuły i spory nie przynoszą żadnych szczególnych korzyści.

Jaki język wybrać do pracy z danymi – R czy Python? Obydwa! Migracja z pand do tidyverse i data.table i z powrotem

Celem tego artykułu jest porównanie głównych technik przetwarzania danych w najpopularniejszych pakietach obu języków. I pomoc czytelnikom w jak najszybszym opanowaniu tej, której jeszcze nie znają. Dla tych, którzy piszą w Pythonie, aby nauczyć się, jak robić to samo w R i odwrotnie.

W tym artykule przeanalizujemy składnię najpopularniejszych pakietów w R. Są to pakiety zawarte w bibliotece tidyverseoraz pakiet data.table. Porównajmy ich składnię z pandas, najpopularniejszy pakiet do analizy danych w Pythonie.

Przedstawimy krok po kroku cały proces analizy danych, od ich załadowania po wykonywanie funkcji analitycznych i okienkowych przy użyciu języków Python i R.

Zawartość

Niniejszy artykuł można wykorzystać jako ściągę, jeśli zapomniałeś, jak wykonać jakąś operację przetwarzania danych w którymś z omawianych pakietów.

Jaki język wybrać do pracy z danymi – R czy Python? Obydwa! Migracja z pand do tidyverse i data.table i z powrotem

  1. Kluczowe różnice składniowe w R i Pythonie
    1.1. Dostęp do funkcji pakietu
    1.2. Zadanie
    1.3. Indeksowanie
    1.4. Metody i OOP
    1.5. Rurociągi
    1.6. Struktury danych
  2. Kilka słów o pakietach, których będziemy używać
    2.1. schludny świat
    2.2. Tabela danych
    2.3. pandy
  3. Instalowanie pakietów
  4. Ładowanie danych
  5. Tworzenie ramek danych
  6. Wybór żądanych kolumn
  7. Filtrowanie wierszy
  8. Grupowanie i agregacja
  9. Łączenie tabel w pionie (UNION)
  10. Poziome łączenie tabel (JOIN)
  11. Podstawowe funkcje okna i kolumny obliczeniowe
  12. Tabela korespondencji pomiędzy metodami przetwarzania danych w R i Pythonie
  13. wniosek
  14. Krótka ankieta dotycząca pakietu, z którego korzystasz

Jeśli interesuje Cię analiza danych, możesz znaleźć moje telegram и youtube kanały. Większość treści jest poświęcona językowi R.

Kluczowe różnice składniowe w R i Pythonie

Aby ułatwić Ci przejście z Pythona na R i odwrotnie, przedstawiamy kilka kluczowych kwestii, na które warto zwrócić uwagę.

Dostęp do funkcji pakietu

Po załadowaniu pakietu do R nie musisz określać nazwy pakietu, aby uzyskać dostęp do jego funkcji. W większości przypadków w R tak nie jest, ale jest to dopuszczalne. Nie musisz w ogóle importować pakietu, jeśli potrzebujesz jednej z jego funkcji w swoim kodzie, i po prostu wywołaj go, podając nazwę pakietu i nazwę funkcji. Separatorem między nazwą pakietu a funkcją w R jest podwójny dwukropek. package_name::function_name().

W Pythonie natomiast klasycznie uważa się wywoływanie funkcji pakietu przez jawne określenie jego nazwy. Podczas ładowania pakietu z reguły przypisywana jest mu skrócona nazwa, na przykład dla pandas zwykle używa się pseudonimu pdDo funkcji pakietu można uzyskać dostęp za pomocą kropki package_name.function_name().

Zadanie

W języku R do przypisywania wartości obiektowi często stosuje się strzałki. obj_name <- valueChoć pojedynczy znak równości jest również dozwolony, w R jest on używany przede wszystkim do przekazywania wartości do argumentów funkcji.

W Pythonie przypisanie odbywa się wyłącznie za pomocą pojedynczego znaku równości. obj_name = value.

Indeksowanie

Istnieją również pewne istotne różnice. W R indeksowanie zaczyna się od jednego i obejmuje wszystkie określone elementy w wynikowym zakresie,

w Pythonie indeksowanie zaczyna się od zera, a wybrany zakres nie obejmuje ostatniego elementu określonego w indeksowaniu. Tak więc konstrukcja x[i:j] w Pythonie nie będzie zawierać elementu j.

Istnieją również różnice w indeksowaniu ujemnym, w R notacja x[-1] zwróci wszystkie elementy wektora z wyjątkiem ostatniego. W Pythonie ta sama notacja zwróci tylko ostatni element.

Metody i OOP

R ma własną implementację OOP, pisałem o tym w artykule „OOP w R (część 1): klasy S3”. Ogólnie rzecz biorąc, R jest językiem funkcyjnym i wszystko w nim jest zbudowane na funkcjach. Dlatego na przykład użytkownicy programu Excel powinni przełączyć się na tydiverse będzie łatwiej niż na pandasChoć może to być moja subiektywna opinia.

Krótko mówiąc, obiekty w R nie mają metod (jeśli mówimy o klasach S3, ale istnieją inne implementacje OOP, które są znacznie mniej powszechne). Są tylko uogólnione funkcje, które przetwarzają je inaczej w zależności od klasy obiektu.

Rurociągi

Być może to jest nazwa dla pandas Nie będzie to do końca poprawne, ale spróbuję wyjaśnić znaczenie.

Aby nie zapisywać pośrednich obliczeń i nie mnożyć niepotrzebnych obiektów w środowisku pracy, można użyć pewnego rodzaju przenośnika. To znaczy przekazać wynik obliczeń z jednej funkcji do następnej i nie zapisywać pośrednich wyników.

Rozważmy następujący przykład kodu, w którym przechowujemy obliczenia pośrednie w oddzielnych obiektach:

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

Wykonaliśmy 3 operacje w kolejności i zapisaliśmy wynik każdej z nich w oddzielnym obiekcie. Ale w rzeczywistości nie potrzebujemy tych obiektów pośrednich.

Albo jeszcze gorzej, ale bardziej znane użytkownikom programu Excel.

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

W tym przypadku nie zapisaliśmy pośrednich wyników obliczeń, ale czytanie kodu zawierającego funkcje zagnieżdżone jedna w drugiej jest wyjątkowo niewygodne.

Przyjrzymy się kilku podejściom do przetwarzania danych w języku R, które wykonują podobne operacje w różny sposób.

Rurociągi w bibliotece tidyverse są wdrażane przez operatora %>%.

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

Tak więc bierzemy wynik pracy func1() i przekaż go jako pierwszy argument do func2(), następnie przekazujemy wynik tego obliczenia jako pierwszy argument func3(). Na koniec zapisujemy wszystkie wykonane obliczenia w obiekcie obj <-.

Ten mem ilustruje wszystko, co opisano powyżej, lepiej niż słowa:
Jaki język wybrać do pracy z danymi – R czy Python? Obydwa! Migracja z pand do tidyverse i data.table i z powrotem

В data.table Łańcuchy są używane w podobny sposób.

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

W każdym z kwadratowych nawiasów możesz umieścić wynik poprzedniej operacji.

В pandas Operacje takie są oddzielone kropką.

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

To znaczy, że bierzemy nasz stół df i używamy jej metody fun1(), następnie stosujemy metodę do uzyskanego wyniku fun2()po fun3(). Uzyskany wynik zapisujemy w obiekcie Obj .

Struktury danych

Struktury danych w językach R i Python są podobne, ale mają różne nazwy.

Opis
Tytuł w R
Nazwa w Pythonie / pandas

Struktura tabeli
data.frame, data.table, tibble
Ramka danych

Jednowymiarowa lista wartości
Wektor
Seria w Pandas lub lista w czystym Pythonie

Wielopoziomowa struktura nietabelaryczna
Lista
Słownik (dict)

Poniżej przyjrzymy się innym funkcjom i różnicom w składni.

Kilka słów o pakietach, których będziemy używać

Na początek opowiem Ci trochę o pakietach, które poznasz w tym artykule.

schludny świat

Oficjalna strona: tidyverse.org
Jaki język wybrać do pracy z danymi – R czy Python? Obydwa! Migracja z pand do tidyverse i data.table i z powrotem
biblioteka tidyverse napisany przez Hadley Wickham, starszego badacza w RStudio. tidyverse składa się z imponującego zestawu pakietów, które upraszczają przetwarzanie danych, z których 5 znajduje się w pierwszej dziesiątce najczęściej pobieranych z repozytorium CRAN.

Rdzeń biblioteki stanowią następujące pakiety: ggplot2, dplyr, tidyr, readr, purrr, tibble, stringr, forcats. Każdy z tych pakietów ma na celu rozwiązanie konkretnego problemu. Na przykład dplyr zaprojektowany do manipulacji danymi, tidyr aby przedstawić dane w przejrzystej formie, stringr ułatwia pracę z ciągami znaków i ggplot2 jest jednym z najpopularniejszych narzędzi do wizualizacji danych.

Korzyść tidyverse jest prostota i czytelność składni, która pod wieloma względami przypomina język zapytań SQL.

Tabela danych

Jaki język wybrać do pracy z danymi – R czy Python? Obydwa! Migracja z pand do tidyverse i data.table i z powrotemOficjalna strona: r-datatable.com

Przez data.table jest Matt Dole z H2O.ai.

Pierwsze wydanie biblioteki miało miejsce w 2006 roku.

Składnia pakietu nie jest tak wygodna jak w tidyverse i bardziej przypomina klasyczne ramki danych w R, ale jednocześnie znacznie rozszerzyła swoją funkcjonalność.

Wszystkie manipulacje tabelą w tym pakiecie są opisane w nawiasach kwadratowych, a jeśli przetłumaczysz składnię data.table w SQL otrzymasz coś takiego: data.table[ WHERE, SELECT, GROUP BY ]

Mocną stroną tego pakietu jest szybkość przetwarzania dużych ilości danych.

pandy

Oficjalna strona: pandas.pydata.org Jaki język wybrać do pracy z danymi – R czy Python? Obydwa! Migracja z pand do tidyverse i data.table i z powrotem

Nazwa biblioteki pochodzi od ekonometrycznego terminu „dane panelowe”, stosowanego do opisu wielowymiarowych, ustrukturyzowanych zbiorów informacji.

Przez pandas jest Amerykaninem Wesem McKinneyem.

Jeśli chodzi o analizę danych w Pythonie, równe pandas Nie. Bardzo wielofunkcyjny pakiet wysokiego poziomu, który umożliwia wykonywanie dowolnych operacji na danych, od ładowania danych z dowolnego źródła po ich wizualizację.

Instalowanie dodatkowych pakietów

Pakiety omówione w tym artykule nie są zawarte w podstawowych dystrybucjach R i Python. Istnieje jednak małe zastrzeżenie: jeśli zainstalowałeś dystrybucję Anaconda, będziesz musiał zainstalować dodatkowo pandas nie wymagane.

Instalowanie pakietów w R

Jeśli kiedykolwiek otwierałeś środowisko programistyczne RStudio, prawdopodobnie wiesz już, jak zainstalować wymagany pakiet w R. Aby zainstalować pakiety, użyj standardowego polecenia install.packages() uruchamiając go bezpośrednio w R.

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

Po instalacji pakiety należy połączyć, do czego w większości przypadków służy polecenie library().

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

Instalowanie pakietów w Pythonie

Jeśli więc masz zainstalowany czysty Python, to pandas musisz zainstalować go ręcznie. Otwórz wiersz poleceń lub terminal, w zależności od systemu operacyjnego i wprowadź następujące polecenie.

pip install pandas

Następnie wracamy do Pythona i importujemy zainstalowany pakiet za pomocą polecenia import.

import pandas as pd

Ładowanie danych

Eksploracja danych jest jednym z najważniejszych etapów analizy danych. Zarówno Python, jak i R zapewniają szerokie możliwości uzyskiwania danych z dowolnego źródła: plików lokalnych, plików z Internetu, stron internetowych, wszelkiego rodzaju baz danych.

Jaki język wybrać do pracy z danymi – R czy Python? Obydwa! Migracja z pand do tidyverse i data.table i z powrotem

W tym artykule będziemy korzystać z kilku zestawów danych:

  1. Dwa pobrania z Google Analytics.
  2. Zbiór danych o pasażerach Titanica.

Wszystkie dane są u mnie GitHub w formie plików csv i tsv. Skąd będziemy je prosić.

Ładowanie danych do R: tidyverse, vroom, readr

Aby załadować dane do biblioteki tidyverse Przeznaczone są dwa pakiety: vroom, readr. vroom nowocześniejsze, ale w przyszłości pakiety te mogą być łączone.

Cytat z oficjalna dokumentacja vroom.

vroom kontra czytelnik
Czym jest wydanie vroom znaczy dla readr? Na razie planujemy pozwolić dwóm pakietom rozwijać się oddzielnie, ale prawdopodobnie połączymy je w przyszłości. Jedną z wad leniwego odczytu vroom jest to, że pewnych problemów z danymi nie można zgłaszać z góry, więc najlepszy sposób ich ujednolicenia wymaga przemyślenia.

vroom kontra readr
Co oznacza „uwolnienie”? vroom dla readr? W tej chwili planujemy rozwijać oba pakiety osobno, ale prawdopodobnie połączymy je w przyszłości. Jedną z wad leniwego czytania jest vroom polega na tym, że niektórych problemów dotyczących danych nie da się zakomunikować z wyprzedzeniem, dlatego trzeba się zastanowić, jak najlepiej je połączyć.

W tym artykule przyjrzymy się obu pakietom służącym do ładowania danych:

Ładowanie danych do R: Pakiet 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")

Ładowanie danych do R: readr

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

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

W pakiecie vroomniezależnie od formatu danych csv/tsv ładowanie odbywa się za pomocą funkcji o tej samej nazwie vroom(), w opakowaniu readr Dla każdego formatu używamy innej funkcji read_tsv() и read_csv().

Ładowanie danych do R: data.table

В data.table jest funkcja ładowania danych fread().

Ładowanie danych do R: pakiet 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")

Ładowanie danych do Pythona: pandas

Jeśli porównamy go z pakietami R, to w tym przypadku składnia jest najbliższa pandas wola readr, dlatego pandas można żądać danych z dowolnego miejsca, a w tym pakiecie znajduje się cała rodzina funkcji read_*().

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

I wiele innych funkcji zaprojektowanych do odczytu danych z różnych formatów. Ale dla naszych celów to wystarczy read_table() lub read_csv() używając argumentu września aby określić separator kolumn.

Ładowanie danych do Pythona: 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")

Tworzenie ramek danych

Stół tytaniczny, który załadowaliśmy, jest pole Seks, w którym przechowywany jest identyfikator płci pasażera.

Jednak dla wygodniejszej prezentacji danych według płci pasażerów nie należy stosować kodu płci, lecz imię.

Aby to zrobić, utworzymy małą książeczkę informacyjną, tabelę, w której będą tylko 2 kolumny (kod i nazwa płci) i 2 wiersze.

Tworzenie ramki danych w R: tidyverse, dplyr

W poniższym przykładzie kodu tworzymy żądaną ramkę danych za pomocą funkcji tibble() .

Tworzenie DataFrame w R: dplyr

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

Tworzenie ramki danych w R: data.table

Tworzenie ramki danych w R: data.table

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

Tworzenie DataFrame w Pythonie: pandas

В pandas Tworzenie ramek odbywa się w kilku etapach. Najpierw tworzymy słownik, a następnie przekształcamy słownik w ramkę danych.

Tworzenie DataFrame w Pythonie: pandas

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

Wybieranie kolumn

Tabele, z którymi pracujesz, mogą zawierać dziesiątki, a nawet setki kolumn danych. Jednak do wykonania analizy, z reguły, nie potrzebujesz wszystkich kolumn, które są dostępne w tabeli źródłowej.

Jaki język wybrać do pracy z danymi – R czy Python? Obydwa! Migracja z pand do tidyverse i data.table i z powrotem

Dlatego jedną z pierwszych operacji, jaką wykonasz na oryginalnej tabeli, będzie usunięcie z niej niepotrzebnych informacji i zwolnienie zajmowanej przez nie pamięci.

Wybieranie kolumn w R: tidyverse, dplyr

składnia dplyr Jest on bardzo podobny do języka zapytań SQL. Jeśli się z nim zapoznasz, szybko opanujesz obsługę tego pakietu.

Funkcja służy do wybierania kolumn. select().

Poniżej znajdują się przykłady kodu, które pozwolą Ci wybrać kolumny w następujący sposób:

  • Po wylistowaniu nazw wymaganych kolumn
  • Uzyskaj dostęp do nazw kolumn za pomocą wyrażeń regularnych
  • Według typu danych lub dowolnej innej właściwości danych zawartych w kolumnie

Wybieranie kolumn w 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)

Wybieranie kolumn w R: data.table

Te same operacje w data.table są wykonywane nieco inaczej, na początku artykułu opisałem, jakie argumenty znajdują się w nawiasach kwadratowych data.table.

DT[i,j,by]

Gdzie:
i — gdzie, czyli filtrowanie według wierszy
j — select|update|do, czyli wybieranie kolumn i ich transformacja
przez — grupowanie danych

Wybieranie kolumn w 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$")]

Zmienna .SD umożliwia dostęp do wszystkich kolumn i .SDcols filtruj potrzebne kolumny za pomocą wyrażeń regularnych lub innych funkcji, aby filtrować nazwy potrzebnych kolumn.

Wybieranie kolumn w Pythonie, pandas

Aby wybrać kolumny według nazwy w pandas wystarczy przekazać listę ich nazw. A żeby wybrać lub wykluczyć kolumny według nazwy za pomocą wyrażeń regularnych, trzeba użyć funkcji drop() и filter()i argument oś=1, za pomocą którego określasz, że chcesz przetwarzać kolumny, a nie wiersze.

Aby wybrać pole według typu danych, użyj funkcji select_dtypes()i w argumentach zawierać lub wykluczać Przekaż listę typów danych odpowiadających polom, które chcesz wybrać.

Wybieranie kolumn w Pythonie: pandas

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

Filtrowanie wierszy

Na przykład tabela źródłowa może zawierać dane z kilku lat, ale Ty musisz analizować tylko ostatni miesiąc. Ponownie, dodatkowe wiersze spowolnią przetwarzanie danych i zapchają pamięć Twojego komputera.

Jaki język wybrać do pracy z danymi – R czy Python? Obydwa! Migracja z pand do tidyverse i data.table i z powrotem

Filtrowanie wierszy w R: tydyverse, dplyr

В dplyr do filtrowania wierszy używana jest funkcja filter(). Przyjmuje ramkę danych jako pierwszy argument, a następnie wypisuje warunki filtru.

Podczas pisania wyrażeń logicznych filtrujących tabelę w tym przypadku należy określić nazwy kolumn bez cudzysłowów i bez deklarowania nazwy tabeli.

Stosując wiele wyrażeń logicznych do filtrowania, użyj następujących operatorów:

  • & lub przecinek - logiczne AND
  • | — logiczne LUB

Filtrowanie wierszy w R: dplyr

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

Filtrowanie wierszy w R: data.table

Jak napisałem powyżej, data.table Składnia transformacji danych jest ujęta w nawiasy kwadratowe.

DT[i,j,by]

Gdzie:
i — gdzie, czyli filtrowanie według wierszy
j — select|update|do, czyli wybieranie kolumn i ich transformacja
przez — grupowanie danych

Argument służy do filtrowania wierszy. i, którego pierwsza pozycja znajduje się w nawiasach kwadratowych.

Do kolumn odwołujemy się za pomocą wyrażeń logicznych bez cudzysłowów ani nazwy tabeli.

Wyrażenia logiczne są ze sobą powiązane w taki sam sposób jak w dplyr za pomocą operatorów & i |.

Filtrowanie wierszy w R: data.table

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

Filtrowanie ciągów w Pythonie: pandas

Filtruj według wierszy w pandas podobnie jak filtracja w data.tablei jest podawany w nawiasach kwadratowych.

W tym przypadku dostęp do kolumn odbywa się z obowiązkowym podaniem nazwy ramki danych; ponadto nazwę kolumny można podać również w cudzysłowie w nawiasach kwadratowych (przykład df['col_name']) lub bez cudzysłowu po kropce (przykład df.col_name).

Jeśli chcesz filtrować ramkę danych według kilku warunków, każdy z warunków musi być ujęty w nawiasy. Warunki logiczne są łączone ze sobą za pomocą operatorów & и |.

Filtrowanie ciągów w Pythonie: pandas

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

Grupowanie i agregowanie danych

Jedną z najczęściej stosowanych operacji w analizie danych jest grupowanie i agregacja.

Jaki język wybrać do pracy z danymi – R czy Python? Obydwa! Migracja z pand do tidyverse i data.table i z powrotem

Składnia wykonywania tych operacji różni się w zależności od pakietu, który omawialiśmy.

W tym przypadku weźmiemy za przykład ramkę danych. tytanicznyi obliczymy liczbę oraz średni koszt biletów w zależności od klasy kabiny.

Grupowanie i agregowanie danych w R: tidyverse, dplyr

В dplyr funkcja służy do grupowania group_by()i do agregacji summarise(). W rzeczywistości, dplyr istnieje cała rodzina funkcji summarise_*(), ale celem tego artykułu jest porównanie podstawowej składni, więc nie będziemy zagłębiać się w takie szczegóły.

Główne funkcje agregujące:

  • sum() — podsumowanie
  • min() / max() — wartość minimalna i maksymalna
  • mean() — średnia arytmetyczna
  • median() — mediana
  • length() - ilość

Grupowanie i agregacja w R: dplyr

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

W funkcji group_by() jako pierwszy argument przekazaliśmy tabelę tytanicznyi następnie wskazał pole Klasa P, według którego pogrupujemy naszą tabelę. Wynik tej operacji przy użyciu operatora %>% przekazany jako pierwszy argument do funkcji summarise()i dodałem 2 kolejne pola: pasażerowie и średnia_cena. W pierwszym przypadku, korzystając z funkcji length() obliczyłem liczbę biletów, a w drugim przypadku korzystając z funkcji mean() otrzymał średnią cenę biletu.

Grupowanie i agregowanie danych w R: data.table

В data.table argument jest używany do agregacji j który ma drugą pozycję w nawiasach kwadratowych i do grupowania by lub keyby, które zajmują trzecią pozycję.

Lista funkcji agregujących w tym przypadku jest identyczna z tą opisaną w dplyr, ponieważ są to funkcje z podstawowej składni języka R.

Grupowanie i agregacja w R: data.table

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

Grupowanie i agregowanie danych w Pythonie: pandas

Grupowanie w pandas podobny do dplyrale agregacja nie jest podobna do niczego dplyr zupełnie nie data.table.

Do grupowania należy użyć metody groupby(), do którego należy przekazać listę kolumn, według których będzie grupowana ramka danych.

Do agregacji można użyć metody agg(), który przyjmuje słownik. Klucze słownika to kolumny, do których zastosujesz funkcje agregujące, a wartości to nazwy funkcji agregujących.

Funkcje agregujące:

  • sum() — podsumowanie
  • min() / max() — wartość minimalna i maksymalna
  • mean() — średnia arytmetyczna
  • median() — mediana
  • count() - ilość

Funkcja reset_index() w poniższym przykładzie użyto go do zresetowania zagnieżdżonych indeksów, które pandas domyślnie jest ustawiane po agregacji danych.

Symbol pozwala przejść do następnego wiersza.

Grupowanie i agregacja w Pythonie: pandas

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

Połączenie pionowe tabeli

Operacja, w której łączysz dwie lub więcej tabel o tej samej strukturze. Dane, które załadowaliśmy, zawierają tabele ga_now и ga_decTabele te mają identyczną strukturę, tzn. zawierają te same kolumny i te same typy danych w tych kolumnach.

Jaki język wybrać do pracy z danymi – R czy Python? Obydwa! Migracja z pand do tidyverse i data.table i z powrotem

Jest to usunięcie danych z Google Analytics za listopad i grudzień. W tej sekcji połączymy te dane w jedną tabelę.

Pionowe łączenie tabel w R: tidyverse, dplyr

В dplyr Możesz połączyć dwie tabele w jedną za pomocą funkcji bind_rows(), przekazując tabele jako argumenty.

Filtrowanie wierszy w R: dplyr

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

Łączenie pionowe tabel w R: data.table

To też nic skomplikowanego, używamy tego rbind().

Filtrowanie wierszy w R: data.table

## data.table
rbind(ga_nov, ga_dec)

Pionowe łączenie tabel w Pythonie: pandas

В pandas aby połączyć tabele użyj funkcji concat(), do którego należy przekazać listę ramek w celu ich połączenia.

Filtrowanie ciągów w Pythonie: pandas

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

Poziome łączenie tabel

Operacja, w której kolumny z drugiej tabeli są dodawane do pierwszej tabeli według klucza. Często używane podczas wzbogacania tabeli faktów (na przykład tabeli z danymi sprzedaży) o pewne dane referencyjne (na przykład koszt towarów).

Jaki język wybrać do pracy z danymi – R czy Python? Obydwa! Migracja z pand do tidyverse i data.table i z powrotem

Istnieją różne rodzaje unifikacji:

Jaki język wybrać do pracy z danymi – R czy Python? Obydwa! Migracja z pand do tidyverse i data.table i z powrotem

W poprzednio załadowanej tabeli tytaniczny mamy kolumnę Seks, który odpowiada kodowi płci pasażera:

1 - samica
2 - mężczyzna

Stworzyliśmy również tabelę – książkę referencyjną płeć. Dla wygodniejszej prezentacji danych o płci pasażerów należy dodać nazwę płci z katalogu płeć na stół tytaniczny.

Poziome łączenie tabel w R: tidyverse, dplyr

В dplyr Istnieje cała rodzina funkcji do unifikacji poziomej:

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

W mojej praktyce najczęściej stosowanym jest left_join().

Funkcje wymienione powyżej przyjmują jako pierwsze dwa argumenty połączenie dwóch tabel, a jako trzeci argument: by Należy określić kolumny, które mają zostać połączone.

Poziome łączenie tabel w R: dplyr

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

Łączenie poziome tabel w R: data.table

В data.table musisz połączyć tabele według klucza za pomocą funkcji merge().

Argumenty funkcji merge() w tabeli data.table

  • x, y — Tabele do unifikacji
  • przez — Kolumna, która jest kluczem do połączenia, jeśli ma taką samą nazwę w obu tabelach
  • by.x, by.y — Nazwy kolumn do połączenia, jeśli mają różne nazwy w tabelach
  • all, all.x, all.y — typ połączenia, all zwróci wszystkie wiersze z obu tabel, all.x odpowiada operacji LEFT JOIN (pozostawia wszystkie wiersze pierwszej tabeli), all.y — odpowiada operacji RIGHT JOIN (pozostawia wszystkie wiersze drugiej tabeli).

Łączenie poziome tabel w R: data.table

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

Poziome łączenie tabel w Pythonie: pandas

Tak samo jak w data.tablew pandas do łączenia tabel używana jest funkcja merge().

Argumenty funkcji merge() w pandas

  • jak — Typ połączenia: lewe, prawe, zewnętrzne, wewnętrzne
  • on — Kolumna, która jest kluczem, jeśli ma taką samą nazwę w obu tabelach
  • left_on, right_on — Nazwy kolumn kluczowych, jeśli mają różne nazwy w tabelach

Poziome łączenie tabel w Pythonie: pandas

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

Podstawowe funkcje okna i kolumny obliczeniowe

Funkcje okna mają podobne znaczenie do funkcji agregacji i są również często używane w analizie danych. Jednak w przeciwieństwie do funkcji agregacji, funkcje okna nie zmieniają liczby wierszy w ramce danych wyjściowych.

Jaki język wybrać do pracy z danymi – R czy Python? Obydwa! Migracja z pand do tidyverse i data.table i z powrotem

W istocie, używając funkcji okna, dzielimy przychodzącą ramkę danych na części według pewnej cechy, tj. według wartości pola lub kilku pól. I wykonujemy operacje arytmetyczne na każdym oknie. Wynik tych operacji zostanie zwrócony do każdego wiersza, tj. bez zmiany całkowitej liczby wierszy w tabeli.

Weźmy jako przykład tabelę tytanicznyMożemy obliczyć, jaki procent ceny każdego biletu przypada na daną klasę kabiny.

Aby to zrobić, musimy uzyskać całkowity koszt biletu dla każdej linii, dla bieżącej klasy kabiny, do której należy bilet w tej linii, a następnie podzielić koszt każdego biletu przez całkowity koszt wszystkich biletów dla tej samej klasy kabiny.

Funkcje okienne w R: tidyverse, dplyr

Aby dodać nowe kolumny bez użycia grupowania wierszy, w dplyr pełni funkcję mutate().

Opisany powyżej problem można rozwiązać poprzez grupowanie danych według pola Klasa P i podsumowując pole w nowej kolumnie OpłataNastępnie rozgrupowujemy tabelę i dzielimy wartości pól Opłata o tym, co wydarzyło się w poprzednim kroku.

Funkcje okienne w R: dplyr

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

Funkcje okna w R: data.table

Algorytm rozwiązania pozostaje taki sam jak w dplyr, musimy podzielić tabelę na okna według pola Klasa P. Wyświetl w nowej kolumnie sumę dla grupy odpowiadającej każdemu wierszowi i dodaj kolumnę, w której obliczymy udział kosztu każdego biletu w jego grupie.

Aby dodać nowe kolumny do data.table obecny operator :=Poniżej znajduje się przykład rozwiązania problemu przy użyciu pakietu data.table

Funkcje okna w R: data.table

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

Funkcje okienne w Pythonie: pandas

Jednym ze sposobów dodania nowej kolumny w pandas — użyj funkcji assign()Aby podsumować koszt biletów według klasy kabiny, bez grupowania wierszy, użyjemy funkcji transform().

Poniżej znajduje się przykład rozwiązania, w którym dodajemy do tabeli tytaniczny te same 2 kolumny.

Funkcje okienne w Pythonie: pandas

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

Tabela korespondencji pomiędzy funkcjami i metodami

Poniżej znajduje się tabela korespondencji metod wykonywania różnych operacji na danych w rozpatrywanych przez nas pakietach.

Opis
schludny świat
Tabela danych
pandy

Ładowanie danych
vroom()/ readr::read_csv() / readr::read_tsv()
fread()
read_csv()

Tworzenie ramek danych
tibble()
data.table()
dict() + from_dict()

Wybieranie kolumn
select()
argument j, druga pozycja w nawiasach kwadratowych
przekazujemy listę wymaganych kolumn w nawiasach kwadratowych / drop() / filter() / select_dtypes()

Filtrowanie wierszy
filter()
argument i, pierwsza pozycja w nawiasach kwadratowych
w nawiasach kwadratowych podajemy warunki filtrowania / filter()

Grupowanie i agregacja
group_by() + summarise()
argumenty j + by
groupby() + agg()

Łączenie tabel w pionie (UNION)
bind_rows()
rbind()
concat()

Poziome łączenie tabel (JOIN)
left_join() / *_join()
merge()
merge()

Podstawowe funkcje okna i dodawanie kolumn obliczeniowych
group_by() + mutate()
argument j używając operatora := + argument by
transform() + assign()

wniosek

Być może w artykule opisałem nienajlepsze implementacje przetwarzania danych, dlatego będę rad, jeśli poprawicie moje błędy w komentarzach, lub po prostu uzupełnicie informacje zawarte w artykule o inne metody pracy z danymi w R/Python.

Jak napisałem powyżej, celem artykułu nie było narzucenie mojego zdania na temat tego, który język jest lepszy, ale ułatwienie nauki obu języków lub, w razie potrzeby, migrowania między nimi.

Jeżeli artykuł Ci się spodobał, będę rad pozyskać nowych subskrybentów mojego bloga. youtube и telegram kanały.

Wywiad

Z którego z wymienionych pakietów korzystasz w swojej pracy?

W komentarzach możesz napisać powód swojego wyboru.

W ankiecie mogą brać udział tylko zarejestrowani użytkownicy. Zaloguj się, Proszę.

Z jakiego pakietu przetwarzania danych korzystasz (możesz wybrać wiele opcji)

  • 45,2%schludnywers19

  • 33,3%dane.tabela14

  • 54,8%pandas23

Głosowało 42 użytkowników. 9 użytkowników wstrzymało się od głosu.

Źródło: www.habr.com

Kup niezawodny hosting dla stron z ochroną DDoS, serwery VPS VDS 🔥 Kup niezawodny hosting stron internetowych z ochroną DDoS, serwery VPS VDS | ProHoster