ما هي اللغة التي تختارها للعمل مع البيانات - 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 tidyverse
    2.2 جدول البيانات
    2.3 الباندا
  3. تثبيت الحزم
  4. تحميل البيانات
  5. إنشاء إطارات البيانات
  6. تحديد الأعمدة التي تحتاجها
  7. تصفية الصفوف
  8. التجميع والتجميع
  9. الاتحاد العمودي للجداول (UNION)
  10. الربط الأفقي للجداول (JOIN)
  11. وظائف النافذة الأساسية والأعمدة المحسوبة
  12. جدول المراسلات بين طرق معالجة البيانات في R وPython
  13. اختتام
  14. استطلاع قصير حول الحزمة التي تستخدمها

إذا كنت مهتمًا بتحليل البيانات، فقد تجد موقعي تيليجرام и موقع YouTube القنوات. معظم محتوياته مخصص للغة R.

الاختلافات النحوية الرئيسية بين R وPython

لتسهيل عليك التبديل من 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 هي لغة وظيفية، وكل شيء فيها مبني على الوظائف. لذلك، على سبيل المثال، بالنسبة لمستخدمي Excel، انتقل إلى tydiverse سيكون أسهل من pandas. على الرغم من أن هذا قد يكون رأيي الشخصي.

باختصار، لا تحتوي الكائنات في R على طرق (إذا تحدثنا عن فئات S3، ولكن هناك تطبيقات OOP أخرى أقل شيوعًا). لا يوجد سوى وظائف عامة تعالجها بشكل مختلف اعتمادًا على فئة الكائن.

خطوط الأنابيب

ربما هذا هو الاسم ل pandas لن يكون صحيحا تماما، ولكن سأحاول شرح المعنى.

من أجل عدم حفظ الحسابات المتوسطة وعدم إنتاج كائنات غير ضرورية في بيئة العمل، يمكنك استخدام نوع من خطوط الأنابيب. أولئك. تمرير نتيجة عملية حسابية من دالة إلى أخرى، ولا تحفظ النتائج المتوسطة.

لنأخذ مثال التعليمات البرمجية التالي، حيث نقوم بتخزين الحسابات الوسيطة في كائنات منفصلة:

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

قمنا بإجراء 3 عمليات بالتتابع، وتم حفظ نتيجة كل منها في كائن منفصل. لكن في الواقع، نحن لسنا بحاجة إلى هذه الأشياء الوسيطة.

أو ما هو أسوأ من ذلك، ولكنه مألوف أكثر لمستخدمي Excel.

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 متشابهة، ولكن لها أسماء مختلفة.

وصف
الاسم في ر
الاسم في بايثون/الباندا

هيكل الجدول
data.frame، data.table، tibble
DataFrame

قائمة القيم أحادية البعد
ناقل
سلسلة في الباندا أو القائمة في بيثون النقي

هيكل متعدد المستويات غير جدولي
قائمة
قاموس (ديكت)

سننظر في بعض الميزات والاختلافات الأخرى في بناء الجملة أدناه.

بضع كلمات حول الحزم التي سنستخدمها

أولاً، سأخبرك قليلاً عن الحزم التي ستتعرف عليها خلال هذه المقالة.

tidyverse

الموقع الرسمي: 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)

تثبيت الحزم في بايثون

لذا، إذا كان لديك Python خالصًا مثبتًا، إذن pandas تحتاج إلى تثبيته يدويًا. افتح سطر الأوامر، أو المحطة الطرفية، اعتمادًا على نظام التشغيل الخاص بك، وأدخل الأمر التالي.

pip install pandas

ثم نعود إلى Python ونستورد الحزمة المثبتة باستخدام الأمر import.

import pandas as pd

تحميل البيانات

يعد التنقيب عن البيانات أحد أهم الخطوات في تحليل البيانات. يوفر لك كل من Python وR، إذا رغبت في ذلك، فرصًا واسعة النطاق للحصول على البيانات من أي مصادر: الملفات المحلية، والملفات من الإنترنت، ومواقع الويب، وجميع أنواع قواعد البيانات.

ما هي اللغة التي تختارها للعمل مع البيانات - R أم Python؟ كلاهما! الهجرة من الباندا إلى tidyverse وdata.table والعودة

سنستخدم خلال المقالة العديد من مجموعات البيانات:

  1. تنزيلان من Google Analytics.
  2. مجموعة بيانات ركاب تيتانيك.

كل البيانات موجودة عندي GitHub جيثب: في شكل ملفات CSV وTSV. ومن أين سنطلبهم؟

تحميل البيانات إلى R: tidyverse، vroom، readr

لتحميل البيانات إلى المكتبة tidyverse هناك حزمتان: vroom, readr. vroom أكثر حداثة، ولكن في المستقبل قد يتم الجمع بين الحزم.

اقتباس من الوثائق الرسمية vroom.

فروم مقابل القارئ
ماذا يعني الافراج عن vroom يعني ل readr؟ في الوقت الحالي، نخطط للسماح للحزمتين بالتطور بشكل منفصل، ولكن من المحتمل أننا سنوحد الحزمتين في المستقبل. أحد عيوب القراءة البطيئة لـ 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: 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")

في الحزمة 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")

تحميل البيانات في بايثون: pandas

إذا قارنا بحزم R، ففي هذه الحالة يكون بناء الجملة هو الأقرب إلى pandas سوف readr، لان pandas يمكن طلب البيانات من أي مكان، وهناك مجموعة كاملة من الوظائف في هذه الحزمة read_*().

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

والعديد من الوظائف الأخرى المصممة لقراءة البيانات من تنسيقات مختلفة. ولكن لأغراضنا هذا يكفي read_table() أو read_csv() باستخدام الوسيطة سبتمبر لتحديد فاصل الأعمدة.

تحميل البيانات في بايثون: pandas

import pandas as pd

ga_nov  = pd.read_csv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/russian_text_in_r/ga_nowember.csv", sep = "t")
ga_dec  = pd.read_csv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/russian_text_in_r/ga_december.csv", sep = "t")
titanic = pd.read_csv("https://raw.githubusercontent.com/selesnow/publications/master/data_example/russian_text_in_r/titanic.csv")

إنشاء إطارات البيانات

الطاولة جبار، الذي قمنا بتحميله، هناك حقل الجنس، الذي يخزن معرف جنس الراكب.

ولكن للحصول على عرض أكثر ملاءمة للبيانات فيما يتعلق بجنس الراكب، يجب عليك استخدام الاسم بدلاً من رمز الجنس.

للقيام بذلك، سنقوم بإنشاء دليل صغير، جدول يحتوي على عمودين فقط (الرمز واسم الجنس) وصفين على التوالي.

إنشاء إطار بيانات في 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]

حيث:
أنا - أين، أي. التصفية حسب الصفوف
ي - حدد|تحديث|افعل، أي. اختيار الأعمدة وتحويلها
حسب - تجميع البيانات

تحديد الأعمدة في 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]

حيث:
أنا - أين، أي. التصفية حسب الصفوف
ي - حدد|تحديث|افعل، أي. اختيار الأعمدة وتحويلها
حسب - تجميع البيانات

يتم استخدام الوسيطة لتصفية الصفوف i، والتي تحتل المركز الأول بين قوسين مربعين.

يتم الوصول إلى الأعمدة بتعبيرات منطقية بدون علامات الاقتباس ودون تحديد اسم الجدول.

ترتبط التعبيرات المنطقية ببعضها البعض بنفس الطريقة كما في dplyr من خلال مشغلي & و |.

تصفية الصفوف في R: data.table

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

تصفية السلاسل في بايثون: pandas

تصفية حسب الصفوف في pandas يشبه التصفية data.table، ويتم بين قوسين مربعين.

في هذه الحالة، يتم الوصول إلى الأعمدة بالضرورة عن طريق الإشارة إلى اسم إطار البيانات؛ ثم يمكن أيضًا الإشارة إلى اسم العمود بين علامات الاقتباس بين قوسين مربعين (مثال df['col_name'])، أو بدون علامات الاقتباس بعد الفترة (مثال df.col_name).

إذا كنت بحاجة إلى تصفية إطار بيانات حسب عدة شروط، فيجب وضع كل شرط بين قوسين. ترتبط الشروط المنطقية مع بعضها البعض من قبل المشغلين & и |.

تصفية السلاسل في بايثون: 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)]

تجميع وتجميع البيانات

إحدى العمليات الأكثر استخدامًا في تحليل البيانات هي التجميع والتجميع.

ما هي اللغة التي تختارها للعمل مع البيانات - R أم Python؟ كلاهما! الهجرة من الباندا إلى tidyverse وdata.table والعودة

إن بناء الجملة الخاص بتنفيذ هذه العمليات منتشر عبر جميع الحزم التي نراجعها.

في هذه الحالة، سوف نأخذ dataframe كمثال جبار، وحساب عدد التذاكر ومتوسط ​​تكلفتها حسب درجة المقصورة.

تجميع وتجميع البيانات في 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()، وأضفت حقلين آخرين: الركاب и متوسط ​​السعر. في الأول، باستخدام الدالة 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 يمكنك دمج جدولين في جدول واحد باستخدام الوظيفة 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()، والتي تحتاج إلى تمرير قائمة الإطارات لدمجها.

تصفية السلاسل في بايثون: pandas

# вертикальное объединение таблиц
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 — نوع الصلة، all سيرجع كل الصفوف من كلا الجدولين، all.x يتوافق مع عملية LEFT JOIN (سوف يترك كل صفوف الجدول الأول)، all.y — يتوافق مع عملية 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().

فيما يلي مثال للحل الذي نضيفه إلى الجدول جبار نفس العمودين.

وظائف النافذة في بايثون: الباندا

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

وظائف وطرق جدول المراسلات

يوجد أدناه جدول المراسلات بين طرق تنفيذ العمليات المختلفة مع البيانات الموجودة في الحزم التي أخذناها في الاعتبار.

وصف
tidyverse
جدول البيانات
الباندا

تحميل البيانات
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.

كما كتبت أعلاه، لم يكن الغرض من المقال فرض الرأي حول أي اللغات هي الأفضل، بل تبسيط فرصة تعلم اللغتين، أو، إذا لزم الأمر، الهجرة بينهما.

إذا أعجبك المقال، سأكون سعيدًا بوجود مشتركين جدد في قناتي موقع YouTube и برقية القنوات.

Опрос

أي من الحزم التالية تستخدمها في عملك؟

في التعليقات يمكنك كتابة سبب اختيارك.

يمكن للمستخدمين المسجلين فقط المشاركة في الاستطلاع. تسجيل الدخول، من فضلك.

ما هي حزمة معالجة البيانات التي تستخدمها (يمكنك تحديد عدة خيارات)

  • 45,2%tidyverse19

  • 33,3%data.table14

  • 54,8%الباندا 23

صوّت 42 مستخدمًا. امتنع 9 مستخدما عن التصويت.

المصدر: www.habr.com

إضافة تعليق