کدام زبان را برای کار با داده انتخاب کنیم - R یا Python؟ هر دو! مهاجرت از پانداها به tidyverse و data.table و برگشت

با جستجوی R یا Python در اینترنت، میلیون‌ها مقاله و کیلومتر بحث در مورد این موضوع پیدا خواهید کرد که کدام یک برای کار با داده‌ها بهتر، سریع‌تر و راحت‌تر است. اما متأسفانه همه این مقاله ها و اختلافات مفید نیستند.

کدام زبان را برای کار با داده انتخاب کنیم - R یا Python؟ هر دو! مهاجرت از پانداها به tidyverse و data.table و برگشت

هدف این مقاله مقایسه تکنیک های اولیه پردازش داده در محبوب ترین بسته های هر دو زبان است. و به خوانندگان کمک کنید تا به سرعت بر چیزی که هنوز نمی دانند تسلط پیدا کنند. برای کسانی که در پایتون می نویسند، بیاموزند که چگونه همان کار را در R انجام دهند و بالعکس.

در طول مقاله، نحو محبوب ترین بسته ها را در R تجزیه و تحلیل خواهیم کرد. اینها بسته های موجود در کتابخانه هستند. tidyverseو همچنین بسته data.table. و نحو آنها را با pandas، محبوب ترین بسته تجزیه و تحلیل داده در پایتون.

ما گام به گام کل مسیر تجزیه و تحلیل داده ها را از بارگذاری آن تا انجام عملکردهای پنجره تحلیلی با استفاده از Python و R خواهیم داشت.

مقدار

اگر فراموش کرده اید که چگونه عملیات پردازش داده را در یکی از بسته های مورد بررسی انجام دهید، این مقاله می تواند به عنوان یک برگه تقلب استفاده شود.

کدام زبان را برای کار با داده انتخاب کنیم - R یا Python؟ هر دو! مهاجرت از پانداها به tidyverse و data.table و برگشت

  1. تفاوت های دستوری اصلی بین R و Python
    1.1. دسترسی به توابع بسته
    1.2. وظیفه
    1.3. نمایه سازی
    1.4. روش ها و OOP
    1.5. خطوط لوله
    1.6. ساختارهای داده
  2. چند کلمه در مورد بسته هایی که استفاده خواهیم کرد
    2.1. مرتب
    2.2. جدول داده
    2.3. پانداها
  3. نصب پکیج ها
  4. در حال بارگیری داده ها
  5. ایجاد دیتافریم
  6. انتخاب ستون های مورد نیاز
  7. فیلتر کردن ردیف ها
  8. گروه بندی و تجمیع
  9. اتحاد عمودی جداول (UNION)
  10. اتصال افقی جداول (JOIN)
  11. توابع اصلی پنجره و ستون های محاسبه شده
  12. جدول تناظر بین روش های پردازش داده در R و Python
  13. نتیجه
  14. یک نظرسنجی کوتاه در مورد بسته ای که استفاده می کنید

اگر به تجزیه و تحلیل داده ها علاقه دارید، ممکن است من را بیابید تلگراف и یوتیوب کانال ها بیشتر مطالب به زبان R اختصاص داده شده است.

تفاوت های دستوری اصلی بین R و Python

برای سهولت در جابجایی از پایتون به R یا برعکس، چند نکته اصلی را بیان می کنم که باید به آنها توجه کنید.

دسترسی به توابع بسته

هنگامی که یک بسته در R بارگذاری می شود، برای دسترسی به توابع آن نیازی به تعیین نام بسته ندارید. در بیشتر موارد این در R رایج نیست، اما قابل قبول است. اگر به یکی از توابع آن در کد خود نیاز دارید، به هیچ وجه نیازی به وارد کردن یک بسته ندارید، بلکه فقط با مشخص کردن نام بسته و نام تابع، آن را فراخوانی کنید. جداکننده بین نام بسته و تابع در R یک دو نقطه است. package_name::function_name().

در پایتون، برعکس، فراخوانی توابع یک بسته با مشخص کردن نام آن، کلاسیک در نظر گرفته می‌شود. هنگامی که یک بسته دانلود می شود، معمولاً یک نام کوتاه شده به آن داده می شود، به عنوان مثال. pandas معمولاً از نام مستعار استفاده می شود pd. یک تابع بسته از طریق یک نقطه قابل دسترسی است package_name.function_name().

وظیفه

در R، استفاده از یک فلش برای تعیین مقدار به یک شی معمول است. obj_name <- value، اگرچه یک علامت تساوی منفرد مجاز است، علامت تساوی واحد در R در درجه اول برای ارسال مقادیر به آرگومان های تابع استفاده می شود.

در پایتون تخصیص منحصرا با یک علامت تساوی انجام می شود obj_name = value.

نمایه سازی

در اینجا نیز تفاوت های کاملاً قابل توجهی وجود دارد. در R، نمایه سازی از یک شروع می شود و تمام عناصر مشخص شده در محدوده حاصل را شامل می شود.

در پایتون، نمایه سازی از صفر شروع می شود و محدوده انتخاب شده شامل آخرین عنصر مشخص شده در ایندکس نمی شود. پس طراحی کنید x[i:j] در پایتون عنصر j را شامل نمی شود.

همچنین تفاوت هایی در نمایه سازی منفی، در نماد R وجود دارد x[-1] تمام عناصر بردار به جز آخرین مورد را برمی گرداند. در پایتون، یک نماد مشابه فقط آخرین عنصر را برمی گرداند.

روش ها و OOP

R OOP را به روش خود پیاده سازی می کند، من در این مورد در مقاله نوشتم "OOP در زبان R (قسمت 1): کلاس های S3". به طور کلی، R یک زبان تابعی است و همه چیز در آن بر اساس توابع ساخته شده است. بنابراین، به عنوان مثال، برای کاربران اکسل، به tydiverse آسان تر از آن خواهد بود pandas. اگرچه این ممکن است نظر ذهنی من باشد.

به طور خلاصه، اشیاء در R متد ندارند (اگر در مورد کلاس های S3 صحبت کنیم، اما پیاده سازی های OOP دیگری وجود دارند که بسیار کمتر رایج هستند). فقط توابع تعمیم یافته ای وجود دارند که بسته به کلاس شی، آنها را به طور متفاوتی پردازش می کنند.

خطوط لوله

شاید این نام برای pandas کاملاً درست نخواهد بود، اما سعی می کنم معنی آن را توضیح دهم.

برای اینکه محاسبات میانی را ذخیره نکنید و اشیاء غیر ضروری در محیط کار تولید نکنید، می توانید از نوعی خط لوله استفاده کنید. آن ها نتیجه یک محاسبه را از یک تابع به تابع دیگر منتقل کنید و نتایج میانی را ذخیره نکنید.

بیایید مثال کد زیر را در نظر بگیریم، جایی که محاسبات میانی را در اشیاء جداگانه ذخیره می کنیم:

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

ما 3 عملیات را به صورت متوالی انجام دادیم و نتیجه هر کدام در یک شی جداگانه ذخیره شد. اما در واقع ما به این اشیاء میانی نیازی نداریم.

یا حتی بدتر، اما برای کاربران اکسل آشناتر.

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

در این مورد، ما نتایج محاسبات میانی را ذخیره نکردیم، اما خواندن کد با توابع تو در تو بسیار ناخوشایند است.

ما به چندین روش برای پردازش داده ها در R نگاه خواهیم کرد و آنها عملیات مشابه را به روش های مختلف انجام می دهند.

خطوط لوله در کتابخانه tidyverse توسط اپراتور پیاده سازی شده است %>%.

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

بنابراین ما نتیجه کار را می گیریم func1() و آن را به عنوان اولین آرگومان به func2()، سپس نتیجه این محاسبه را به عنوان آرگومان اول ارسال می کنیم func3(). و در پایان تمام محاسبات انجام شده را در شیء می نویسیم obj <-.

تمام موارد فوق بهتر از کلمات توسط این میم نشان داده شده است:
کدام زبان را برای کار با داده انتخاب کنیم - R یا Python؟ هر دو! مهاجرت از پانداها به tidyverse و data.table و برگشت

В data.table زنجیر به روشی مشابه استفاده می شود.

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

در هر یک از کروشه ها می توانید از نتیجه عملیات قبلی استفاده کنید.

В pandas چنین عملیاتی با یک نقطه از هم جدا می شوند.

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

آن ها میزمان را می گیریم df و از روش او استفاده کنید fun1()، سپس روش را روی نتیجه به دست آمده اعمال می کنیم fun2()بعد از fun3(). نتیجه به دست آمده در یک شی ذخیره می شود اعتراض .

ساختارهای داده

ساختارهای داده در R و Python مشابه هستند، اما نام های متفاوتی دارند.

شرح
نام در R
نام در پایتون/پاندا

ساختار جدول
داده.قاب، داده.جدول، تیبل
DataFrame

لیست یک بعدی مقادیر
وکتور
سری در پانداها یا لیست در پایتون خالص

ساختار غیر جدولی چند سطحی
فهرست کنید
فرهنگ لغت (دیکته)

در زیر به برخی از ویژگی ها و تفاوت های دیگر در نحو نگاه خواهیم کرد.

چند کلمه در مورد بسته هایی که استفاده خواهیم کرد

ابتدا کمی در مورد بسته هایی که در این مقاله با آنها آشنا می شوید به شما می گویم.

مرتب

وب سایت رسمی: tidyverse.org
کدام زبان را برای کار با داده انتخاب کنیم - R یا Python؟ هر دو! مهاجرت از پانداها به tidyverse و data.table و برگشت
کتابخانه tidyverse نوشته شده توسط هدلی ویکهام، پژوهشگر ارشد در RStudio. tidyverse شامل مجموعه ای چشمگیر از بسته هایی است که پردازش داده ها را ساده می کند، 5 مورد از آنها در 10 بارگیری برتر از مخزن CRAN گنجانده شده است.

هسته اصلی کتابخانه شامل بسته های زیر است: ggplot2, dplyr, tidyr, readr, purrr, tibble, stringr, forcats. هر یک از این بسته ها با هدف حل یک مشکل خاص است. مثلا dplyr ایجاد شده برای دستکاری داده ها، tidyr برای آوردن داده ها به یک فرم منظم، stringr کار با رشته ها را ساده می کند و ggplot2 یکی از محبوب ترین ابزارهای تجسم داده است.

مزیت tidyverse سادگی و خواندن آسان نحو است که از بسیاری جهات شبیه به زبان پرس و جو SQL است.

جدول داده

کدام زبان را برای کار با داده انتخاب کنیم - R یا Python؟ هر دو! مهاجرت از پانداها به tidyverse و data.table و برگشتوب سایت رسمی: r-datatable.com

نویسنده data.table مت دول از H2O.ai است.

اولین انتشار این کتابخانه در سال 2006 انجام شد.

نحو بسته به راحتی نیست tidyverse و بیشتر یادآور دیتافریم های کلاسیک در R است، اما در عین حال به طور قابل توجهی در عملکرد گسترش یافته است.

تمام دستکاری‌ها با جدول در این بسته در کروشه توضیح داده شده‌اند و اگر نحو را ترجمه کنید data.table در SQL چیزی شبیه این دریافت می کنید: data.table[ WHERE, SELECT, GROUP BY ]

نقطه قوت این پکیج سرعت پردازش حجم زیاد داده است.

پانداها

وب سایت رسمی: pandas.pydata.org کدام زبان را برای کار با داده انتخاب کنیم - R یا Python؟ هر دو! مهاجرت از پانداها به tidyverse و data.table و برگشت

نام این کتابخانه از اصطلاح اقتصاد سنجی "داده های تابلویی" گرفته شده است که برای توصیف مجموعه های ساختار یافته چند بعدی از اطلاعات استفاده می شود.

نویسنده pandas وس مک کینی آمریکایی است.

وقتی صحبت از تجزیه و تحلیل داده ها در پایتون می شود، برابر است pandas خیر یک بسته بسیار چند منظوره و سطح بالا که به شما امکان می دهد هر گونه دستکاری با داده ها، از بارگذاری داده ها از هر منبعی گرفته تا تجسم آن را انجام دهید.

نصب بسته های اضافی

بسته های مورد بحث در این مقاله در توزیع های اصلی R و Python گنجانده نشده اند. اگرچه یک اخطار کوچک وجود دارد، اگر توزیع Anaconda را نصب کرده اید، سپس آن را نصب کنید pandas مورد نیاز نمی باشد.

نصب پکیج ها در R

اگر حداقل یک بار محیط توسعه RStudio را باز کرده باشید، احتمالاً قبلاً می دانید که چگونه بسته مورد نیاز را در R نصب کنید. برای نصب بسته ها، از دستور استاندارد استفاده کنید. install.packages() با اجرای مستقیم آن در خود R.

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

پس از نصب، بسته ها باید متصل شوند که در بیشتر موارد از دستور استفاده می شود library().

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

نصب پکیج در پایتون

بنابراین، اگر پایتون خالص را نصب کرده اید، پس pandas شما باید آن را به صورت دستی نصب کنید. بسته به سیستم عامل خود یک خط فرمان یا ترمینال را باز کنید و دستور زیر را وارد کنید.

pip install pandas

سپس به پایتون برمی گردیم و بسته نصب شده را با دستور وارد می کنیم import.

import pandas as pd

در حال بارگیری داده ها

داده کاوی یکی از مهم ترین مراحل در تجزیه و تحلیل داده ها است. هر دو پایتون و R، در صورت تمایل، فرصت های گسترده ای را برای به دست آوردن داده ها از هر منبعی در اختیار شما قرار می دهند: فایل های محلی، فایل ها از اینترنت، وب سایت ها، انواع پایگاه های داده.

کدام زبان را برای کار با داده انتخاب کنیم - R یا Python؟ هر دو! مهاجرت از پانداها به tidyverse و data.table و برگشت

در طول مقاله از چندین مجموعه داده استفاده خواهیم کرد:

  1. دو بار دانلود از گوگل آنالیتیکس.
  2. مجموعه اطلاعات مسافران تایتانیک

تمام داده ها در اختیار من است GitHub در قالب فایل های csv و tsv. از کجا آنها را درخواست خواهیم کرد؟

بارگیری داده ها در R: tidyverse، vroom، reader

برای بارگذاری داده ها در یک کتابخانه tidyverse دو بسته وجود دارد: vroom, readr. vroom مدرن تر است، اما در آینده ممکن است بسته ها ترکیب شوند.

نقل قول از اسناد رسمی vroom.

vroom در مقابل خواننده
انتشار چه می کند vroom معنی برای readr? در حال حاضر قصد داریم اجازه دهیم این دو بسته به طور جداگانه تکامل یابند، اما احتمالاً در آینده بسته‌ها را متحد خواهیم کرد. یکی از معایب خواندن تنبل vroom این است که برخی از مشکلات داده نمی توانند از قبل گزارش شوند، بنابراین بهترین روش برای یکسان سازی آنها نیاز به تفکر دارد.

vroom در مقابل خواننده
آزادی یعنی چه؟ vroom برای readr? در حال حاضر قصد داریم هر دو بسته را به طور جداگانه توسعه دهیم، اما احتمالاً در آینده آنها را ترکیب خواهیم کرد. یکی از مضرات تنبلی خواندن vroom این است که برخی از مشکلات مربوط به داده ها را نمی توان از قبل گزارش کرد، بنابراین باید در مورد بهترین روش ترکیب آنها فکر کنید.

در این مقاله ما به هر دو بسته بارگذاری داده نگاه خواهیم کرد:

بارگیری داده ها در بسته 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")

بارگذاری داده ها در R: Reader

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

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

در بسته vroom، صرف نظر از فرمت داده csv / tsv، بارگیری با تابعی به همین نام انجام می شود vroom()، در بسته بندی readr ما برای هر فرمت از یک تابع متفاوت استفاده می کنیم read_tsv() и read_csv().

بارگیری داده ها در R: data.table

В data.table یک تابع برای بارگیری داده ها وجود دارد fread().

بارگیری داده ها در بسته 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")

بارگیری داده ها در پایتون: پانداها

اگر ما با بسته های R مقایسه کنیم، در این مورد نحو نزدیکترین به pandas اراده readr، زیرا pandas می تواند داده ها را از هر جایی درخواست کند، و یک خانواده کامل از توابع در این بسته وجود دارد read_*().

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

و بسیاری از توابع دیگر که برای خواندن داده ها از فرمت های مختلف طراحی شده اند. اما برای اهداف ما کافی است read_table() یا read_csv() با استفاده از استدلال سپتامبر برای تعیین جداکننده ستون.

بارگیری داده ها در پایتون: پانداها

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

ایجاد دیتافریم

جدول وابسته به عنصر تیتانیوم، که بارگذاری کردیم، یک فیلد وجود دارد ارتباط جنسی، که شناسه جنسیت مسافر را ذخیره می کند.

اما برای ارائه راحت‌تر داده‌ها از نظر جنسیت مسافر، باید از نام به جای کد جنسیت استفاده کنید.

برای انجام این کار، یک فهرست کوچک ایجاد می کنیم، جدولی که در آن به ترتیب تنها 2 ستون (کد و نام جنسیت) و 2 ردیف وجود دارد.

ایجاد یک دیتافریم در R: tidyverse، dplyr

در مثال کد زیر با استفاده از تابع دیتافریم مورد نظر را ایجاد می کنیم tibble() .

ایجاد یک دیتافریم در R: dplyr

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

ایجاد یک دیتافریم در R: data.table

ایجاد یک دیتافریم در R: data.table

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

ایجاد یک دیتافریم در پایتون: پانداها

В pandas ایجاد فریم ها در چند مرحله انجام می شود، ابتدا یک دیکشنری ایجاد می کنیم و سپس دیکشنری را به دیتافریم تبدیل می کنیم.

ایجاد یک دیتافریم در پایتون: پانداها

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

انتخاب ستون ها

جداولی که با آنها کار می کنید ممکن است حاوی ده ها یا حتی صدها ستون داده باشد. اما برای انجام تجزیه و تحلیل، به عنوان یک قاعده، به تمام ستون های موجود در جدول منبع نیاز ندارید.

کدام زبان را برای کار با داده انتخاب کنیم - R یا Python؟ هر دو! مهاجرت از پانداها به tidyverse و data.table و برگشت

بنابراین، یکی از اولین عملیاتی که با جدول منبع انجام می دهید، پاک کردن آن از اطلاعات غیر ضروری و آزاد کردن حافظه ای است که این اطلاعات اشغال می کند.

انتخاب ستون ها در R: tidyverse، dplyr

نحو dplyr بسیار شبیه به زبان پرس و جوی SQL است، اگر با آن آشنایی داشته باشید به سرعت بر این بسته مسلط خواهید شد.

برای انتخاب ستون ها، از تابع استفاده کنید select().

در زیر نمونه‌هایی از کد وجود دارد که می‌توانید ستون‌ها را به روش‌های زیر انتخاب کنید:

  • فهرست کردن نام ستون های مورد نیاز
  • با استفاده از عبارات منظم به نام ستون ها مراجعه کنید
  • بر اساس نوع داده یا هر ویژگی دیگری از داده های موجود در ستون

انتخاب ستون ها در 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)

انتخاب ستون ها در R: data.table

همان عملیات در data.table کمی متفاوت اجرا می‌شوند، در ابتدای مقاله توضیحی درباره اینکه چه آرگومان‌هایی در داخل کروشه‌ها وجود دارند، ارائه کردم data.table.

DT[i,j,by]

که در آن:
من - کجا، یعنی. فیلتر کردن بر اساس ردیف
j - انتخاب|به‌روزرسانی|انجام دهید، یعنی. انتخاب ستون ها و تبدیل آنها
توسط - گروه بندی داده ها

انتخاب ستون ها در 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$")]

متغیر .SD به شما امکان می دهد به تمام ستون ها دسترسی داشته باشید، و .SDcols ستون های مورد نیاز را با استفاده از عبارات منظم یا توابع دیگر برای فیلتر کردن نام ستون های مورد نیاز فیلتر کنید.

انتخاب ستون ها در پایتون، پانداها

برای انتخاب ستون ها بر اساس نام در pandas کافی است فهرستی از اسامی آنها ارائه شود. و برای انتخاب یا حذف ستون ها با نام با استفاده از عبارات منظم، باید از توابع استفاده کنید drop() и filter()، و استدلال محور=1، که با آن نشان می دهید که پردازش ستون ها به جای ردیف ها ضروری است.

برای انتخاب یک فیلد بر اساس نوع داده، از تابع استفاده کنید select_dtypes()، و به استدلال شامل یا محروم کردن لیستی از انواع داده را ارسال کنید که مربوط به فیلدهایی است که باید انتخاب کنید.

انتخاب ستون ها در پایتون: پانداها

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

فیلتر کردن ردیف ها

به عنوان مثال، جدول منبع ممکن است حاوی چندین سال داده باشد، اما شما فقط باید ماه گذشته را تجزیه و تحلیل کنید. باز هم، خطوط اضافی روند پردازش داده ها را کند می کند و حافظه رایانه شخصی را مسدود می کند.

کدام زبان را برای کار با داده انتخاب کنیم - R یا Python؟ هر دو! مهاجرت از پانداها به tidyverse و data.table و برگشت

فیلتر کردن ردیف ها در R: tydyverse، dplyr

В dplyr این تابع برای فیلتر کردن ردیف ها استفاده می شود filter(). یک دیتافریم به عنوان آرگومان اول می گیرد، سپس شرایط فیلتر را فهرست می کنید.

هنگام نوشتن عبارات منطقی برای فیلتر کردن جدول، در این مورد، نام ستون ها را بدون نقل قول و بدون اعلام نام جدول مشخص کنید.

هنگام استفاده از چندین عبارت منطقی برای فیلتر کردن، از عملگرهای زیر استفاده کنید:

  • & یا کاما - AND منطقی
  • | - منطقی یا

فیلتر کردن ردیف ها در R: dplyr

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

فیلتر کردن ردیف ها در R: data.table

همانطور که قبلاً در بالا نوشتم، در data.table نحو تبدیل داده در براکت مربع محصور شده است.

DT[i,j,by]

که در آن:
من - کجا، یعنی. فیلتر کردن بر اساس ردیف
j - انتخاب|به‌روزرسانی|انجام دهید، یعنی. انتخاب ستون ها و تبدیل آنها
توسط - گروه بندی داده ها

آرگومان برای فیلتر کردن ردیف ها استفاده می شود i، که جایگاه اول را در براکت دارد.

ستون ها در عبارات منطقی بدون علامت نقل قول و بدون تعیین نام جدول قابل دسترسی هستند.

عبارات منطقی به همان شکلی با یکدیگر مرتبط هستند dplyr از طریق عملگرهای & و |

فیلتر کردن ردیف ها در R: data.table

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

فیلتر کردن رشته ها در پایتون: پانداها

فیلتر بر اساس ردیف در pandas شبیه فیلتر کردن در data.table، و در پرانتز انجام می شود.

در این حالت، دسترسی به ستون ها لزوماً با نشان دادن نام قاب داده انجام می شود؛ سپس نام ستون را می توان در علامت نقل قول در براکت های مربع نیز نشان داد (مثال df['col_name']، یا بدون مظنه پس از دوره (مثال df.col_name).

اگر نیاز دارید که یک دیتافریم را با چند شرط فیلتر کنید، هر شرط باید در پرانتز قرار گیرد. شرایط منطقی توسط عملگرها با یکدیگر مرتبط می شوند & и |.

فیلتر کردن رشته ها در پایتون: پانداها

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

گروه بندی و تجمیع داده ها

یکی از متداول ترین عملیات مورد استفاده در تجزیه و تحلیل داده ها، گروه بندی و تجمیع است.

کدام زبان را برای کار با داده انتخاب کنیم - R یا Python؟ هر دو! مهاجرت از پانداها به tidyverse و data.table و برگشت

سینتکس برای انجام این عملیات در تمام بسته هایی که بررسی می کنیم پراکنده است.

در این مورد، ما یک دیتافریم را به عنوان مثال در نظر می گیریم وابسته به عنصر تیتانیومو تعداد و میانگین هزینه بلیط ها را بسته به کلاس کابین محاسبه کنید.

گروه بندی و تجمیع داده ها در R: tidyverse، dplyr

В dplyr تابع برای گروه بندی استفاده می شود group_by()، و برای تجمیع summarise(). در حقیقت، dplyr یک خانواده کامل از توابع وجود دارد summarise_*()، اما هدف این مقاله مقایسه نحو اصلی است، بنابراین ما وارد چنین جنگلی نمی شویم.

توابع عمومی تجمع:

  • sum() - جمع بندی
  • min() / max() - حداقل و حداکثر مقدار
  • mean() - میانگین
  • median() - میانه
  • length() - تعداد

گروه بندی و تجمیع در R: dplyr

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

در عمل group_by() جدول را به عنوان اولین آرگومان پاس کردیم وابسته به عنصر تیتانیومو سپس فیلد را نشان داد پی کلاس، که به وسیله آن جدول خود را گروه بندی می کنیم. نتیجه این عملیات با استفاده از اپراتور %>% به عنوان اولین آرگومان تابع ارسال می شود summarise()و 2 فیلد دیگر اضافه کرد: مسافران и میانگین_قیمت. در اول، با استفاده از تابع length() محاسبه تعداد بلیط، و در دوم با استفاده از تابع mean() میانگین قیمت بلیط را دریافت کرد.

گروه بندی و تجمیع داده ها در R: data.table

В data.table آرگومان برای تجمیع استفاده می شود j که دارای موقعیت دوم در کروشه و برای گروه بندی است by یا keyby، که مقام سوم را دارند.

فهرست توابع تجمع در این مورد با آنچه در توضیح داده شده است یکسان است dplyr، زیرا اینها توابعی از نحو اصلی R هستند.

گروه بندی و تجمیع در R: data.table

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

گروه بندی و تجمیع داده ها در پایتون: پانداها

گروه بندی در pandas شبیه به dplyr، اما تجمع مشابه نیست dplyr نه در data.table.

برای گروه بندی، از روش استفاده کنید groupby()، که باید لیستی از ستون‌ها را که بر اساس آن چارچوب داده گروه‌بندی می‌شود، ارسال کنید.

برای تجمیع می توانید از روش استفاده کنید agg()که دیکشنری می پذیرد. کلیدهای فرهنگ لغت ستون هایی هستند که روی آنها توابع تجمع را اعمال می کنید و مقادیر نام توابع تجمع هستند.

توابع تجمع:

  • sum() - جمع بندی
  • min() / max() - حداقل و حداکثر مقدار
  • mean() - میانگین
  • median() - میانه
  • count() - تعداد

تابع reset_index() در مثال زیر برای بازنشانی ایندکس های تودرتو استفاده می شود که pandas پیش‌فرض پس از تجمع داده‌ها است.

نماد به شما اجازه می دهد تا به خط بعدی بروید.

گروه بندی و تجمیع در پایتون: پانداها

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

اتصال عمودی جداول

عملیاتی که در آن شما دو یا چند جدول از یک ساختار را به هم متصل می کنید. داده هایی که بارگذاری کردیم حاوی جداول است ga_nov и ga_dec. این جداول از نظر ساختار یکسان هستند، یعنی. ستون ها و انواع داده ها در این ستون ها یکسان است.

کدام زبان را برای کار با داده انتخاب کنیم - R یا Python؟ هر دو! مهاجرت از پانداها به tidyverse و data.table و برگشت

این یک آپلود از Google Analytics برای ماه های نوامبر و دسامبر است، در این بخش ما این داده ها را در یک جدول ترکیب می کنیم.

اتصال عمودی جداول در R: tidyverse، dplyr

В dplyr با استفاده از تابع می توانید 2 جدول را در یک جدول ترکیب کنید bind_rows()، ارسال جداول به عنوان آرگومان های آن.

فیلتر کردن ردیف ها در R: dplyr

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

پیوستن عمودی جداول در R: data.table

همچنین هیچ چیز پیچیده ای نیست، بیایید استفاده کنیم rbind().

فیلتر کردن ردیف ها در R: data.table

## data.table
rbind(ga_nov, ga_dec)

پیوستن عمودی جداول در پایتون: پانداها

В pandas تابع برای پیوستن به جداول استفاده می شود concat()، که برای ترکیب آنها باید لیستی از فریم ها را وارد کنید.

فیلتر کردن رشته ها در پایتون: پانداها

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

اتصال افقی جداول

عملیاتی که در آن ستون های دوم با کلید به جدول اول اضافه می شوند. اغلب هنگام غنی سازی یک جدول حقایق (به عنوان مثال، یک جدول با داده های فروش) با برخی داده های مرجع (مثلاً هزینه یک محصول) استفاده می شود.

کدام زبان را برای کار با داده انتخاب کنیم - R یا Python؟ هر دو! مهاجرت از پانداها به tidyverse و data.table و برگشت

چندین نوع اتصال وجود دارد:

کدام زبان را برای کار با داده انتخاب کنیم - R یا Python؟ هر دو! مهاجرت از پانداها به tidyverse و data.table و برگشت

در جدول بارگذاری شده قبلی وابسته به عنصر تیتانیوم ما یک ستون داریم ارتباط جنسی، که با کد جنسیت مسافر مطابقت دارد:

1 - ماده
2 - نر

همچنین، ما یک جدول - یک کتاب مرجع ایجاد کرده ایم جنس. برای ارائه راحت‌تر داده‌ها در مورد جنسیت مسافران، باید نام جنسیت را از فهرست فهرست اضافه کنیم. جنس به میز وابسته به عنصر تیتانیوم.

اتصال جدول افقی در R: tidyverse، dplyr

В dplyr یک خانواده کامل از توابع برای اتصال افقی وجود دارد:

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

رایج ترین مورد استفاده در تمرین من است left_join().

به عنوان دو آرگومان اول، توابع فهرست شده در بالا دو جدول برای پیوستن به یکدیگر و به عنوان آرگومان سوم می گیرند by شما باید ستون ها را برای پیوستن مشخص کنید.

اتصال جدول افقی در R: dplyr

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

پیوستن افقی جداول در R: data.table

В data.table شما باید جداول را با کلید با استفاده از تابع بپیوندید merge().

تابع آرگومان هایی برای ادغام() در data.table

  • x، y - جداول برای پیوستن
  • توسط - ستونی که در صورت داشتن نام یکسان در هر دو جدول، کلید اتصال است
  • by.x، by.y - نام ستون‌هایی که باید ادغام شوند، اگر نام‌های متفاوتی در جداول داشته باشند.
  • all, all.x, all.y — Join type، all همه سطرها را از هر دو جدول برمی گرداند، all.x مربوط به عملیات LEFT JOIN (همه سطرهای جدول اول را ترک می کند)، all.y - مربوط به عملیات RIGHT JOIN (همه سطرهای جدول دوم را ترک می کند).

پیوستن افقی جداول در R: data.table

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

پیوستن به جدول افقی در پایتون: پانداها

و همچنین در data.tableبه pandas تابع برای پیوستن به جداول استفاده می شود merge().

آرگومان های تابع merge() در پانداها

  • چگونه - نوع اتصال: چپ، راست، بیرونی، داخلی
  • در - ستونی که در هر دو جدول یک کلید است
  • left_on، right_on - نام ستون‌های کلیدی، اگر نام‌های متفاوتی در جداول داشته باشند

پیوستن به جدول افقی در پایتون: پانداها

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

توابع اصلی پنجره و ستون های محاسبه شده

توابع پنجره از نظر معنی مشابه توابع تجمع هستند و همچنین اغلب در تجزیه و تحلیل داده ها استفاده می شوند. اما بر خلاف توابع تجمع، توابع پنجره تعداد ردیف های فریم داده خروجی را تغییر نمی دهند.

کدام زبان را برای کار با داده انتخاب کنیم - R یا Python؟ هر دو! مهاجرت از پانداها به tidyverse و data.table و برگشت

در اصل، با استفاده از تابع پنجره، ما دیتافریم ورودی را بر اساس معیارهایی به قطعات تقسیم می کنیم. با مقدار یک فیلد یا چند فیلد. و روی هر پنجره عملیات حسابی انجام می دهیم. نتیجه این عملیات در هر خط بازگردانده می شود، یعنی. بدون تغییر تعداد کل ردیف های جدول.

به عنوان مثال، بیایید جدول را در نظر بگیریم وابسته به عنصر تیتانیوم. ما می توانیم محاسبه کنیم که هزینه هر بلیط در کلاس کابین آن چند درصد بوده است.

برای انجام این کار، باید در هر خط هزینه کل بلیط کلاس کابین فعلی که بلیط این خط متعلق به آن است را دریافت کنیم، سپس هزینه هر بلیط را بر هزینه کل بلیط های همان کلاس کابین تقسیم کنیم. .

توابع پنجره در R: tidyverse، dplyr

برای افزودن ستون‌های جدید، بدون استفاده از گروه‌بندی ردیف، در dplyr عملکرد را ارائه می دهد mutate().

می توانید با گروه بندی داده ها بر اساس فیلد، مشکلی که در بالا توضیح داده شد را حل کنید پی کلاس و فیلد را در یک ستون جدید جمع کنید کرایه. سپس جدول را از حالت گروه بندی خارج کرده و مقادیر فیلدها را تقسیم کنید کرایه به اتفاقی که در مرحله قبل افتاد.

توابع پنجره در R: dplyr

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

توابع پنجره در R: data.table

الگوریتم حل مانند حالت قبلی باقی می ماند dplyr، باید جدول را بر اساس فیلد به پنجره ها تقسیم کنیم پی کلاس. در یک ستون جدید مقدار مربوط به گروه مربوط به هر ردیف را خارج کنید و ستونی را اضافه کنید که در آن سهم هزینه هر بلیط را در گروه آن محاسبه کنیم.

برای افزودن ستون های جدید به data.table اپراتور حاضر :=. در زیر نمونه ای از حل یک مشکل با استفاده از پکیج آورده شده است data.table

توابع پنجره در R: data.table

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

توابع پنجره در پایتون: پانداها

یکی از راه های اضافه کردن یک ستون جدید به pandas - از تابع استفاده کنید assign(). برای خلاصه کردن هزینه بلیط ها بر اساس کلاس کابین، بدون گروه بندی ردیف ها، از تابع استفاده می کنیم transform().

در زیر نمونه ای از راه حلی که در آن به جدول اضافه می کنیم آورده شده است وابسته به عنصر تیتانیوم همان 2 ستون

توابع پنجره در پایتون: پانداها

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

جدول مطابقت توابع و روش ها

در زیر جدولی از تطابق بین روش ها برای انجام عملیات مختلف با داده ها در بسته هایی که در نظر گرفته ایم آورده شده است.

شرح
مرتب
جدول داده
پانداها

در حال بارگیری داده ها
vroom()/ readr::read_csv() / readr::read_tsv()
fread()
read_csv()

ایجاد دیتافریم
tibble()
data.table()
dict() + from_dict()

انتخاب ستون ها
select()
استدلال j، موقعیت دوم در پرانتز مربع
لیست ستون های مورد نیاز را در پرانتز می گذاریم / drop() / filter() / select_dtypes()

فیلتر کردن ردیف ها
filter()
استدلال i، موقعیت اول در پرانتز مربع
ما شرایط فیلتر را در پرانتز فهرست می کنیم / filter()

گروه بندی و تجمیع
group_by() + summarise()
استدلال ها j + by
groupby() + agg()

اتحاد عمودی جداول (UNION)
bind_rows()
rbind()
concat()

اتصال افقی جداول (JOIN)
left_join() / *_join()
merge()
merge()

توابع اصلی پنجره و اضافه کردن ستون های محاسبه شده
group_by() + mutate()
استدلال j با استفاده از اپراتور := + استدلال by
transform() + assign()

نتیجه

شاید در مقاله من بهینه ترین پیاده سازی های پردازش داده را توصیف نکردم ، بنابراین خوشحال می شوم اگر اشتباهات من را در نظرات تصحیح کنید یا به سادگی اطلاعات ارائه شده در مقاله را با تکنیک های دیگر کار با داده ها در R / Python تکمیل کنید.

همانطور که در بالا نوشتم، هدف مقاله تحمیل نظر شخص در مورد اینکه کدام زبان بهتر است، نبود، بلکه ساده کردن فرصت یادگیری هر دو زبان، یا در صورت لزوم، مهاجرت بین آنها بود.

اگر مقاله را دوست داشتید، خوشحال خواهم شد که مشترکین جدیدی برای من داشته باشم یوتیوب и تلگرام کانال ها

Опрос

از کدام یک از بسته های زیر در کار خود استفاده می کنید؟

در نظرات می توانید دلیل انتخاب خود را بنویسید.

فقط کاربران ثبت نام شده می توانند در نظرسنجی شرکت کنند. ورود، لطفا.

از کدام بسته پردازش داده استفاده می کنید (می توانید چندین گزینه را انتخاب کنید)

  • ٪۱۰۰مرتب 19

  • ٪۱۰۰داده ها.جدول14

  • ٪۱۰۰پانداها 23

42 کاربر رای دادند. 9 کاربر رای ممتنع دادند.

منبع: www.habr.com

اضافه کردن نظر