Chọn ngôn ngữ nào để làm việc với dữ liệu - R hoặc Python? Cả hai! Di chuyển từ pandas sang chotiverse và data.table và ngược lại

Bằng cách tìm kiếm R hoặc Python trên Internet, bạn sẽ tìm thấy hàng triệu bài viết và hàng km thảo luận về chủ đề cái nào tốt hơn, nhanh hơn và thuận tiện hơn khi làm việc với dữ liệu. Nhưng thật không may, tất cả những bài viết và tranh chấp này đều không đặc biệt hữu ích.

Chọn ngôn ngữ nào để làm việc với dữ liệu - R hoặc Python? Cả hai! Di chuyển từ pandas sang chotiverse và data.table và ngược lại

Mục đích của bài viết này là so sánh các kỹ thuật xử lý dữ liệu cơ bản trong các gói phổ biến nhất của cả hai ngôn ngữ. Và giúp người đọc nhanh chóng nắm vững những điều họ chưa biết. Đối với những người viết bằng Python, hãy tìm hiểu cách thực hiện điều tương tự trong R và ngược lại.

Trong bài viết chúng ta sẽ phân tích cú pháp của các package phổ biến nhất trong R. Đây là các package có trong thư viện tidyversevà cả gói data.table. Và so sánh cú pháp của họ với pandas, gói phân tích dữ liệu phổ biến nhất trong Python.

Chúng ta sẽ đi từng bước trong toàn bộ quá trình phân tích dữ liệu từ tải dữ liệu đến thực hiện các hàm cửa sổ phân tích bằng Python và R.

nội dung

Bài viết này có thể được sử dụng như một bản tóm tắt nếu bạn quên cách thực hiện một số thao tác xử lý dữ liệu trong một trong các gói đang được xem xét.

Chọn ngôn ngữ nào để làm việc với dữ liệu - R hoặc Python? Cả hai! Di chuyển từ pandas sang chotiverse và data.table và ngược lại

  1. Sự khác biệt cú pháp chính giữa R và Python
    1.1. Truy cập các chức năng của gói
    1.2. Phân công
    1.3. Lập chỉ mục
    1.4. Phương thức và OOP
    1.5. Đường ống
    1.6. Cấu trúc dữ liệu
  2. Một vài lời về các gói chúng tôi sẽ sử dụng
    2.1. ngăn nắp
    2.2. bảng dữ liệu
    2.3. gấu trúc
  3. Cài đặt gói
  4. Đang tải dữ liệu
  5. Tạo khung dữ liệu
  6. Chọn các cột bạn cần
  7. Lọc hàng
  8. Nhóm và tổng hợp
  9. Liên kết các bảng theo chiều dọc (UNION)
  10. Nối ngang các bảng (JOIN)
  11. Các hàm cửa sổ cơ bản và các cột được tính toán
  12. Bảng tương ứng giữa các phương thức xử lý dữ liệu trong R và Python
  13. Kết luận
  14. Một khảo sát ngắn về gói bạn sử dụng

Nếu bạn quan tâm đến phân tích dữ liệu, bạn có thể tìm thấy điện tín и youtube kênh truyền hình. Hầu hết nội dung được dành cho ngôn ngữ R.

Sự khác biệt cú pháp chính giữa R và Python

Để giúp bạn chuyển từ Python sang R dễ dàng hơn hoặc ngược lại, tôi sẽ đưa ra một số điểm chính mà bạn cần chú ý.

Truy cập các chức năng của gói

Khi một gói được tải vào R, bạn không cần chỉ định tên gói để truy cập các chức năng của nó. Trong hầu hết các trường hợp, điều này không phổ biến trong R, nhưng có thể chấp nhận được. Bạn hoàn toàn không cần phải nhập một gói nếu bạn cần một trong các hàm của nó trong mã của mình mà chỉ cần gọi gói đó bằng cách chỉ định tên của gói và tên của hàm. Dấu phân cách giữa tên gói và tên hàm trong R là dấu hai chấm kép. package_name::function_name().

Ngược lại, trong Python, việc gọi các hàm của một gói bằng cách chỉ định rõ ràng tên của nó được coi là cổ điển. Khi một gói được tải xuống, nó thường được đặt một tên rút gọn, ví dụ: pandas thông thường một bút danh được sử dụng pd. Một hàm gói được truy cập thông qua một dấu chấm package_name.function_name().

Phân công

Trong R, người ta thường sử dụng mũi tên để gán giá trị cho một đối tượng. obj_name <- value, mặc dù cho phép sử dụng một dấu bằng duy nhất nhưng dấu bằng duy nhất trong R được sử dụng chủ yếu để truyền giá trị cho các đối số của hàm.

Trong Python, phép gán được thực hiện độc quyền bằng một dấu bằng duy nhất obj_name = value.

Lập chỉ mục

Cũng có sự khác biệt khá đáng kể ở đây. Trong R, việc lập chỉ mục bắt đầu từ một và bao gồm tất cả các phần tử được chỉ định trong phạm vi kết quả,

Trong Python, việc lập chỉ mục bắt đầu từ 0 và phạm vi đã chọn không bao gồm phần tử cuối cùng được chỉ định trong chỉ mục. Vì vậy thiết kế x[i:j] trong Python sẽ không bao gồm phần tử j.

Ngoài ra còn có sự khác biệt trong việc lập chỉ mục phủ định, trong ký hiệu R x[-1] sẽ trả về tất cả các phần tử của vectơ ngoại trừ phần tử cuối cùng. Trong Python, ký hiệu tương tự sẽ chỉ trả về phần tử cuối cùng.

Phương thức và OOP

R triển khai OOP theo cách riêng của nó, tôi đã viết về điều này trong bài viết "OOP trong ngôn ngữ R (phần 1): Các lớp S3". Nói chung, R là ngôn ngữ chức năng và mọi thứ trong đó đều được xây dựng trên các hàm. Do đó, ví dụ: đối với người dùng Excel, hãy truy cập tydiverse nó sẽ dễ dàng hơn pandas. Mặc dù đây có thể là ý kiến ​​​​chủ quan của tôi.

Nói tóm lại, các đối tượng trong R không có phương thức (nếu chúng ta nói về các lớp S3, nhưng có những cách triển khai OOP khác ít phổ biến hơn nhiều). Chỉ có các hàm tổng quát xử lý chúng khác nhau tùy thuộc vào loại đối tượng.

Đường ống

Có lẽ đây là tên dành cho pandas Nó sẽ không hoàn toàn chính xác, nhưng tôi sẽ cố gắng giải thích ý nghĩa.

Để không lưu các phép tính trung gian và không tạo ra các đối tượng không cần thiết trong môi trường làm việc, bạn có thể sử dụng một loại đường ống. Những thứ kia. chuyển kết quả tính toán từ hàm này sang hàm khác và không lưu kết quả trung gian.

Hãy lấy ví dụ mã sau đây, trong đó chúng tôi lưu trữ các phép tính trung gian trong các đối tượng riêng biệt:

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

Chúng tôi thực hiện tuần tự 3 thao tác và kết quả của mỗi thao tác được lưu trong một đối tượng riêng biệt. Nhưng trên thực tế, chúng ta không cần những đối tượng trung gian này.

Hoặc thậm chí tệ hơn nhưng quen thuộc hơn với người dùng Excel.

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

Trong trường hợp này, chúng ta không lưu lại kết quả tính toán trung gian mà việc đọc code với các hàm lồng nhau là vô cùng bất tiện.

Chúng ta sẽ xem xét một số cách tiếp cận để xử lý dữ liệu trong R và chúng thực hiện các hoạt động tương tự theo những cách khác nhau.

Đường dẫn trong thư viện tidyverse được thực hiện bởi nhà điều hành %>%.

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

Vì vậy, chúng tôi lấy kết quả của công việc func1() và chuyển nó làm đối số đầu tiên cho func2(), thì chúng ta chuyển kết quả của phép tính này làm đối số đầu tiên func3(). Và cuối cùng, chúng tôi viết tất cả các phép tính được thực hiện vào đối tượng obj <-.

Tất cả những điều trên được minh họa tốt hơn lời nói của meme này:
Chọn ngôn ngữ nào để làm việc với dữ liệu - R hoặc Python? Cả hai! Di chuyển từ pandas sang chotiverse và data.table và ngược lại

В data.table chuỗi được sử dụng theo cách tương tự.

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

Trong mỗi dấu ngoặc vuông, bạn có thể sử dụng kết quả của thao tác trước đó.

В pandas các thao tác như vậy được phân tách bằng dấu chấm.

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

Những thứ kia. chúng tôi lấy bàn của mình df và sử dụng phương pháp của cô ấy fun1(), sau đó ta áp dụng phương pháp vào kết quả thu được fun2()sau fun3(). Kết quả thu được được lưu vào một đối tượng obj .

Cấu trúc dữ liệu

Cấu trúc dữ liệu trong R và Python giống nhau nhưng có tên khác nhau.

Описание
Tên trong R
Tên bằng Python/gấu trúc

Cấu trúc bảng
data.frame, data.table, tibble
Khung dữ liệu

Danh sách giá trị một chiều
Vector
Chuỗi trong gấu trúc hoặc danh sách bằng Python thuần túy

Cấu trúc không dạng bảng đa cấp
Danh sách
Từ điển (dict)

Chúng ta sẽ xem xét một số tính năng và sự khác biệt khác trong cú pháp bên dưới.

Một vài lời về các gói chúng tôi sẽ sử dụng

Đầu tiên, tôi sẽ kể cho bạn nghe một chút về các gói mà bạn sẽ làm quen trong bài viết này.

ngăn nắp

Официальный сайт: dọn dẹp.org
Chọn ngôn ngữ nào để làm việc với dữ liệu - R hoặc Python? Cả hai! Di chuyển từ pandas sang chotiverse và data.table và ngược lại
Thư viện tidyverse được viết bởi Hedley Wickham, Nhà khoa học nghiên cứu cấp cao tại RStudio. tidyverse bao gồm một bộ gói ấn tượng giúp đơn giản hóa việc xử lý dữ liệu, 5 trong số đó nằm trong top 10 lượt tải xuống hàng đầu từ kho CRAN.

Cốt lõi của thư viện bao gồm các gói sau: ggplot2, dplyr, tidyr, readr, purrr, tibble, stringr, forcats. Mỗi gói này đều nhằm mục đích giải quyết một vấn đề cụ thể. Ví dụ dplyr được tạo ra để thao tác dữ liệu, tidyr để đưa dữ liệu về một dạng gọn gàng, stringr đơn giản hóa việc làm việc với chuỗi và ggplot2 là một trong những công cụ trực quan hóa dữ liệu phổ biến nhất.

Lợi thế tidyverse là cú pháp đơn giản và dễ đọc, tương tự như ngôn ngữ truy vấn SQL về nhiều mặt.

bảng dữ liệu

Chọn ngôn ngữ nào để làm việc với dữ liệu - R hoặc Python? Cả hai! Di chuyển từ pandas sang chotiverse và data.table và ngược lạiОфициальный сайт: r-datatable.com

Tác giả data.table là Matt Dole của H2O.ai.

Lần phát hành đầu tiên của thư viện diễn ra vào năm 2006.

Cú pháp gói không thuận tiện như trong tidyverse và gợi nhớ nhiều hơn đến các khung dữ liệu cổ điển trong R, nhưng đồng thời được mở rộng đáng kể về chức năng.

Tất cả các thao tác với bảng trong gói này được mô tả trong dấu ngoặc vuông và nếu bạn dịch cú pháp data.table trong SQL, bạn nhận được một cái gì đó như thế này: data.table[ WHERE, SELECT, GROUP BY ]

Điểm mạnh của gói này là tốc độ xử lý lượng lớn dữ liệu.

gấu trúc

Официальный сайт: pandas.pydata.org Chọn ngôn ngữ nào để làm việc với dữ liệu - R hoặc Python? Cả hai! Di chuyển từ pandas sang chotiverse và data.table và ngược lại

Tên của thư viện xuất phát từ thuật ngữ kinh tế lượng “dữ liệu bảng”, được sử dụng để mô tả các tập hợp thông tin có cấu trúc đa chiều.

Tác giả pandas là người Mỹ Wes McKinney.

Khi nói đến phân tích dữ liệu bằng Python, bằng nhau pandas KHÔNG. Một gói cấp cao, rất đa chức năng cho phép bạn thực hiện bất kỳ thao tác nào với dữ liệu, từ tải dữ liệu từ bất kỳ nguồn nào đến trực quan hóa dữ liệu.

Cài đặt các gói bổ sung

Các gói được thảo luận trong bài viết này không có trong bản phân phối R và Python cơ bản. Mặc dù có một lưu ý nhỏ nhưng nếu bạn đã cài đặt bản phân phối Anaconda thì hãy cài đặt thêm pandas là không cần thiết.

Cài đặt gói trong R

Nếu bạn đã mở môi trường phát triển RStudio ít nhất một lần, có thể bạn đã biết cách cài đặt gói cần thiết trong R. Để cài đặt các gói, hãy sử dụng lệnh tiêu chuẩn install.packages() bằng cách chạy nó trực tiếp trong R.

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

Sau khi cài đặt, các gói cần được kết nối, trong hầu hết các trường hợp, lệnh được sử dụng library().

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

Cài đặt gói bằng Python

Vì vậy, nếu bạn đã cài đặt Python thuần túy thì pandas bạn cần phải cài đặt nó bằng tay. Mở một dòng lệnh hoặc thiết bị đầu cuối, tùy thuộc vào hệ điều hành của bạn và nhập lệnh sau.

pip install pandas

Sau đó, chúng ta quay lại Python và nhập gói đã cài đặt bằng lệnh import.

import pandas as pd

Đang tải dữ liệu

Khai thác dữ liệu là một trong những bước quan trọng nhất trong phân tích dữ liệu. Cả Python và R, nếu muốn, đều cung cấp cho bạn nhiều cơ hội để lấy dữ liệu từ bất kỳ nguồn nào: tệp cục bộ, tệp từ Internet, trang web, tất cả các loại cơ sở dữ liệu.

Chọn ngôn ngữ nào để làm việc với dữ liệu - R hoặc Python? Cả hai! Di chuyển từ pandas sang chotiverse và data.table và ngược lại

Trong suốt bài viết, chúng tôi sẽ sử dụng một số bộ dữ liệu:

  1. Hai lượt tải xuống từ Google Analytics.
  2. Bộ dữ liệu hành khách Titanic.

Tất cả dữ liệu đều có trên tôi GitHub ở dạng tệp csv và tsv. Chúng ta sẽ yêu cầu họ từ đâu?

Đang tải dữ liệu vào R: gọn gàng, vroom, readr

Để tải dữ liệu vào thư viện tidyverse Có hai gói: vroom, readr. vroom hiện đại hơn, nhưng trong tương lai các gói có thể được kết hợp.

Trích dẫn từ tài liệu chính thức vroom.

vroom vs người đọc
Việc phát hành cái gì vroom có ý nghĩa readr? Hiện tại, chúng tôi dự định để hai gói phát triển riêng biệt nhưng có thể chúng tôi sẽ hợp nhất các gói này trong tương lai. Một bất lợi đối với tính năng lười đọc của vroom là một số vấn đề về dữ liệu không thể được báo cáo trước, do đó, cách tốt nhất để thống nhất chúng đòi hỏi bạn phải suy nghĩ kỹ.

vroom vs readr
phát hành nghĩa là gì? vroom cho readr? Hiện tại, chúng tôi dự định phát triển cả hai gói riêng biệt nhưng có thể chúng tôi sẽ kết hợp chúng trong tương lai. Một trong những nhược điểm của việc lười đọc vroom là một số vấn đề với dữ liệu không thể được báo cáo trước, vì vậy bạn cần suy nghĩ về cách kết hợp chúng tốt nhất.

Trong bài viết này, chúng ta sẽ xem xét cả hai gói tải dữ liệu:

Đang tải dữ liệu vào R: gói 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")

Đang tải dữ liệu vào 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")

Trong gói vroom, bất kể định dạng dữ liệu csv / tsv, việc tải được thực hiện bởi chức năng cùng tên vroom(), trong gói readr chúng tôi sử dụng một chức năng khác nhau cho mỗi định dạng read_tsv() и read_csv().

Đang tải dữ liệu vào R: data.table

В data.table có chức năng tải dữ liệu fread().

Đang tải dữ liệu vào R: gói 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")

Đang tải dữ liệu bằng Python: gấu trúc

Nếu chúng ta so sánh với các gói R thì trong trường hợp này cú pháp gần nhất với pandas sẽ readr, tại vì pandas có thể yêu cầu dữ liệu từ mọi nơi và có cả nhóm chức năng trong gói này read_*().

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

Và nhiều chức năng khác được thiết kế để đọc dữ liệu từ nhiều định dạng khác nhau. Nhưng với mục đích của chúng tôi, thế là đủ read_table() hoặc read_csv() sử dụng đối số Tháng Chín để chỉ định dấu phân cách cột.

Đang tải dữ liệu bằng Python: gấu trúc

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

Tạo khung dữ liệu

Bàn chất hóa học, mà chúng tôi đã tải, có một trường tình dục, nơi lưu trữ thông tin nhận dạng giới tính của hành khách.

Nhưng để trình bày dữ liệu thuận tiện hơn về giới tính của hành khách, bạn nên sử dụng tên thay vì mã giới tính.

Để làm điều này, chúng ta sẽ tạo một thư mục nhỏ, một bảng trong đó sẽ chỉ có 2 cột (mã và tên giới tính) và 2 hàng tương ứng.

Tạo khung dữ liệu trong R: gọn gàng, dplyr

Trong ví dụ mã bên dưới, chúng tôi tạo khung dữ liệu mong muốn bằng hàm tibble() .

Tạo khung dữ liệu trong R: dplyr

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

Tạo khung dữ liệu trong R: data.table

Tạo khung dữ liệu trong R: data.table

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

Tạo khung dữ liệu trong Python: pandas

В pandas Việc tạo khung được thực hiện theo nhiều giai đoạn, đầu tiên chúng tôi tạo một từ điển và sau đó chúng tôi chuyển đổi từ điển thành khung dữ liệu.

Tạo khung dữ liệu trong Python: pandas

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

Chọn cột

Các bảng bạn làm việc có thể chứa hàng chục, thậm chí hàng trăm cột dữ liệu. Nhưng để tiến hành phân tích, theo quy luật, bạn không cần tất cả các cột có sẵn trong bảng nguồn.

Chọn ngôn ngữ nào để làm việc với dữ liệu - R hoặc Python? Cả hai! Di chuyển từ pandas sang chotiverse và data.table và ngược lại

Do đó, một trong những thao tác đầu tiên bạn sẽ thực hiện với bảng nguồn là xóa những thông tin không cần thiết và giải phóng bộ nhớ mà thông tin này chiếm giữ.

Chọn các cột trong R: gọn gàng, dplyr

cú pháp dplyr rất giống với ngôn ngữ truy vấn SQL, nếu quen với nó, bạn sẽ nhanh chóng thành thạo gói này.

Để chọn cột, sử dụng chức năng select().

Dưới đây là ví dụ về mã mà bạn có thể chọn cột theo những cách sau:

  • Liệt kê tên các cột cần thiết
  • Tham khảo tên cột bằng cách sử dụng biểu thức thông thường
  • Theo loại dữ liệu hoặc bất kỳ thuộc tính nào khác của dữ liệu có trong cột

Chọn các cột trong 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)

Chọn các cột trong R: data.table

Các thao tác tương tự trong data.table được thực hiện hơi khác một chút, ở đầu bài viết tôi đã cung cấp mô tả về những đối số bên trong dấu ngoặc vuông trong data.table.

DT[i,j,by]

Trong đó:
tôi - ở đâu, tức là lọc theo hàng
j - select|update|do, tức là chọn cột và chuyển đổi chúng
theo - nhóm dữ liệu

Chọn các cột trong 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$")]

Biến .SD cho phép bạn truy cập tất cả các cột và .SDcols lọc các cột được yêu cầu bằng cách sử dụng biểu thức chính quy hoặc các hàm khác để lọc tên của các cột bạn cần.

Chọn cột trong Python, gấu trúc

Để chọn các cột theo tên trong pandas chỉ cần cung cấp danh sách tên của họ là đủ. Và để chọn hoặc loại trừ các cột theo tên bằng biểu thức chính quy, bạn cần sử dụng các hàm drop() и filter(), và lập luận trục=1, trong đó bạn chỉ ra rằng cần phải xử lý các cột thay vì các hàng.

Để chọn một trường theo kiểu dữ liệu, hãy sử dụng hàm select_dtypes(), và vào các đối số bao gồm hoặc loại trừ đưa ra danh sách các kiểu dữ liệu tương ứng với các trường bạn cần chọn.

Chọn cột trong Python: 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'])

Lọc hàng

Ví dụ: bảng nguồn có thể chứa dữ liệu của vài năm nhưng bạn chỉ cần phân tích tháng trước. Một lần nữa, các dòng bổ sung sẽ làm chậm quá trình xử lý dữ liệu và làm tắc nghẽn bộ nhớ PC.

Chọn ngôn ngữ nào để làm việc với dữ liệu - R hoặc Python? Cả hai! Di chuyển từ pandas sang chotiverse và data.table và ngược lại

Lọc các hàng trong R: tydyverse, dplyr

В dplyr chức năng được sử dụng để lọc các hàng filter(). Nó lấy một khung dữ liệu làm đối số đầu tiên, sau đó bạn liệt kê các điều kiện lọc.

Khi viết biểu thức logic để lọc bảng, trong trường hợp này, hãy chỉ định tên cột không có dấu ngoặc kép và không khai báo tên bảng.

Khi sử dụng nhiều biểu thức logic để lọc, hãy sử dụng các toán tử sau:

  • & hoặc dấu phẩy - logic VÀ
  • | - logic HOẶC

Lọc các hàng trong R: dplyr

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

Lọc các hàng trong R: data.table

Như tôi đã viết ở trên, trong data.table cú pháp chuyển đổi dữ liệu được đặt trong dấu ngoặc vuông.

DT[i,j,by]

Trong đó:
tôi - ở đâu, tức là lọc theo hàng
j - select|update|do, tức là chọn cột và chuyển đổi chúng
theo - nhóm dữ liệu

Đối số được sử dụng để lọc các hàng i, có vị trí đầu tiên trong ngoặc vuông.

Các cột được truy cập trong các biểu thức logic không có dấu ngoặc kép và không chỉ định tên bảng.

Các biểu thức logic có liên hệ với nhau giống như trong dplyr thông qua các toán tử & và |.

Lọc các hàng trong R: data.table

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

Lọc chuỗi trong Python: pandas

Lọc theo hàng trong pandas tương tự như lọc trong data.table, và được thực hiện trong dấu ngoặc vuông.

Trong trường hợp này, việc truy cập vào các cột nhất thiết phải được thực hiện bằng cách chỉ ra tên của khung dữ liệu; sau đó tên cột cũng có thể được chỉ định trong dấu ngoặc kép trong ngoặc vuông (Ví dụ df['col_name']) hoặc không có dấu ngoặc kép sau dấu chấm (Ví dụ df.col_name).

Nếu bạn cần lọc một khung dữ liệu theo một số điều kiện thì mỗi điều kiện phải được đặt trong ngoặc đơn. Các điều kiện logic được kết nối với nhau bởi các toán tử & и |.

Lọc chuỗi trong Python: 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)]

Nhóm và tổng hợp dữ liệu

Một trong những hoạt động được sử dụng phổ biến nhất trong phân tích dữ liệu là nhóm và tổng hợp.

Chọn ngôn ngữ nào để làm việc với dữ liệu - R hoặc Python? Cả hai! Di chuyển từ pandas sang chotiverse và data.table và ngược lại

Cú pháp để thực hiện các thao tác này nằm rải rác trên tất cả các gói mà chúng tôi xem xét.

Trong trường hợp này, chúng tôi sẽ lấy một khung dữ liệu làm ví dụ chất hóa học, đồng thời tính số lượng và giá vé trung bình tùy theo hạng khoang.

Nhóm và tổng hợp dữ liệu trong R: Tidyverse, dplyr

В dplyr chức năng được sử dụng để nhóm group_by()và để tổng hợp summarise(). Trong thực tế, dplyr có cả một nhóm chức năng summarise_*(), nhưng mục đích của bài viết này là so sánh cú pháp cơ bản nên chúng ta sẽ không đi sâu vào vấn đề đó.

Các hàm tổng hợp cơ bản:

  • sum() — tổng kết
  • min() / max() - giá trị tối thiểu và tối đa
  • mean() - trung bình
  • median() - Trung bình
  • length() - Số lượng

Nhóm và tổng hợp trong R: dplyr

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

Trong chức năng group_by() chúng tôi đã vượt qua cái bàn làm đối số đầu tiên chất hóa học, rồi chỉ ra trường lớp học, theo đó chúng ta sẽ nhóm bảng của mình lại. Kết quả của thao tác này sử dụng toán tử %>% được truyền làm đối số đầu tiên cho hàm summarise(), và thêm 2 trường nữa: người qua đường и giá_trung bình. Đầu tiên sử dụng hàm length() tính số lượng vé và trong lần thứ hai sử dụng hàm mean() nhận được giá vé trung bình.

Nhóm và tổng hợp dữ liệu trong R: data.table

В data.table đối số được sử dụng để tổng hợp j có vị trí thứ hai trong ngoặc vuông và để nhóm by hoặc keyby, có vị trí thứ ba.

Danh sách các hàm tổng hợp trong trường hợp này giống hệt với danh sách được mô tả trong dplyr, bởi vì đây là các hàm từ cú pháp R cơ bản.

Nhóm và tổng hợp trong R: data.table

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

Nhóm và tổng hợp dữ liệu trong Python: pandas

Nhóm vào pandas tương tự như dplyr, nhưng sự tổng hợp không giống với dplyr không có gì data.table.

Để nhóm, sử dụng phương pháp groupby(), trong đó bạn cần chuyển danh sách các cột mà khung dữ liệu sẽ được nhóm theo đó.

Để tổng hợp, bạn có thể sử dụng phương pháp agg()chấp nhận một từ điển. Các khóa từ điển là các cột mà bạn sẽ áp dụng các hàm tổng hợp trên đó và các giá trị là tên của các hàm tổng hợp.

Các hàm tổng hợp:

  • sum() — tổng kết
  • min() / max() - giá trị tối thiểu và tối đa
  • mean() - trung bình
  • median() - Trung bình
  • count() - Số lượng

Chức năng reset_index() trong ví dụ bên dưới, nó được sử dụng để đặt lại các chỉ mục lồng nhau pandas mặc định là sau khi tổng hợp dữ liệu.

Symbol cho phép bạn chuyển sang dòng tiếp theo.

Nhóm và tổng hợp trong Python: pandas

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

Nối theo chiều dọc của các bảng

Một thao tác trong đó bạn nối hai hoặc nhiều bảng có cùng cấu trúc. Dữ liệu chúng tôi đã tải chứa các bảng ga_nov и ga_dec. Các bảng này có cấu trúc giống hệt nhau, tức là có cùng các cột và kiểu dữ liệu trong các cột này.

Chọn ngôn ngữ nào để làm việc với dữ liệu - R hoặc Python? Cả hai! Di chuyển từ pandas sang chotiverse và data.table và ngược lại

Đây là bản tải lên từ Google Analytics cho tháng 11 và tháng 12, trong phần này chúng tôi sẽ kết hợp dữ liệu này vào một bảng.

Nối các bảng theo chiều dọc trong R: gọn gàng, dplyr

В dplyr Bạn có thể kết hợp 2 bảng thành một bằng cách sử dụng hàm bind_rows(), chuyển các bảng làm đối số của nó.

Lọc các hàng trong R: dplyr

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

Nối các bảng theo chiều dọc trong R: data.table

Cũng không có gì phức tạp, hãy sử dụng rbind().

Lọc các hàng trong R: data.table

## data.table
rbind(ga_nov, ga_dec)

Nối các bảng theo chiều dọc trong Python: pandas

В pandas chức năng được sử dụng để nối các bảng concat(), trong đó bạn cần chuyển danh sách các khung để kết hợp chúng.

Lọc chuỗi trong Python: pandas

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

Nối ngang các bảng

Một thao tác trong đó các cột từ bảng thứ hai được thêm vào bảng đầu tiên bằng phím. Nó thường được sử dụng khi làm phong phú một bảng sự kiện (ví dụ: bảng có dữ liệu bán hàng) với một số dữ liệu tham chiếu (ví dụ: giá thành của một sản phẩm).

Chọn ngôn ngữ nào để làm việc với dữ liệu - R hoặc Python? Cả hai! Di chuyển từ pandas sang chotiverse và data.table và ngược lại

Có một số loại kết nối:

Chọn ngôn ngữ nào để làm việc với dữ liệu - R hoặc Python? Cả hai! Di chuyển từ pandas sang chotiverse và data.table và ngược lại

Trong bảng được tải trước đó chất hóa học chúng tôi có một cột tình dục, tương ứng với mã giới tính của hành khách:

1 - nữ
2 - nam

Ngoài ra, chúng tôi đã tạo một bảng - một cuốn sách tham khảo giới. Để trình bày dữ liệu về giới tính của hành khách thuận tiện hơn, chúng ta cần thêm tên giới tính từ danh bạ giới đến bàn chất hóa học.

Nối bảng ngang trong R: gọn gàng, dplyr

В dplyr Có cả một nhóm chức năng để nối ngang:

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

Việc sử dụng phổ biến nhất trong thực tế của tôi là left_join().

Là hai đối số đầu tiên, các hàm được liệt kê ở trên lấy hai bảng để nối và làm đối số thứ ba by bạn phải chỉ định các cột để tham gia.

Tham gia bảng ngang trong R: dplyr

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

Nối ngang các bảng trong R: data.table

В data.table Bạn cần nối các bảng bằng phím bằng hàm merge().

Các đối số của hàm merge() trong data.table

  • x, y — Các bảng để nối
  • by - Cột là khóa để nối nếu nó có cùng tên trong cả hai bảng
  • by.x, by.y — Tên cột sẽ được hợp nhất, nếu chúng có tên khác nhau trong bảng
  • all, all.x, all.y — Kiểu nối, all sẽ trả về tất cả các hàng từ cả hai bảng, all.x tương ứng với thao tác LEFT JOIN (sẽ để lại tất cả các hàng của bảng đầu tiên), all.y — tương ứng với Thao tác RIGHT JOIN (sẽ bỏ tất cả các hàng của bảng thứ hai).

Nối ngang các bảng trong R: data.table

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

Tham gia bảng ngang trong Python: pandas

Cũng như trong data.tableTrong pandas chức năng được sử dụng để tham gia các bảng merge().

Các đối số của hàm merge() trong gấu trúc

  • thế nào — Kiểu kết nối: trái, phải, ngoài, trong
  • bật - Cột là khóa nếu nó có cùng tên trong cả hai bảng
  • left_on, right_on - Tên của các cột chính, nếu chúng có tên khác nhau trong bảng

Tham gia bảng ngang trong Python: pandas

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

Các hàm cửa sổ cơ bản và các cột được tính toán

Các hàm cửa sổ có ý nghĩa tương tự như các hàm tổng hợp và cũng thường được sử dụng trong phân tích dữ liệu. Nhưng không giống như các hàm tổng hợp, các hàm cửa sổ không thay đổi số lượng hàng của khung dữ liệu gửi đi.

Chọn ngôn ngữ nào để làm việc với dữ liệu - R hoặc Python? Cả hai! Di chuyển từ pandas sang chotiverse và data.table và ngược lại

Về cơ bản, bằng cách sử dụng chức năng cửa sổ, chúng tôi chia khung dữ liệu đến thành các phần theo một số tiêu chí, tức là. theo giá trị của một trường hoặc một số trường. Và chúng ta thực hiện các phép tính số học trên mỗi cửa sổ. Kết quả của các hoạt động này sẽ được trả về trong mỗi dòng, tức là. mà không thay đổi tổng số hàng trong bảng.

Ví dụ: hãy lấy bảng chất hóa học. Chúng tôi có thể tính toán bao nhiêu phần trăm chi phí của mỗi vé trong hạng khoang của nó.

Để làm điều này, chúng ta cần nhập vào mỗi dòng tổng chi phí của một vé cho hạng cabin hiện tại mà vé ở dòng này thuộc về, sau đó chia chi phí của mỗi vé cho tổng chi phí của tất cả các vé cùng hạng cabin .

Các hàm cửa sổ trong R: gọn gàng, dplyr

Để thêm các cột mới mà không cần sử dụng nhóm hàng, trong dplyr phục vụ chức năng mutate().

Bạn có thể giải quyết vấn đề được mô tả ở trên bằng cách nhóm dữ liệu theo trường lớp học và tổng hợp trường trong một cột mới Giá vé. Tiếp theo, rã nhóm bảng và chia các giá trị trường Giá vé với những gì đã xảy ra ở bước trước đó.

Các hàm cửa sổ trong R: dplyr

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

Các hàm cửa sổ trong R: data.table

Thuật toán giải vẫn giữ nguyên như trong dplyr, chúng ta cần chia bảng thành các cửa sổ theo trường lớp học. Xuất vào một cột mới số tiền cho nhóm tương ứng với mỗi hàng và thêm một cột trong đó chúng tôi tính toán phần chi phí của mỗi vé trong nhóm của nó.

Để thêm cột mới vào data.table nhà điều hành hiện tại :=. Dưới đây là một ví dụ về giải quyết vấn đề bằng cách sử dụng gói data.table

Các hàm cửa sổ trong R: data.table

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

Các hàm cửa sổ trong Python: pandas

Một cách để thêm một cột mới vào pandas - sử dụng chức năng assign(). Để tổng hợp giá vé theo hạng khoang, không cần nhóm các hàng, chúng ta sẽ sử dụng hàm transform().

Dưới đây là ví dụ về giải pháp mà chúng tôi thêm vào bảng chất hóa học 2 cột giống nhau.

Các hàm cửa sổ trong Python: pandas

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

Bảng tương ứng hàm và phương thức

Dưới đây là bảng tương ứng giữa các phương pháp thực hiện các thao tác khác nhau với dữ liệu trong các gói mà chúng tôi đã xem xét.

Описание
ngăn nắp
bảng dữ liệu
gấu trúc

Đang tải dữ liệu
vroom()/ readr::read_csv() / readr::read_tsv()
fread()
read_csv()

Tạo khung dữ liệu
tibble()
data.table()
dict() + from_dict()

Chọn cột
select()
tranh luận j, vị trí thứ hai trong ngoặc vuông
chúng tôi chuyển danh sách các cột bắt buộc trong ngoặc vuông / drop() / filter() / select_dtypes()

Lọc hàng
filter()
tranh luận i, vị trí đầu tiên trong ngoặc vuông
Chúng tôi liệt kê các điều kiện lọc trong ngoặc vuông / filter()

Nhóm và tổng hợp
group_by() + summarise()
đối số j + by
groupby() + agg()

Liên kết các bảng theo chiều dọc (UNION)
bind_rows()
rbind()
concat()

Nối ngang các bảng (JOIN)
left_join() / *_join()
merge()
merge()

Các hàm cửa sổ cơ bản và thêm các cột được tính toán
group_by() + mutate()
tranh luận j sử dụng toán tử := + luận cứ by
transform() + assign()

Kết luận

Có lẽ trong bài viết tôi đã mô tả không phải là cách triển khai xử lý dữ liệu tối ưu nhất, vì vậy tôi sẽ rất vui nếu bạn sửa lỗi của mình trong phần nhận xét hoặc chỉ đơn giản là bổ sung thông tin được đưa ra trong bài viết bằng các kỹ thuật khác để làm việc với dữ liệu trong R / Python.

Như tôi đã viết ở trên, mục đích của bài viết không phải là áp đặt quan điểm của mọi người về ngôn ngữ nào tốt hơn mà là để đơn giản hóa cơ hội học cả hai ngôn ngữ hoặc nếu cần, di chuyển giữa chúng.

Nếu bạn thích bài viết, tôi sẽ rất vui khi có người đăng ký mới theo dõi bài viết của mình. youtube и điện tín kênh truyền hình.

Опрос

Bạn sử dụng gói nào sau đây trong công việc của mình?

Trong phần bình luận, bạn có thể viết lý do cho sự lựa chọn của mình.

Chỉ những người dùng đã đăng ký mới có thể tham gia khảo sát. Đăng nhập, xin vui lòng.

Bạn sử dụng gói xử lý dữ liệu nào (bạn có thể chọn một số tùy chọn)

  • 45,2%gọn gàng19

  • 33,3%dữ liệu.table14

  • 54,8%gấu trúc23

42 người dùng bình chọn. 9 người dùng bỏ phiếu trắng.

Nguồn: www.habr.com

Thêm một lời nhận xét