Bahasa mana yang hendak dipilih untuk bekerja dengan data - R atau Python? Kedua-duanya! Berhijrah daripada panda kepada tidyverse dan data.table and back

Dengan mencari R atau Python di Internet, anda akan menemui berjuta-juta artikel dan kilometer perbincangan mengenai topik yang mana satu lebih baik, lebih pantas dan lebih mudah untuk bekerja dengan data. Tetapi malangnya, semua artikel dan pertikaian ini tidak begitu berguna.

Bahasa mana yang hendak dipilih untuk bekerja dengan data - R atau Python? Kedua-duanya! Berhijrah daripada panda kepada tidyverse dan data.table and back

Tujuan artikel ini adalah untuk membandingkan teknik pemprosesan data asas dalam pakej paling popular bagi kedua-dua bahasa. Dan bantu pembaca dengan cepat menguasai sesuatu yang mereka belum tahu. Bagi mereka yang menulis dalam Python, ketahui cara melakukan perkara yang sama dalam R, dan sebaliknya.

Semasa artikel itu, kami akan menganalisis sintaks pakej paling popular dalam R. Ini adalah pakej yang disertakan dalam perpustakaan tidyversedan juga pakej data.table. Dan bandingkan sintaks mereka dengan pandas, pakej analisis data paling popular dalam Python.

Kami akan pergi langkah demi langkah melalui keseluruhan laluan analisis data daripada memuatkannya kepada melaksanakan fungsi tetingkap analisis menggunakan Python dan R.

Содержание

Artikel ini boleh digunakan sebagai helaian cheat jika anda terlupa cara melakukan beberapa operasi pemprosesan data dalam salah satu pakej yang sedang dipertimbangkan.

Bahasa mana yang hendak dipilih untuk bekerja dengan data - R atau Python? Kedua-duanya! Berhijrah daripada panda kepada tidyverse dan data.table and back

  1. Perbezaan sintaks utama antara R dan Python
    1.1. Mengakses Fungsi Pakej
    1.2. Tugasan
    1.3. Pengindeksan
    1.4. Kaedah dan OOP
    1.5. Saluran paip
    1.6. Struktur Data
  2. Sedikit perkataan mengenai pakej yang akan kami gunakan
    2.1. kemas
    2.2. data.tabel
    2.3. panda
  3. Memasang pakej
  4. Memuatkan Data
  5. Mencipta kerangka data
  6. Memilih Lajur yang Anda Perlukan
  7. Menapis baris
  8. Pengumpulan dan Pengumpulan
  9. Penyatuan jadual menegak (UNION)
  10. Cantuman mendatar jadual (SERTAI)
  11. Fungsi tetingkap asas dan lajur yang dikira
  12. Jadual surat menyurat antara kaedah pemprosesan data dalam R dan Python
  13. Kesimpulan
  14. Tinjauan ringkas tentang pakej yang anda gunakan

Jika anda berminat dengan analisis data, anda boleh menemui saya telegram и youtube saluran. Kebanyakan kandungan didedikasikan untuk bahasa R.

Perbezaan sintaks utama antara R dan Python

Untuk memudahkan anda menukar dari Python ke R, atau sebaliknya, saya akan memberikan beberapa perkara utama yang perlu anda perhatikan.

Mengakses Fungsi Pakej

Setelah pakej dimuatkan ke dalam R, anda tidak perlu menentukan nama pakej untuk mengakses fungsinya. Dalam kebanyakan kes ini tidak biasa dalam R, tetapi ia boleh diterima. Anda tidak perlu mengimport pakej sama sekali jika anda memerlukan salah satu fungsinya dalam kod anda, tetapi cukup panggil dengan menyatakan nama pakej dan nama fungsi tersebut. Pemisah antara pakej dan nama fungsi dalam R ialah bertitik dua. package_name::function_name().

Dalam Python, sebaliknya, ia dianggap klasik untuk memanggil fungsi pakej dengan menyatakan namanya secara eksplisit. Apabila pakej dimuat turun, ia biasanya diberi nama yang dipendekkan, mis. pandas selalunya nama samaran digunakan pd. Fungsi pakej diakses melalui titik package_name.function_name().

Tugasan

Dalam R, adalah perkara biasa untuk menggunakan anak panah untuk memberikan nilai kepada objek. obj_name <- value, walaupun tanda sama tunggal dibenarkan, tanda sama tunggal dalam R digunakan terutamanya untuk menghantar nilai kepada argumen berfungsi.

Dalam Python, tugasan dilakukan secara eksklusif dengan satu tanda sama obj_name = value.

Pengindeksan

Terdapat juga perbezaan yang agak ketara di sini. Dalam R, pengindeksan bermula pada satu dan termasuk semua elemen yang ditentukan dalam julat yang terhasil,

Dalam Python, pengindeksan bermula dari sifar dan julat yang dipilih tidak termasuk elemen terakhir yang dinyatakan dalam indeks. Jadi reka bentuk x[i:j] dalam Python tidak akan memasukkan elemen j.

Terdapat juga perbezaan dalam pengindeksan negatif, dalam notasi R x[-1] akan mengembalikan semua elemen vektor kecuali yang terakhir. Dalam Python, notasi yang serupa akan mengembalikan elemen terakhir sahaja.

Kaedah dan OOP

R melaksanakan OOP dengan caranya sendiri, saya menulis tentang ini dalam artikel "OOP dalam bahasa R (bahagian 1): Kelas S3". Secara umum, R ialah bahasa berfungsi, dan segala-galanya di dalamnya dibina berdasarkan fungsi. Oleh itu, sebagai contoh, untuk pengguna Excel, pergi ke tydiverse ia akan menjadi lebih mudah daripada pandas. Walaupun ini mungkin pendapat subjektif saya.

Ringkasnya, objek dalam R tidak mempunyai kaedah (jika kita bercakap tentang kelas S3, tetapi terdapat pelaksanaan OOP lain yang kurang biasa). Terdapat hanya fungsi umum yang memprosesnya secara berbeza bergantung pada kelas objek.

Saluran paip

Mungkin ini adalah nama untuk pandas Ia tidak akan betul sepenuhnya, tetapi saya akan cuba menerangkan maksudnya.

Agar tidak menyimpan pengiraan perantaraan dan tidak menghasilkan objek yang tidak perlu dalam persekitaran kerja, anda boleh menggunakan sejenis saluran paip. Itu. lulus hasil pengiraan dari satu fungsi ke fungsi seterusnya, dan jangan simpan hasil perantaraan.

Mari kita ambil contoh kod berikut, di mana kita menyimpan pengiraan perantaraan dalam objek berasingan:

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

Kami melakukan 3 operasi secara berurutan, dan hasil setiap satu telah disimpan dalam objek yang berasingan. Tetapi sebenarnya, kita tidak memerlukan objek perantaraan ini.

Atau lebih teruk lagi, tetapi lebih biasa kepada pengguna Excel.

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

Dalam kes ini, kami tidak menyimpan hasil pengiraan perantaraan, tetapi membaca kod dengan fungsi bersarang sangat menyusahkan.

Kami akan melihat beberapa pendekatan untuk pemprosesan data dalam R, dan mereka melakukan operasi yang serupa dengan cara yang berbeza.

Saluran paip di perpustakaan tidyverse dilaksanakan oleh operator %>%.

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

Oleh itu kita mengambil hasil kerja func1() dan menyampaikannya sebagai hujah pertama kepada func2(), maka kita lulus hasil pengiraan ini sebagai hujah pertama func3(). Dan pada akhirnya, kami menulis semua pengiraan yang dilakukan ke dalam objek obj <-.

Semua perkara di atas digambarkan lebih baik daripada perkataan oleh meme ini:
Bahasa mana yang hendak dipilih untuk bekerja dengan data - R atau Python? Kedua-duanya! Berhijrah daripada panda kepada tidyverse dan data.table and back

В data.table rantai digunakan dengan cara yang sama.

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

Dalam setiap kurungan persegi anda boleh menggunakan hasil operasi sebelumnya.

В pandas operasi sedemikian dipisahkan oleh titik.

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

Itu. kami ambil meja kami df dan gunakan kaedah dia fun1(), maka kami menggunakan kaedah tersebut untuk hasil yang diperolehi fun2()selepas fun3(). Hasil yang terhasil disimpan ke dalam objek obj .

Struktur Data

Struktur data dalam R dan Python adalah serupa, tetapi mempunyai nama yang berbeza.

Описание
Tajuk dalam R
Nama dalam Python/pandas

Struktur jadual
data.frame, data.table, tibble
DataFrame

Senarai nilai satu dimensi
vektor
Siri dalam panda atau senaraikan dalam Python tulen

Struktur bukan jadual berbilang peringkat
Senaraikan
Kamus (dikt)

Kami akan melihat beberapa ciri dan perbezaan lain dalam sintaks di bawah.

Sedikit perkataan mengenai pakej yang akan kami gunakan

Mula-mula, saya akan memberitahu anda sedikit tentang pakej yang anda akan kenali semasa artikel ini.

kemas

Официальный сайт: tidyverse.org
Bahasa mana yang hendak dipilih untuk bekerja dengan data - R atau Python? Kedua-duanya! Berhijrah daripada panda kepada tidyverse dan data.table and back
Perpustakaan tidyverse ditulis oleh Hedley Wickham, Saintis Penyelidikan Kanan di RStudio. tidyverse terdiri daripada set pakej yang mengagumkan yang memudahkan pemprosesan data, 5 daripadanya disertakan dalam 10 muat turun teratas daripada repositori CRAN.

Teras perpustakaan terdiri daripada pakej berikut: ggplot2, dplyr, tidyr, readr, purrr, tibble, stringr, forcats. Setiap pakej ini bertujuan untuk menyelesaikan masalah tertentu. Sebagai contoh dplyr dicipta untuk manipulasi data, tidyr untuk membawa data ke bentuk yang kemas, stringr memudahkan kerja dengan rentetan, dan ggplot2 ialah salah satu alat visualisasi data yang paling popular.

Kelebihannya tidyverse ialah sintaks kesederhanaan dan mudah dibaca, yang dalam banyak cara serupa dengan bahasa pertanyaan SQL.

data.tabel

Bahasa mana yang hendak dipilih untuk bekerja dengan data - R atau Python? Kedua-duanya! Berhijrah daripada panda kepada tidyverse dan data.table and backОфициальный сайт: r-datatable.com

Pengarang data.table ialah Matt Dole dari H2O.ai.

Keluaran pertama perpustakaan berlaku pada tahun 2006.

Sintaks pakej tidak semudah dalam tidyverse dan lebih mengingatkan bingkai data klasik dalam R, tetapi pada masa yang sama berkembang dengan ketara dalam fungsi.

Semua manipulasi dengan jadual dalam pakej ini diterangkan dalam kurungan segi empat sama, dan jika anda menterjemah sintaks data.table dalam SQL, anda mendapat sesuatu seperti ini: data.table[ WHERE, SELECT, GROUP BY ]

Kekuatan pakej ini ialah kelajuan memproses sejumlah besar data.

panda

Официальный сайт: panda.pydata.org Bahasa mana yang hendak dipilih untuk bekerja dengan data - R atau Python? Kedua-duanya! Berhijrah daripada panda kepada tidyverse dan data.table and back

Nama perpustakaan berasal daripada istilah ekonometrik "data panel", yang digunakan untuk menerangkan set maklumat berstruktur pelbagai dimensi.

Pengarang pandas ialah Wes McKinney dari Amerika.

Apabila ia datang kepada analisis data dalam Python, sama pandas Tidak. Pakej peringkat tinggi yang sangat pelbagai fungsi yang membolehkan anda melakukan sebarang manipulasi dengan data, daripada memuatkan data daripada mana-mana sumber kepada menggambarkannya.

Memasang pakej tambahan

Pakej yang dibincangkan dalam artikel ini tidak termasuk dalam pengedaran R dan Python asas. Walaupun terdapat kaveat kecil, jika anda memasang pengedaran Anaconda, kemudian pasang tambahan pandas tidak dikehendaki.

Memasang pakej dalam R

Jika anda telah membuka persekitaran pembangunan RStudio sekurang-kurangnya sekali, anda mungkin sudah tahu cara memasang pakej yang diperlukan dalam R. Untuk memasang pakej, gunakan arahan standard install.packages() dengan menjalankannya secara langsung dalam R itu sendiri.

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

Selepas pemasangan, pakej perlu disambungkan, yang dalam kebanyakan kes arahan digunakan library().

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

Memasang pakej dalam Python

Jadi, jika anda telah memasang Python tulen, maka pandas anda perlu memasangnya secara manual. Buka baris arahan, atau terminal, bergantung pada sistem pengendalian anda dan masukkan arahan berikut.

pip install pandas

Kemudian kami kembali ke Python dan mengimport pakej yang dipasang dengan arahan import.

import pandas as pd

Memuatkan Data

Perlombongan data adalah salah satu langkah terpenting dalam analisis data. Kedua-dua Python dan R, jika dikehendaki, memberi anda peluang yang luas untuk mendapatkan data daripada mana-mana sumber: fail tempatan, fail daripada Internet, tapak web, semua jenis pangkalan data.

Bahasa mana yang hendak dipilih untuk bekerja dengan data - R atau Python? Kedua-duanya! Berhijrah daripada panda kepada tidyverse dan data.table and back

Sepanjang artikel kami akan menggunakan beberapa set data:

  1. Dua muat turun daripada Google Analitis.
  2. Set Data Penumpang Titanic.

Semua data ada pada saya GitHub dalam bentuk fail csv dan tsv. Dari mana kita akan meminta mereka?

Memuatkan data ke dalam R: tidyverse, vroom, readr

Untuk memuatkan data ke dalam perpustakaan tidyverse Terdapat dua pakej: vroom, readr. vroom lebih moden, tetapi pada masa hadapan pakej boleh digabungkan.

Petikan daripada dokumentasi rasmi vroom.

vroom vs pembaca
Apa yang dikeluarkan oleh vroom bermakna untuk readr? Buat masa ini kami merancang untuk membiarkan kedua-dua pakej berkembang secara berasingan, tetapi kemungkinan kami akan menyatukan pakej pada masa hadapan. Satu kelemahan kepada vroom yang malas membaca ialah masalah data tertentu tidak dapat dilaporkan di hadapan, jadi cara terbaik untuk menyatukannya memerlukan sedikit pemikiran.

vroom vs reader
Apakah maksud pelepasan? vroom untuk readr? Pada masa ini kami merancang untuk membangunkan kedua-dua pakej secara berasingan, tetapi kami mungkin akan menggabungkannya pada masa hadapan. Salah satu keburukan malas membaca vroom ialah beberapa masalah dengan data tidak boleh dilaporkan terlebih dahulu, jadi anda perlu memikirkan cara terbaik untuk menggabungkannya.

Dalam artikel ini kita akan melihat kedua-dua pakej pemuatan data:

Memuatkan data ke dalam pakej 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")

Memuatkan data ke dalam 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")

Dalam pakejnya vroom, tanpa mengira format data csv / tsv, pemuatan dijalankan oleh fungsi dengan nama yang sama vroom(), dalam bungkusan readr kami menggunakan fungsi yang berbeza untuk setiap format read_tsv() и read_csv().

Memuatkan data ke dalam R: data.table

В data.table terdapat fungsi untuk memuatkan data fread().

Memuatkan data ke dalam pakej 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")

Memuat data dalam Python: panda

Jika kita bandingkan dengan pakej R, maka dalam kes ini sintaks paling hampir dengan pandas akan readr, kerana pandas boleh meminta data dari mana-mana sahaja, dan terdapat seisi keluarga fungsi dalam pakej ini read_*().

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

Dan banyak lagi fungsi lain yang direka untuk membaca data daripada pelbagai format. Tetapi untuk tujuan kami ia sudah memadai read_table() atau read_csv() menggunakan hujah September untuk menentukan pemisah lajur.

Memuat data dalam Python: panda

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

Mencipta kerangka data

Jadual Titanic, yang kami muatkan, ada medan Seks, yang menyimpan pengecam jantina penumpang.

Tetapi untuk persembahan data yang lebih mudah mengikut jantina penumpang, anda harus menggunakan nama dan bukannya kod jantina.

Untuk melakukan ini, kami akan membuat direktori kecil, satu jadual di mana terdapat hanya 2 lajur (kod dan nama jantina) dan 2 baris, masing-masing.

Mencipta kerangka data dalam R: tidyverse, dplyr

Dalam contoh kod di bawah, kami mencipta bingkai data yang dikehendaki menggunakan fungsi tersebut tibble() .

Mencipta kerangka data dalam R: dplyr

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

Mencipta kerangka data dalam R: data.table

Mencipta kerangka data dalam R: data.table

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

Mencipta kerangka data dalam Python: panda

В pandas Penciptaan bingkai dijalankan dalam beberapa peringkat, mula-mula kita mencipta kamus, dan kemudian kita menukar kamus kepada bingkai data.

Mencipta kerangka data dalam Python: panda

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

Memilih Lajur

Jadual yang anda bekerjasama mungkin mengandungi berdozen atau bahkan ratusan lajur data. Tetapi untuk menjalankan analisis, sebagai peraturan, anda tidak memerlukan semua lajur yang tersedia dalam jadual sumber.

Bahasa mana yang hendak dipilih untuk bekerja dengan data - R atau Python? Kedua-duanya! Berhijrah daripada panda kepada tidyverse dan data.table and back

Oleh itu, salah satu operasi pertama yang akan anda lakukan dengan jadual sumber ialah mengosongkannya daripada maklumat yang tidak diperlukan dan membebaskan memori yang diduduki oleh maklumat ini.

Memilih lajur dalam R: tidyverse, dplyr

sintaks dplyr sangat serupa dengan bahasa pertanyaan SQL, jika anda sudah biasa dengannya, anda akan cepat menguasai pakej ini.

Untuk memilih lajur, gunakan fungsi select().

Di bawah ialah contoh kod yang anda boleh memilih lajur dengan cara berikut:

  • Menyenaraikan nama lajur yang diperlukan
  • Rujuk nama lajur menggunakan ungkapan biasa
  • Mengikut jenis data atau sebarang sifat lain bagi data yang terkandung dalam lajur

Memilih lajur dalam 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)

Memilih lajur dalam R: data.table

Operasi yang sama dalam data.table dilakukan sedikit berbeza, pada permulaan artikel saya memberikan penerangan tentang hujah yang terdapat di dalam kurungan segi empat sama data.table.

DT[i,j,by]

Di mana:
i - di mana, i.e. penapisan mengikut baris
j - pilih|kemas kini|buat, i.e. memilih lajur dan menukarnya
mengikut - pengumpulan data

Memilih lajur dalam 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$")]

Pembolehubah .SD membolehkan anda mengakses semua lajur, dan .SDcols tapis lajur yang diperlukan menggunakan ungkapan biasa, atau fungsi lain untuk menapis nama lajur yang anda perlukan.

Memilih lajur dalam Python, panda

Untuk memilih lajur mengikut nama dalam pandas ia cukup untuk menyediakan senarai nama mereka. Dan untuk memilih atau mengecualikan lajur mengikut nama menggunakan ungkapan biasa, anda perlu menggunakan fungsi tersebut drop() и filter(), dan hujah paksi=1, yang mana anda menunjukkan bahawa adalah perlu untuk memproses lajur dan bukannya baris.

Untuk memilih medan mengikut jenis data, gunakan fungsi select_dtypes(), dan menjadi hujah termasuk atau tidak termasuk lulus senarai jenis data yang sepadan dengan medan yang anda perlu pilih.

Memilih lajur dalam Python: panda

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

Menapis baris

Sebagai contoh, jadual sumber mungkin mengandungi beberapa tahun data, tetapi anda hanya perlu menganalisis bulan lalu. Sekali lagi, talian tambahan akan melambatkan proses pemprosesan data dan menyumbat memori PC.

Bahasa mana yang hendak dipilih untuk bekerja dengan data - R atau Python? Kedua-duanya! Berhijrah daripada panda kepada tidyverse dan data.table and back

Menapis baris dalam R: tydyverse, dplyr

В dplyr fungsi ini digunakan untuk menapis baris filter(). Ia memerlukan bingkai data sebagai hujah pertama, kemudian anda menyenaraikan syarat penapisan.

Apabila menulis ungkapan logik untuk menapis jadual, dalam kes ini, nyatakan nama lajur tanpa petikan dan tanpa mengisytiharkan nama jadual.

Apabila menggunakan berbilang ungkapan logik untuk menapis, gunakan operator berikut:

  • & atau koma - logik DAN
  • | - logik ATAU

Menapis baris dalam R: dplyr

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

Menapis baris dalam R: data.table

Seperti yang telah saya tulis di atas, dalam data.table sintaks penukaran data disertakan dalam kurungan segi empat sama.

DT[i,j,by]

Di mana:
i - di mana, i.e. penapisan mengikut baris
j - pilih|kemas kini|buat, i.e. memilih lajur dan menukarnya
mengikut - pengumpulan data

Argumen digunakan untuk menapis baris i, yang mempunyai kedudukan pertama dalam kurungan segi empat sama.

Lajur diakses dalam ungkapan logik tanpa tanda petikan dan tanpa menyatakan nama jadual.

Ungkapan logik berkaitan antara satu sama lain dengan cara yang sama seperti dalam dplyr melalui operator & dan |.

Menapis baris dalam R: data.table

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

Menapis rentetan dalam Python: panda

Tapis mengikut baris dalam pandas serupa dengan penapisan masuk data.table, dan dilakukan dalam kurungan segi empat sama.

Dalam kes ini, akses kepada lajur dijalankan semestinya dengan menunjukkan nama bingkai data; maka nama lajur juga boleh ditunjukkan dalam tanda petikan dalam kurungan segi empat sama (contoh df['col_name']), atau tanpa petikan selepas tempoh (contoh df.col_name).

Jika anda perlu menapis kerangka data mengikut beberapa syarat, setiap syarat mesti diletakkan dalam kurungan. Keadaan logik disambungkan antara satu sama lain oleh pengendali & и |.

Menapis rentetan dalam Python: panda

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

Pengumpulan dan pengagregatan data

Salah satu operasi yang paling biasa digunakan dalam analisis data ialah pengelompokan dan pengagregatan.

Bahasa mana yang hendak dipilih untuk bekerja dengan data - R atau Python? Kedua-duanya! Berhijrah daripada panda kepada tidyverse dan data.table and back

Sintaks untuk melaksanakan operasi ini tersebar di semua pakej yang kami semak.

Dalam kes ini, kami akan mengambil kerangka data sebagai contoh Titanic, dan hitung bilangan dan purata kos tiket bergantung pada kelas kabin.

Pengumpulan dan pengagregatan data dalam R: tidyverse, dplyr

В dplyr fungsi ini digunakan untuk mengumpulkan group_by(), dan untuk pengagregatan summarise(). sebenarnya, dplyr terdapat seluruh keluarga fungsi summarise_*(), tetapi tujuan artikel ini adalah untuk membandingkan sintaks asas, jadi kami tidak akan pergi ke hutan sedemikian.

Fungsi pengagregatan asas:

  • sum() - penjumlahan
  • min() / max() – nilai minimum dan maksimum
  • mean() - sederhana
  • median() - median
  • length() - kuantiti

Pengumpulan dan pengagregatan dalam R: dplyr

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

Untuk berfungsi group_by() kami melepasi jadual sebagai hujah pertama Titanic, dan kemudian menunjukkan medan Pclass, yang mana kami akan mengumpulkan jadual kami. Hasil daripada operasi ini menggunakan operator %>% diluluskan sebagai hujah pertama kepada fungsi tersebut summarise(), dan menambah 2 lagi medan: penumpang и avg_price. Pada yang pertama, menggunakan fungsi length() mengira bilangan tiket, dan dalam kedua menggunakan fungsi mean() menerima harga tiket purata.

Pengumpulan dan pengagregatan data dalam R: data.table

В data.table hujah digunakan untuk pengagregatan j yang mempunyai kedudukan kedua dalam kurungan segi empat sama, dan untuk pengelompokan by atau keyby, yang mempunyai kedudukan ketiga.

Senarai fungsi pengagregatan dalam kes ini adalah sama dengan yang diterangkan dalam dplyr, kerana ini adalah fungsi daripada sintaks R asas.

Pengumpulan dan pengagregatan dalam R: data.table

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

Pengumpulan dan pengagregatan data dalam Python: panda

Berkumpulan dalam pandas sama seperti dplyr, tetapi pengagregatannya tidak serupa dengan dplyr tidak sama sekali data.table.

Untuk kumpulan, gunakan kaedah groupby(), yang mana anda perlu menghantar senarai lajur yang mana bingkai data akan dikumpulkan.

Untuk pengagregatan anda boleh menggunakan kaedah agg()yang menerima kamus. Kekunci kamus ialah lajur di mana anda akan menggunakan fungsi pengagregatan, dan nilainya ialah nama fungsi pengagregatan.

Fungsi pengagregatan:

  • sum() - penjumlahan
  • min() / max() – nilai minimum dan maksimum
  • mean() - sederhana
  • median() - median
  • count() - kuantiti

Fungsi reset_index() dalam contoh di bawah ia digunakan untuk menetapkan semula indeks bersarang itu pandas lalai kepada selepas pengagregatan data.

Muzikal membolehkan anda beralih ke baris seterusnya.

Pengumpulan dan pengagregatan dalam Python: panda

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

Cantuman menegak jadual

Operasi di mana anda menyertai dua atau lebih jadual daripada struktur yang sama. Data yang kami muatkan mengandungi jadual ga_nov и ga_dec. Jadual ini adalah sama dalam struktur, i.e. mempunyai lajur yang sama dan jenis data dalam lajur ini.

Bahasa mana yang hendak dipilih untuk bekerja dengan data - R atau Python? Kedua-duanya! Berhijrah daripada panda kepada tidyverse dan data.table and back

Ini adalah muat naik daripada Google Analytics untuk bulan November dan Disember, dalam bahagian ini kami akan menggabungkan data ini ke dalam satu jadual.

Mencantumkan jadual secara menegak dalam R: tidyverse, dplyr

В dplyr Anda boleh menggabungkan 2 jadual menjadi satu menggunakan fungsi tersebut bind_rows(), menghantar jadual sebagai hujahnya.

Menapis baris dalam R: dplyr

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

Mencantumkan jadual secara menegak dalam R: data.table

Ia juga tidak rumit, mari gunakan rbind().

Menapis baris dalam R: data.table

## data.table
rbind(ga_nov, ga_dec)

Mencantumkan jadual secara menegak dalam Python: panda

В pandas fungsi ini digunakan untuk menyertai jadual concat(), yang mana anda perlu lulus senarai bingkai untuk menggabungkannya.

Menapis rentetan dalam Python: panda

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

Cantuman mendatar jadual

Operasi di mana lajur dari yang kedua ditambahkan pada jadual pertama dengan kekunci. Ia sering digunakan apabila memperkayakan jadual fakta (contohnya, jadual dengan data jualan) dengan beberapa data rujukan (contohnya, kos produk).

Bahasa mana yang hendak dipilih untuk bekerja dengan data - R atau Python? Kedua-duanya! Berhijrah daripada panda kepada tidyverse dan data.table and back

Terdapat beberapa jenis gabungan:

Bahasa mana yang hendak dipilih untuk bekerja dengan data - R atau Python? Kedua-duanya! Berhijrah daripada panda kepada tidyverse dan data.table and back

Dalam jadual yang dimuatkan sebelum ini Titanic kami mempunyai lajur Seks, yang sepadan dengan kod jantina penumpang:

1 - perempuan
2 - lelaki

Selain itu, kami telah mencipta jadual - buku rujukan jantina. Untuk persembahan data yang lebih mudah tentang jantina penumpang, kami perlu menambah nama jantina daripada direktori jantina ke meja Titanic.

Gabungan jadual mendatar dalam R: tidyverse, dplyr

В dplyr Terdapat seisi keluarga fungsi untuk penyambungan mendatar:

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

Yang paling biasa digunakan dalam amalan saya ialah left_join().

Sebagai dua hujah pertama, fungsi yang disenaraikan di atas mengambil dua jadual untuk digabungkan, dan sebagai hujah ketiga by anda mesti menentukan lajur untuk disertai.

Gabungan jadual mendatar dalam R: dplyr

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

Cantuman mendatar jadual dalam R: data.table

В data.table Anda perlu menyertai jadual dengan kekunci menggunakan fungsi tersebut merge().

Argumen untuk menggabungkan() fungsi dalam data.table

  • x, y — Jadual untuk menyertai
  • oleh — Lajur yang merupakan kunci untuk disertai jika ia mempunyai nama yang sama dalam kedua-dua jadual
  • by.x, by.y — Nama lajur untuk digabungkan, jika mereka mempunyai nama yang berbeza dalam jadual
  • all, all.x, all.y — Jenis gabungan, semua akan mengembalikan semua baris daripada kedua-dua jadual, all.x sepadan dengan operasi LEFT JOIN (akan meninggalkan semua baris jadual pertama), all.y — sepadan dengan Operasi RIGHT JOIN (akan meninggalkan semua baris jadual kedua ).

Cantuman mendatar jadual dalam R: data.table

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

Gabungan jadual mendatar dalam Python: panda

Begitu juga dalam data.tableDalam pandas fungsi ini digunakan untuk menyertai jadual merge().

Argumen fungsi merge() dalam panda

  • bagaimana — Jenis sambungan: kiri, kanan, luar, dalam
  • hidup — Lajur yang merupakan kunci jika ia mempunyai nama yang sama dalam kedua-dua jadual
  • left_on, right_on — Nama lajur utama, jika ia mempunyai nama yang berbeza dalam jadual

Gabungan jadual mendatar dalam Python: panda

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

Fungsi tetingkap asas dan lajur yang dikira

Fungsi tetingkap adalah serupa dalam maksud kepada fungsi pengagregatan, dan juga sering digunakan dalam analisis data. Tetapi tidak seperti fungsi pengagregatan, fungsi tetingkap tidak mengubah bilangan baris bingkai data keluar.

Bahasa mana yang hendak dipilih untuk bekerja dengan data - R atau Python? Kedua-duanya! Berhijrah daripada panda kepada tidyverse dan data.table and back

Pada asasnya, menggunakan fungsi tetingkap, kami membahagikan bingkai data masuk kepada bahagian mengikut beberapa kriteria, i.e. dengan nilai medan, atau beberapa medan. Dan kami menjalankan operasi aritmetik pada setiap tetingkap. Hasil daripada operasi ini akan dikembalikan dalam setiap baris, i.e. tanpa mengubah jumlah bilangan baris dalam jadual.

Sebagai contoh, mari kita ambil meja Titanic. Kita boleh mengira berapa peratus kos setiap tiket dalam kelas kabinnya.

Untuk melakukan ini, kita perlu mendapatkan dalam setiap baris jumlah kos tiket untuk kelas kabin semasa di mana tiket dalam laluan ini tergolong, kemudian bahagikan kos setiap tiket dengan jumlah kos semua tiket kelas kabin yang sama .

Fungsi tetingkap dalam R: tidyverse, dplyr

Untuk menambah lajur baharu, tanpa menggunakan kumpulan baris, dalam dplyr berfungsi berfungsi mutate().

Anda boleh menyelesaikan masalah yang diterangkan di atas dengan mengumpulkan data mengikut medan Pclass dan menjumlahkan medan dalam lajur baharu Tambang. Seterusnya, nyahkumpulan jadual dan bahagikan nilai medan Tambang kepada apa yang berlaku pada langkah sebelumnya.

Fungsi tetingkap dalam R: dplyr

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

Fungsi tetingkap dalam R: data.table

Algoritma penyelesaian tetap sama seperti dalam dplyr, kita perlu membahagikan jadual kepada tingkap mengikut medan Pclass. Keluarkan dalam lajur baharu amaun untuk kumpulan yang sepadan dengan setiap baris dan tambahkan lajur di mana kami mengira bahagian kos setiap tiket dalam kumpulannya.

Untuk menambah lajur baharu pada data.table pengendali yang hadir :=. Di bawah ialah contoh penyelesaian masalah menggunakan pakej data.table

Fungsi tetingkap dalam R: data.table

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

Fungsi tetingkap dalam Python: panda

Satu cara untuk menambah lajur baharu pandas - gunakan fungsi assign(). Untuk meringkaskan kos tiket mengikut kelas kabin, tanpa mengelompokkan baris, kami akan menggunakan fungsi tersebut transform().

Di bawah ialah contoh penyelesaian yang kami tambahkan pada jadual Titanic 2 lajur yang sama.

Fungsi tetingkap dalam Python: panda

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

Jadual surat menyurat fungsi dan kaedah

Di bawah ialah jadual surat-menyurat antara kaedah untuk melaksanakan pelbagai operasi dengan data dalam pakej yang telah kami pertimbangkan.

Описание
kemas
data.tabel
panda

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

Mencipta kerangka data
tibble()
data.table()
dict() + from_dict()

Memilih Lajur
select()
hujah j, kedudukan kedua dalam kurungan segi empat sama
kami lulus senarai lajur yang diperlukan dalam kurungan segi empat sama / drop() / filter() / select_dtypes()

Menapis baris
filter()
hujah i, kedudukan pertama dalam kurungan segi empat sama
Kami menyenaraikan syarat penapisan dalam kurungan persegi / filter()

Pengumpulan dan Pengumpulan
group_by() + summarise()
hujah j + by
groupby() + agg()

Penyatuan jadual menegak (UNION)
bind_rows()
rbind()
concat()

Cantuman mendatar jadual (SERTAI)
left_join() / *_join()
merge()
merge()

Fungsi tetingkap asas dan menambah lajur yang dikira
group_by() + mutate()
hujah j menggunakan operator := + hujah by
transform() + assign()

Kesimpulan

Mungkin dalam artikel saya menerangkan bukan pelaksanaan pemprosesan data yang paling optimum, jadi saya akan gembira jika anda membetulkan kesilapan saya dalam komen, atau hanya menambah maklumat yang diberikan dalam artikel dengan teknik lain untuk bekerja dengan data dalam R / Python.

Seperti yang saya tulis di atas, tujuan artikel itu bukan untuk memaksa pendapat seseorang tentang bahasa yang lebih baik, tetapi untuk memudahkan peluang mempelajari kedua-dua bahasa, atau, jika perlu, berhijrah di antara mereka.

Jika anda menyukai artikel itu, saya akan gembira untuk mempunyai pelanggan baharu saya youtube и telegram saluran.

Wawancara

Antara pakej berikut, yang manakah anda gunakan dalam kerja anda?

Dalam komen anda boleh tulis sebab pilihan anda.

Hanya pengguna berdaftar boleh mengambil bahagian dalam tinjauan. Log masuk, Sama-sama.

Pakej pemprosesan data manakah yang anda gunakan (anda boleh memilih beberapa pilihan)

  • 45,2% tidyverse19

  • 33,3% data.jadual14

  • 54,8% panda23

42 pengguna telah mengundi. 9 pengguna berpantang.

Sumber: www.habr.com

Tambah komen