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

Wyszukując w Internecie R lub Python, znajdziesz miliony artykułów i kilometry dyskusji na temat tego, który z nich jest lepszy, szybszy i wygodniejszy w pracy z danymi. Ale niestety wszystkie te artykuły i spory nie są szczególnie przydatne.

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

Celem artykułu jest porównanie podstawowych technik przetwarzania danych w najpopularniejszych pakietach obu języków. I pomóż czytelnikom szybko opanować coś, czego jeszcze nie wiedzą. Ci, którzy piszą w Pythonie, dowiedzą się, jak zrobić to samo w R i odwrotnie.

W artykule przeanalizujemy składnię najpopularniejszych pakietów w R. Są to pakiety zawarte w bibliotece tidyversea także pakiet data.table. I porównaj ich składnię z pandas, najpopularniejszy pakiet do analizy danych w Pythonie.

Przejdziemy krok po kroku całą ścieżkę analizy danych od ich załadowania do wykonania analitycznych funkcji okna z wykorzystaniem Pythona i R.

Zawartość

Ten artykuł może służyć jako ściągawka, jeśli zapomniałeś, jak wykonać jakąś operację przetwarzania danych w jednym z rozważanych 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. Główne różnice w składni między R i Pythonem
    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 z jakich będziemy korzystać
    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 potrzebnych kolumn
  7. Filtrowanie wierszy
  8. Grupowanie i agregacja
  9. Połączenie pionowe tabel (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 na temat tego, z jakiego pakietu korzystasz

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

Główne różnice w składni między R i Pythonem

Aby ułatwić Ci przejście z Pythona na R lub odwrotnie, podam kilka głównych punktów, na które musisz zwrócić uwagę.

Dostęp do funkcji pakietu

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

W Pythonie natomiast za klasyczne uważa się wywoływanie funkcji pakietu poprzez jawne określenie jego nazwy. Po pobraniu pakietu zazwyczaj nadawana jest skrócona nazwa, np.: pandas zwykle używany jest pseudonim pd. Dostęp do funkcji pakietu uzyskuje się poprzez kropkę package_name.function_name().

Zadanie

W R często używa się strzałek do przypisania wartości do obiektu. obj_name <- value, chociaż dozwolony jest pojedynczy znak równości, pojedynczy znak równości w R służy 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

Tutaj także są dość istotne różnice. W R indeksowanie rozpoczyna się od jednego i obejmuje wszystkie określone elementy w wynikowym zakresie,

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

Istnieją również różnice w indeksowaniu ujemnym w notacji R x[-1] zwróci wszystkie elementy wektora oprócz ostatniego. W Pythonie podobny zapis zwróci tylko ostatni element.

Metody i OOP

R implementuje OOP na swój sposób, pisałem o tym w artykule „OOP w języku R (część 1): Zajęcia S3”. Ogólnie rzecz biorąc, R jest językiem funkcjonalnym i wszystko w nim jest zbudowane na funkcjach. Dlatego na przykład dla użytkowników programu Excel przejdź do tydiverse będzie łatwiej niż pandas. Chociaż 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). Istnieją tylko uogólnione funkcje, które przetwarzają je w różny sposób w zależności od klasy obiektu.

Rurociągi

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

Aby nie zapisywać obliczeń pośrednich i nie wytwarzać niepotrzebnych obiektów w środowisku pracy, można zastosować swego rodzaju potok. Te. przekazywać wynik obliczeń z jednej funkcji do drugiej i nie zapisywać wyników pośrednich.

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

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

Wykonaliśmy kolejno 3 operacje, a wynik każdej z nich został zapisany w osobnym obiekcie. Ale tak naprawdę nie potrzebujemy tych obiektów pośrednich.

Albo jeszcze gorzej, ale bardziej znane użytkownikom Excela.

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

W tym przypadku nie zapisaliśmy wyników obliczeń pośrednich, ale czytanie kodu z funkcjami zagnieżdżonymi jest wyjątkowo niewygodne.

Przyjrzymy się kilku podejśćom do przetwarzania danych w R i wykonują one podobne operacje na różne sposoby.

Rurociągi w bibliotece tidyverse realizowane przez operatora %>%.

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

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

Wszystko to ilustruje lepiej niż słowa ten mem:
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 nawiasów kwadratowych możesz wykorzystać wynik poprzedniej operacji.

В pandas takie operacje oddziela się kropką.

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

Te. zajmujemy nasz stolik df i zastosuj jej metodę fun1(), następnie stosujemy metodę do otrzymanego wyniku fun2()po fun3(). Wynikowy wynik jest zapisywany w obiekcie Obj .

Struktury danych

Struktury danych w R i Pythonie są podobne, ale mają różne nazwy.

Opis
Imię w R
Imię w Pythonie/pandach

Struktura tabeli
ramka danych, tabela danych, tibble
Ramka danych

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

Wielopoziomowa struktura nietabelaryczna
Lista
Słownik (dykt)

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

Kilka słów o pakietach z jakich będziemy korzystać

Na początek opowiem Wam trochę o pakietach, z którymi zapoznacie się 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 Hedleya Wickhama, starszego naukowca w RStudio. tidyverse składa się z imponującego zestawu pakietów upraszczających przetwarzanie danych, z których 5 znajduje się w pierwszej dziesiątce pobrań z repozytorium CRAN.

Trzon 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 stworzony do manipulacji danymi, tidyr doprowadzić dane do zgrabnej formy, stringr upraszcza pracę z ciągami znaków i ggplot2 to jedno z najpopularniejszych narzędzi do wizualizacji danych.

Przewaga tidyverse to 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 to 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 rozszerzono funkcjonalność.

Wszystkie manipulacje z tabelą w tym pakiecie są opisane w nawiasach kwadratowych i 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żej 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”, używanego do opisu wielowymiarowo ustrukturyzowanych zbiorów informacji.

Przez pandas jest Amerykanin Wes McKinney.

Jeśli chodzi o analizę danych w Pythonie, równo pandas NIE. Bardzo wielofunkcyjny pakiet wysokiego poziomu, który pozwala na dowolną manipulację danymi, od ładowania danych z dowolnych źródeł po ich wizualizację.

Instalowanie dodatkowych pakietów

Pakiety omówione w tym artykule nie są zawarte w podstawowych dystrybucjach R i Python. Chociaż istnieje małe zastrzeżenie, jeśli zainstalowałeś dystrybucję Anaconda, zainstaluj ją dodatkowo pandas nie wymagane.

Instalowanie pakietów w R

Jeśli chociaż raz otworzył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 samym R.

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

Po instalacji należy połączyć pakiety, 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 za pomocą polecenia importujemy zainstalowany pakiet import.

import pandas as pd

Ładowanie danych

Eksploracja danych to jeden z najważniejszych etapów analizy danych. Zarówno Python, jak i R, na życzenie, zapewniają szerokie możliwości pozyskiwania danych z dowolnych źródeł: 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 całym artykule będziemy korzystać z kilku zbiorów danych:

  1. Dwa pobrania z Google Analytics.
  2. Zbiór danych pasażerów Titanica.

Wszystkie dane są na moim GitHub w postaci plików csv i tsv. Skąd będziemy o nie prosić?

Ładowanie danych do R: tidyverse, vroom, readr

Aby załadować dane do biblioteki tidyverse Istnieją dwa pakiety: vroom, readr. vroom bardziej nowoczesne, ale w przyszłości pakiety będą mogły być łączone.

Cytat z oficjalna dokumentacja vroom.

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

vroom vs czytnik
Co znaczy uwolnienie? vroom dla readr? W tej chwili planujemy rozwijać oba pakiety osobno, ale prawdopodobnie w przyszłości je połączymy. Jedna z wad leniwego czytania vroom polega na tym, że niektórych problemów z danymi nie można zgłosić z wyprzedzeniem, dlatego należy pomyśleć o tym, jak najlepiej je połączyć.

W tym artykule przyjrzymy się obu pakietom ładowania danych:

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

Ł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 paczce readr dla każdego formatu używamy innej funkcji read_tsv() и read_csv().

Ładowanie danych do R: data.table

В data.table istnieje 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 w Pythonie: pandas

Jeśli porównamy z pakietami R, to w tym przypadku składnia jest najbliższa pandas wola readr, dlatego pandas może żą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()

Oraz wiele innych funkcji przeznaczonych 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 w Pythonie: 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, znajduje się pole Seks, w którym przechowywany jest identyfikator płci pasażera.

Jednak dla wygodniejszej prezentacji danych pod względem płci pasażera należy używać nazwiska, a nie kodu płci.

Aby to zrobić, utworzymy mały katalog, tabelę, w której będą znajdować się odpowiednio tylko 2 kolumny (kod i nazwa płci) oraz 2 wiersze.

Tworzenie ramki danych w R: tidyverse, dplyr

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

Tworzenie ramki danych 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 ramki danych w Pythonie: pandy

В pandas Tworzenie ramek odbywa się w kilku etapach, najpierw tworzymy słownik, a następnie konwertujemy słownik na ramkę danych.

Tworzenie ramki danych w Pythonie: pandy

# создаём дата фрейм
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 przeprowadzenia analizy z reguły nie są potrzebne wszystkie kolumny 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, które wykonasz na tabeli źródłowej, będzie oczyszczenie jej z niepotrzebnych informacji i zwolnienie zajmowanej przez te informacje pamięci.

Wybieranie kolumn w R: tidyverse, dplyr

składnia dplyr jest bardzo podobny do języka zapytań SQL, jeśli go znasz, szybko opanujesz ten pakiet.

Aby wybrać kolumny, użyj funkcji select().

Poniżej znajdują się przykłady kodu, za pomocą którego można wybierać kolumny w następujący sposób:

  • Wyświetlanie nazw wymaganych kolumn
  • Odwołuj się 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 wykonywane są nieco inaczej, na początku artykułu podałem opis, jakie argumenty znajdują się w nawiasach kwadratowych data.table.

DT[i,j,by]

Gdzie:
ja - gdzie, tj. filtrowanie według wierszy
j - wybierz|aktualizuj|zrób, tj. wybieranie kolumn i ich konwertowanie
według - 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 wymagane kolumny za pomocą wyrażeń regularnych lub innych funkcji, aby filtrować nazwy potrzebnych kolumn.

Wybieranie kolumn w Pythonie, pandy

Aby wybrać kolumny według nazwy w pandas wystarczy podać listę ich nazwisk. Aby wybrać lub wykluczyć kolumny według nazwy za pomocą wyrażeń regularnych, musisz użyć funkcji drop() и filter()i argument oś=1, za pomocą którego wskazujesz, że konieczne jest przetwarzanie kolumn, a nie wierszy.

Aby wybrać pole według typu danych należy skorzystać z funkcji select_dtypes()i w argumenty zawierać lub wykluczać przekazać listę typów danych odpowiadających polom, które należy 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 wystarczy przeanalizować tylko ostatni miesiąc. Ponownie dodatkowe linie spowolnią proces przetwarzania danych i zablokują pamięć 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 funkcja służy do filtrowania wierszy filter(). Jako pierwszy argument przyjmuje ramkę danych, a następnie podaje warunki filtrowania.

Pisząc wyrażenia logiczne w celu filtrowania tabeli, w tym przypadku należy podać nazwy kolumn bez cudzysłowów i bez deklarowania nazwy tabeli.

Jeśli do filtrowania używasz wielu wyrażeń logicznych, 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 już pisałem powyżej, w data.table Składnia konwersji danych jest ujęta w nawiasy kwadratowe.

DT[i,j,by]

Gdzie:
ja - gdzie, tj. filtrowanie według wierszy
j - wybierz|aktualizuj|zrób, tj. wybieranie kolumn i ich konwertowanie
według - grupowanie danych

Argument służy do filtrowania wierszy i, który ma pierwszą pozycję w nawiasach kwadratowych.

Dostęp do kolumn można uzyskać za pomocą wyrażeń logicznych bez cudzysłowów i bez podawania 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: pandy

Filtruj według wierszy w pandas podobne do filtrowania data.tablei odbywa się w nawiasach kwadratowych.

W takim przypadku dostęp do kolumn odbywa się koniecznie poprzez wskazanie nazwy ramki danych, wówczas nazwę kolumny można podać także w cudzysłowie w nawiasach kwadratowych (przykład df['col_name']) lub bez cudzysłowu po kropce (przykład df.col_name).

Jeżeli zachodzi potrzeba filtrowania ramki danych według kilku warunków, każdy warunek należy umieścić w nawiasach. Warunki logiczne są ze sobą powiązane za pomocą operatorów & и |.

Filtrowanie ciągów w Pythonie: 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)]

Grupowanie i agregacja 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 jest rozproszona we wszystkich przeglądanych przez nas pakietach.

W tym przypadku jako przykład weźmiemy ramkę danych tytanicznyoraz oblicz liczbę i średni koszt biletów w zależności od klasy kabiny.

Grupowanie i agregacja 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 wchodzić w taką dżunglę.

Podstawowe funkcje agregujące:

  • sum() - podsumowanie
  • min() / max() – wartość minimalna i maksymalna
  • mean() - przeciętny
  • 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() przekazaliśmy tabelę jako pierwszy argument tytaniczny, a następnie wskazał pole Klasa P, według którego pogrupujemy naszą tabelę. Wynik tej operacji przy użyciu operatora %>% przekazany jako pierwszy argument funkcji summarise()i dodałem jeszcze 2 pola: pasażerowie и średnia_cena. W pierwszym za pomocą funkcji length() obliczył liczbę biletów, a w drugim za pomocą funkcji mean() otrzymał średnią cenę biletu.

Grupowanie i agregacja danych w R: data.table

В data.table argument służy 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 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 agregacja danych w Pythonie: pandy

Grupowanie w pandas podobny do dplyr, ale agregacja nie jest podobna do dplyr zupełnie nie data.table.

Aby pogrupować, użyj metody groupby(), do którego należy przekazać listę kolumn, według których zostanie pogrupowana ramka danych.

Do agregacji można użyć metody agg()który akceptuje słownik. Klucze słownika to kolumny, na 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() - przeciętny
  • median() — mediana
  • count() - ilość

Funkcja reset_index() w poniższym przykładzie służy do resetowania zagnieżdżonych indeksów pandas domyślnie po agregacji danych.

Symbol pozwala przejść do następnej linii.

Grupowanie i agregacja w Pythonie: pandy

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

Łączenie pionowe tabel

Operacja polegająca na łączeniu dwóch lub więcej tabel o tej samej strukturze. Załadowane przez nas dane zawierają tabele ga_now и ga_dec. Tabele te mają identyczną strukturę, tj. mają te same kolumny i 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

To jest przesyłanie 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 Za pomocą tej funkcji możesz połączyć 2 tabele w jedną bind_rows(), przekazując tabele jako argumenty.

Filtrowanie wierszy w R: dplyr

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

Pionowe łączenie tabel w R: data.table

To też nic skomplikowanego, skorzystajmy rbind().

Filtrowanie wierszy w R: data.table

## data.table
rbind(ga_nov, ga_dec)

Pionowe łączenie tabel w Pythonie: pandy

В pandas funkcja służy do łączenia tabel concat(), do którego musisz przekazać listę ramek, aby je połączyć.

Filtrowanie ciągów w Pythonie: pandy

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

Poziome łączenie tabel

Operacja, podczas której kolumny z drugiej tabeli są dodawane do pierwszej tabeli za pomocą klucza. Często wykorzystuje się go przy wzbogacaniu tabeli faktów (np. tabeli z danymi sprzedażowymi) o jakieś dane referencyjne (np. koszt produktu).

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

Istnieje kilka rodzajów złączeń:

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, co odpowiada kodowi płci pasażera:

1 - kobieta
2 - mężczyzna

Stworzyliśmy także tabelę - podręcznik 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 połączenie tabeli w R: tidyverse, dplyr

В dplyr Istnieje cała rodzina funkcji łączenia poziomego:

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

Najczęściej stosowanym w mojej praktyce jest left_join().

Jako pierwsze dwa argumenty funkcje wymienione powyżej wymagają dwóch tabel do połączenia, a jako trzeci argument by musisz określić kolumny, które chcesz połączyć.

Poziome połączenie tabeli w R: dplyr

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

Poziome łączenie tabel w R: data.table

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

Argumenty funkcji merge() w data.table

  • x, y — Tabele do łączenia
  • by — Kolumna będąca kluczem do połączenia, jeśli ma tę samą nazwę w obu tabelach
  • by.x, by.y — Nazwy kolumn, które mają zostać scalone, jeśli mają różne nazwy w tabelach
  • all, all.x, all.y — typ Join, all zwróci wszystkie wiersze z obu tabel, all.x odpowiada operacji LEFT JOIN (opuści wszystkie wiersze pierwszej tabeli), all.y — odpowiada Operacja RIGHT JOIN (pozostawi wszystkie wiersze drugiej tabeli).

Poziome łączenie tabel w R: data.table

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

Poziome łączenie tabel w Pythonie: pandy

Jak również w data.tablew pandas funkcja służy do łączenia tabel merge().

Argumenty funkcji merge() w pandach

  • how — Typ połączenia: lewy, prawy, zewnętrzny, wewnętrzny
  • on — Kolumna będąca kluczem, jeśli w obu tabelach ma tę samą nazwę
  • left_on, Right_on — Nazwy kluczowych kolumn, jeśli mają różne nazwy w tabelach

Poziome łączenie tabel w Pythonie: pandy

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

Podstawowe funkcje okna i kolumny obliczeniowe

Funkcje okna mają podobne znaczenie do funkcji agregujących i są również często wykorzystywane w analizie danych. Jednak w przeciwieństwie do funkcji agregujących, funkcje okna nie zmieniają liczby wierszy wychodzącej ramki danych.

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

Zasadniczo za pomocą funkcji okna dzielimy przychodzącą ramkę danych na części według jakiegoś kryterium, tj. według wartości pola lub kilku pól. I przeprowadzamy operacje arytmetyczne na każdym oknie. Wynik tych operacji zostanie zwrócony w każdej linii, tj. bez zmiany całkowitej liczby wierszy w tabeli.

Weźmy na przykład stół tytaniczny. Możemy obliczyć, jaki procent kosztu każdego biletu stanowił jego klasa kabiny.

Aby to zrobić, musimy w każdej linii uzyskać całkowity koszt biletu na aktualną klasę 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 tej samej klasy kabiny .

Funkcje okna w R: tidyverse, dplyr

Aby dodać nowe kolumny bez korzystania z grupowania wierszy, w dplyr spełnia funkcję mutate().

Opisany powyżej problem możesz rozwiązać grupując dane według pól Klasa P i sumowanie pola w nowej kolumnie Opłata. Następnie rozgrupuj tabelę i podziel wartości pól Opłata do tego, co wydarzyło się w poprzednim kroku.

Funkcje okna 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 pól Klasa P. Wyprowadź w nowej kolumnie kwotę dla grupy odpowiadającą 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 za pomocą pakietu data.table

Funkcje okna w R: data.table

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

Funkcje okna w Pythonie: pandy

Jednym ze sposobów dodania nowej kolumny do pandas - skorzystaj z funkcji assign(). Aby podsumować koszt biletów według klasy kabiny, bez grupowania wierszy, skorzystamy z funkcji transform().

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

Funkcje okna w Pythonie: pandy

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

Tabela korespondencji funkcji i metod

Poniżej znajduje się tabela zgodności między metodami wykonywania różnych operacji na danych w rozważanych 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
listę wymaganych kolumn podajemy w nawiasach kwadratowych / drop() / filter() / select_dtypes()

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

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

Połączenie pionowe tabel (UNION)
bind_rows()
rbind()
concat()

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

Podstawowe funkcje okna i dodawanie kolumn wyliczanych
group_by() + mutate()
argument j za pomocą operatora := + argument by
transform() + assign()

wniosek

Być może w artykule opisałem niezbyt optymalne implementacje przetwarzania danych, dlatego będzie mi miło, jeśli poprawicie moje błędy w komentarzach, lub po prostu uzupełnicie informacje podane w artykule o inne techniki pracy z danymi w R/Python.

Jak pisałem powyżej, celem artykułu nie było narzucanie opinii, który język jest lepszy, ale ułatwienie możliwości nauki obu języków lub, w razie potrzeby, migracji między nimi.

Jeśli spodobał Ci się ten artykuł, będę szczęśliwy, że mam nowych subskrybentów mojego youtube и telegram kanały.

Wywiad

Którego z poniższych pakietów używasz w swojej pracy?

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

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

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

  • 45,2%porządek19

  • 33,3%dane.tabela14

  • 54,8%pandy23

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

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

Dodaj komentarz