¿Qué idioma elegir para trabajar con datos: R o Python? ¡Ambos! Migrando de pandas a tidyverse y data.table y viceversa

Al buscar R o Python en Internet, encontrará millones de artículos y kilómetros de discusiones sobre cuál es mejor, más rápido y más conveniente para trabajar con datos. Pero, lamentablemente, todos estos artículos y disputas no son particularmente útiles.

¿Qué idioma elegir para trabajar con datos: R o Python? ¡Ambos! Migrando de pandas a tidyverse y data.table y viceversa

El propósito de este artículo es comparar las técnicas básicas de procesamiento de datos en los paquetes más populares de ambos idiomas. Y ayude a los lectores a dominar rápidamente algo que aún no saben. Para aquellos que escriben en Python, descubran cómo hacer lo mismo en R y viceversa.

Durante el artículo analizaremos la sintaxis de los paquetes más populares en R. Estos son los paquetes incluidos en la biblioteca tidyversey también el paquete data.table. Y comparar su sintaxis con pandas, el paquete de análisis de datos más popular en Python.

Recorreremos paso a paso todo el camino del análisis de datos, desde cargarlos hasta realizar funciones de ventana analítica usando Python y R.

contenido

Este artículo puede utilizarse como hoja de referencia si ha olvidado cómo realizar alguna operación de procesamiento de datos en uno de los paquetes considerados.

¿Qué idioma elegir para trabajar con datos: R o Python? ¡Ambos! Migrando de pandas a tidyverse y data.table y viceversa

  1. Principales diferencias de sintaxis entre R y Python
    1.1. Acceder a las funciones del paquete
    1.2. Asignación
    1.3. Indexación
    1.4. Métodos y POO
    1.5. Tuberías
    1.6. Estructuras de datos
  2. Algunas palabras sobre los paquetes que usaremos.
    2.1. tidyverse
    2.2. tabla de datos
    2.3. Los pandas
  3. Instalación de paquetes
  4. Cargando datos
  5. Creando marcos de datos
  6. Seleccionar las columnas que necesita
  7. Filtrar filas
  8. Agrupación y agregación
  9. Unión vertical de mesas (UNION)
  10. Unión horizontal de tablas (JOIN)
  11. Funciones básicas de ventana y columnas calculadas.
  12. Tabla de correspondencia entre métodos de procesamiento de datos en R y Python
  13. Conclusión
  14. Una breve encuesta sobre qué paquete utilizas

Si está interesado en el análisis de datos, puede encontrar mi Telegram. и Youtube canales La mayor parte del contenido está dedicado al lenguaje R.

Principales diferencias de sintaxis entre R y Python

Para que le resulte más fácil cambiar de Python a R, o viceversa, le daré algunos puntos principales a los que debe prestar atención.

Acceder a las funciones del paquete

Una vez que se carga un paquete en R, no es necesario especificar el nombre del paquete para acceder a sus funciones. En la mayoría de los casos esto no es común en R, pero es aceptable. No es necesario importar un paquete en absoluto si necesita una de sus funciones en su código, simplemente llámelo especificando el nombre del paquete y el nombre de la función. El separador entre los nombres de paquetes y funciones en R es dos puntos dobles. package_name::function_name().

En Python, por el contrario, se considera clásico llamar a las funciones de un paquete especificando explícitamente su nombre. Cuando se descarga un paquete, normalmente se le asigna un nombre abreviado, p. pandas normalmente se utiliza un seudónimo pd. Se accede a una función de paquete a través de un punto. package_name.function_name().

Asignación

En R, es común usar una flecha para asignar un valor a un objeto. obj_name <- value, aunque se permite un solo signo igual, el único signo igual en R se usa principalmente para pasar valores a argumentos de funciones.

En Python, la asignación se realiza exclusivamente con un único signo igual obj_name = value.

Indexación

Aquí también hay diferencias bastante significativas. En R, la indexación comienza en uno e incluye todos los elementos especificados en el rango resultante,

En Python, la indexación comienza desde cero y el rango seleccionado no incluye el último elemento especificado en el índice. entonces diseño x[i:j] en Python no incluirá el elemento j.

También hay diferencias en la indexación negativa, en notación R. x[-1] devolverá todos los elementos del vector excepto el último. En Python, una notación similar devolverá sólo el último elemento.

Métodos y POO

R implementa la programación orientada a objetos a su manera, escribí sobre esto en el artículo "OOP en lenguaje R (parte 1): clases S3". En general, R es un lenguaje funcional y todo lo que contiene se basa en funciones. Por lo tanto, por ejemplo, para usuarios de Excel, vaya a tydiverse será más fácil que pandas. Aunque esta puede ser mi opinión subjetiva.

En resumen, los objetos en R no tienen métodos (si hablamos de clases S3, pero hay otras implementaciones de programación orientada a objetos que son mucho menos comunes). Sólo existen funciones generalizadas que los procesan de manera diferente según la clase del objeto.

Tuberías

Quizás este sea el nombre de pandas No será del todo correcto, pero intentaré explicar el significado.

Para no ahorrar cálculos intermedios y no generar objetos innecesarios en el entorno de trabajo, se puede utilizar una especie de canalización. Aquellos. pasar el resultado de un cálculo de una función a la siguiente y no guardar resultados intermedios.

Tomemos el siguiente ejemplo de código, donde almacenamos cálculos intermedios en objetos separados:

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

Realizamos 3 operaciones secuencialmente y el resultado de cada una se guardó en un objeto separado. Pero, de hecho, no necesitamos estos objetos intermedios.

O incluso peor, pero más familiar para los usuarios de Excel.

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

En este caso, no guardamos los resultados de los cálculos intermedios, pero leer código con funciones anidadas es extremadamente inconveniente.

Examinaremos varios enfoques para el procesamiento de datos en R y realizan operaciones similares de diferentes maneras.

Tuberías en la biblioteca tidyverse implementado por el operador %>%.

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

Así tomamos el resultado del trabajo. func1() y pasarlo como primer argumento a func2(), luego pasamos el resultado de este cálculo como primer argumento func3(). Y al final escribimos todos los cálculos realizados en el objeto. obj <-.

Todo lo anterior se ilustra mejor que las palabras con este meme:
¿Qué idioma elegir para trabajar con datos: R o Python? ¡Ambos! Migrando de pandas a tidyverse y data.table y viceversa

В data.table Las cadenas se utilizan de manera similar.

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

En cada uno de los corchetes puedes utilizar el resultado de la operación anterior.

В pandas dichas operaciones están separadas por un punto.

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

Aquellos. tomamos nuestra mesa df y usa su método fun1(), luego aplicamos el método al resultado obtenido fun2()despues de fun3(). El resultado resultante se guarda en un objeto. obj .

Estructuras de datos

Las estructuras de datos en R y Python son similares, pero tienen nombres diferentes.

Descripción
Nombre en R
Nombre en Python/pandas

Estructura de la mesa
marco.de.datos, tabla.de.datos, tibble
Marco de datos

Lista unidimensional de valores.
Vector
Serie en pandas o lista en Python puro

Estructura no tabular de varios niveles
Lista
Diccionario (dictado)

A continuación veremos algunas otras características y diferencias en la sintaxis.

Algunas palabras sobre los paquetes que usaremos.

Primero, te contaré un poco sobre los paquetes con los que te familiarizarás a lo largo de este artículo.

tidyverse

Sitio oficial: tidyverse.org
¿Qué idioma elegir para trabajar con datos: R o Python? ¡Ambos! Migrando de pandas a tidyverse y data.table y viceversa
Biblioteca tidyverse escrito por Hedley Wickham, investigador científico senior de RStudio. tidyverse consta de un impresionante conjunto de paquetes que simplifican el procesamiento de datos, 5 de los cuales están incluidos entre las 10 descargas principales del repositorio CRAN.

El núcleo de la biblioteca consta de los siguientes paquetes: ggplot2, dplyr, tidyr, readr, purrr, tibble, stringr, forcats. Cada uno de estos paquetes está dirigido a resolver un problema específico. Por ejemplo dplyr creado para la manipulación de datos, tidyr para llevar los datos a una forma ordenada, stringr simplifica el trabajo con cuerdas y ggplot2 es una de las herramientas de visualización de datos más populares.

La ventaja tidyverse es la simplicidad y la sintaxis fácil de leer, que es en muchos aspectos similar al lenguaje de consulta SQL.

tabla de datos

¿Qué idioma elegir para trabajar con datos: R o Python? ¡Ambos! Migrando de pandas a tidyverse y data.table y viceversaSitio oficial: r-datatable.com

Por el autor data.table es Matt Dole de H2O.ai.

La primera versión de la biblioteca tuvo lugar en 2006.

La sintaxis del paquete no es tan conveniente como en tidyverse y recuerda más a los marcos de datos clásicos en R, pero al mismo tiempo amplía significativamente su funcionalidad.

Todas las manipulaciones con la tabla en este paquete se describen entre corchetes y si traduce la sintaxis data.table en SQL, obtienes algo como esto: data.table[ WHERE, SELECT, GROUP BY ]

El punto fuerte de este paquete es la velocidad de procesamiento de grandes cantidades de datos.

Los pandas

Sitio oficial: pandas.pydata.org ¿Qué idioma elegir para trabajar con datos: R o Python? ¡Ambos! Migrando de pandas a tidyverse y data.table y viceversa

El nombre de la biblioteca proviene del término econométrico “datos de panel”, utilizado para describir conjuntos de información estructurados multidimensionales.

Por el autor pandas es el estadounidense Wes McKinney.

Cuando se trata de análisis de datos en Python, igual pandas No. Un paquete muy multifuncional y de alto nivel que le permite realizar cualquier manipulación con datos, desde cargar datos de cualquier fuente hasta visualizarlos.

Instalación de paquetes adicionales

Los paquetes analizados en este artículo no están incluidos en las distribuciones básicas de R y Python. Aunque hay una pequeña advertencia, si ha instalado la distribución Anaconda, instálela adicionalmente pandas no es necesario

Instalación de paquetes en R

Si ha abierto el entorno de desarrollo RStudio al menos una vez, probablemente ya sepa cómo instalar el paquete requerido en R. Para instalar paquetes, use el comando estándar install.packages() ejecutándolo directamente en el propio R.

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

Después de la instalación, es necesario conectar los paquetes, para lo cual en la mayoría de los casos se utiliza el comando library().

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

Instalación de paquetes en Python

Entonces, si tienes instalado Python puro, entonces pandas necesitas instalarlo manualmente. Abra una línea de comando o terminal, según su sistema operativo e ingrese el siguiente comando.

pip install pandas

Luego volvemos a Python e importamos el paquete instalado con el comando import.

import pandas as pd

Cargando datos

La minería de datos es uno de los pasos más importantes en el análisis de datos. Tanto Python como R, si lo desea, le brindan amplias oportunidades para obtener datos de cualquier fuente: archivos locales, archivos de Internet, sitios web, todo tipo de bases de datos.

¿Qué idioma elegir para trabajar con datos: R o Python? ¡Ambos! Migrando de pandas a tidyverse y data.table y viceversa

A lo largo del artículo utilizaremos varios conjuntos de datos:

  1. Dos descargas de Google Analytics.
  2. Conjunto de datos de pasajeros del Titanic.

Todos los datos están en mi GitHub en forma de archivos csv y tsv. ¿Dónde los solicitaremos?

Cargando datos en R: tidyverse, vroom, readr

Para cargar datos en una biblioteca tidyverse Hay dos paquetes: vroom, readr. vroom más moderno, pero en el futuro los paquetes podrán combinarse.

Cita de documentación oficial vroom.

vroom vs lector
¿Qué significa la liberación de vroom significado para readr? Por ahora planeamos dejar que los dos paquetes evolucionen por separado, pero probablemente los uniremos en el futuro. Una desventaja de la lectura diferida de vroom es que ciertos problemas de datos no se pueden informar por adelantado, por lo que es necesario pensar un poco en cuál es la mejor manera de unificarlos.

vroom vs lector
¿Qué significa liberación? vroom para readr? Por el momento planeamos desarrollar ambos paquetes por separado, pero probablemente los combinemos en el futuro. Una de las desventajas de la lectura perezosa vroom La razón es que algunos problemas con los datos no se pueden informar con anticipación, por lo que es necesario pensar en la mejor manera de combinarlos.

En este artículo veremos ambos paquetes de carga de datos:

Cargando datos en R: paquete 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")

Cargando datos en 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")

En el paquete vroom, independientemente del formato de datos csv / tsv, la carga se realiza mediante la función del mismo nombre vroom(), en el paquete readr Usamos una función diferente para cada formato. read_tsv() и read_csv().

Cargando datos en R: data.table

В data.table hay una función para cargar datos fread().

Cargando datos en R: paquete 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")

Cargando datos en Python: pandas

Si lo comparamos con los paquetes R, entonces en este caso la sintaxis es la más cercana a pandas voluntad readrporque pandas Puede solicitar datos desde cualquier lugar y hay toda una familia de funciones en este paquete. read_*().

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

Y muchas otras funciones diseñadas para leer datos de varios formatos. Pero para nuestros propósitos es suficiente. read_table() o read_csv() usando argumento sep para especificar el separador de columnas.

Cargando datos en Python: 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")

Creando marcos de datos

Mesa titánico, que cargamos, hay un campo Sexo, que almacena el identificador de género del pasajero.

Pero para una presentación más conveniente de los datos en términos de género del pasajero, se debe utilizar el nombre en lugar del código de género.

Para ello crearemos un pequeño directorio, una tabla en la que solo habrá 2 columnas (código y nombre de género) y 2 filas, respectivamente.

Creando un marco de datos en R: tidyverse, dplyr

En el siguiente ejemplo de código, creamos el marco de datos deseado usando la función tibble() .

Creando un marco de datos en R: dplyr

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

Creando un marco de datos en R: data.table

Creando un marco de datos en R: data.table

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

Creando un marco de datos en Python: pandas

В pandas La creación de marcos se realiza en varias etapas, primero creamos un diccionario y luego convertimos el diccionario en un marco de datos.

Creando un marco de datos en Python: pandas

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

Seleccionar columnas

Las tablas con las que trabaja pueden contener docenas o incluso cientos de columnas de datos. Pero para realizar el análisis, por regla general, no se necesitan todas las columnas que están disponibles en la tabla fuente.

¿Qué idioma elegir para trabajar con datos: R o Python? ¡Ambos! Migrando de pandas a tidyverse y data.table y viceversa

Por tanto, una de las primeras operaciones que realizarás con la tabla fuente es limpiarla de información innecesaria y liberar la memoria que ocupa esa información.

Seleccionar columnas en R: tidyverse, dplyr

sintaxis dplyr es muy similar al lenguaje de consulta SQL; si está familiarizado con él, dominará rápidamente este paquete.

Para seleccionar columnas, use la función select().

A continuación se muestran ejemplos de código con los que puede seleccionar columnas de las siguientes maneras:

  • Listar los nombres de las columnas requeridas
  • Consulte los nombres de las columnas usando expresiones regulares.
  • Por tipo de datos o cualquier otra propiedad de los datos contenidos en la columna

Seleccionar columnas en 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)

Seleccionar columnas en R: data.table

Las mismas operaciones en data.table se realizan de manera ligeramente diferente, al comienzo del artículo proporcioné una descripción de qué argumentos están entre corchetes en data.table.

DT[i,j,by]

Donde:
yo - donde, es decir filtrado por filas
j - seleccionar|actualizar|hacer, es decir seleccionar columnas y convertirlas
por - agrupación de datos

Seleccionar columnas en 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$")]

Variable .SD le permite acceder a todas las columnas, y .SDcols filtre las columnas requeridas usando expresiones regulares u otras funciones para filtrar los nombres de las columnas que necesita.

Seleccionando columnas en Python, pandas

Para seleccionar columnas por nombre en pandas basta con proporcionar una lista de sus nombres. Y para seleccionar o excluir columnas por nombre usando expresiones regulares, debe usar las funciones drop() и filter()y argumento eje = 1, con el que indicas que es necesario procesar columnas en lugar de filas.

Para seleccionar un campo por tipo de datos, utilice la función select_dtypes(), y en argumentos incluir o excluir pase una lista de tipos de datos correspondientes a los campos que necesita seleccionar.

Seleccionar columnas en 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'])

Filtrar filas

Por ejemplo, la tabla fuente puede contener varios años de datos, pero solo es necesario analizar el último mes. Nuevamente, las líneas adicionales ralentizarán el proceso de procesamiento de datos y obstruirán la memoria de la PC.

¿Qué idioma elegir para trabajar con datos: R o Python? ¡Ambos! Migrando de pandas a tidyverse y data.table y viceversa

Filtrado de filas en R: tydyverse, dplyr

В dplyr la función se utiliza para filtrar filas filter(). Toma un marco de datos como primer argumento y luego enumera las condiciones de filtrado.

Al escribir expresiones lógicas para filtrar una tabla, en este caso, especifique los nombres de las columnas sin comillas y sin declarar el nombre de la tabla.

Cuando utilice varias expresiones lógicas para filtrar, utilice los siguientes operadores:

  • & o coma - lógico AND
  • | - lógico O

Filtrado de filas en R: dplyr

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

Filtrado de filas en R: data.table

Como ya escribí anteriormente, en data.table La sintaxis de conversión de datos está entre corchetes.

DT[i,j,by]

Donde:
yo - donde, es decir filtrado por filas
j - seleccionar|actualizar|hacer, es decir seleccionar columnas y convertirlas
por - agrupación de datos

El argumento se utiliza para filtrar filas. i, que tiene la primera posición entre corchetes.

Se accede a las columnas en expresiones lógicas sin comillas y sin especificar el nombre de la tabla.

Las expresiones lógicas están relacionadas entre sí de la misma manera que en dplyr a través de los operadores & y |.

Filtrado de filas en R: data.table

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

Filtrado de cadenas en Python: pandas

Filtrar por filas en pandas similar a filtrar en data.table, y está entre corchetes.

En este caso, el acceso a las columnas se realiza necesariamente indicando el nombre del dataframe; luego el nombre de la columna también se puede indicar entre comillas entre corchetes (ejemplo df['col_name']), o sin comillas después del punto (ejemplo df.col_name).

Si necesita filtrar un marco de datos según varias condiciones, cada condición debe colocarse entre paréntesis. Las condiciones lógicas están conectadas entre sí por operadores. & и |.

Filtrado de cadenas en 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)]

Agrupación y agregación de datos.

Una de las operaciones más utilizadas en el análisis de datos es la agrupación y agregación.

¿Qué idioma elegir para trabajar con datos: R o Python? ¡Ambos! Migrando de pandas a tidyverse y data.table y viceversa

La sintaxis para realizar estas operaciones se encuentra dispersa en todos los paquetes que revisamos.

En este caso, tomaremos un marco de datos como ejemplo. titánicoy calcular el número y coste medio de los billetes en función de la clase de cabina.

Agrupación y agregación de datos en R: tidyverse, dplyr

В dplyr la función se utiliza para agrupar group_by(), y para la agregación summarise(). De hecho, dplyr hay toda una familia de funciones summarise_*(), pero el propósito de este artículo es comparar la sintaxis básica, por lo que no entraremos en esa jungla.

Funciones básicas de agregación:

  • sum() - sumatoria
  • min() / max() – valor mínimo y máximo
  • mean() - promedio
  • median() — mediana
  • length() - cantidad

Agrupación y agregación en R: dplyr

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

En función group_by() Pasamos la tabla como primer argumento. titánico, y luego indicó el campo Pclase, por el cual agruparemos nuestra tabla. El resultado de esta operación utilizando el operador. %>% pasado como primer argumento de la función summarise()y agregó 2 campos más: pasajeros и precio_promedio. En el primero, usando la función length() calculó el número de boletos, y en el segundo usando la función mean() recibió el precio medio del billete.

Agrupación y agregación de datos en R: data.table

В data.table el argumento se utiliza para la agregación j que tiene una segunda posición entre corchetes, y para agrupar by o keyby, que ocupan la tercera posición.

La lista de funciones de agregación en este caso es idéntica a la descrita en dplyr, porque estas son funciones de la sintaxis básica de R.

Agrupación y agregación en R: data.table

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

Agrupación y agregación de datos en Python: pandas

agruparse en pandas Similar a dplyr, pero la agregación no es similar a dplyr de nada data.table.

Para agrupar, utilice el método groupby(), al que debe pasar una lista de columnas por las cuales se agrupará el marco de datos.

Para la agregación puedes usar el método. agg()que acepta un diccionario. Las claves del diccionario son las columnas sobre las que aplicarás las funciones de agregación y los valores son los nombres de las funciones de agregación.

Funciones de agregación:

  • sum() - sumatoria
  • min() / max() – valor mínimo y máximo
  • mean() - promedio
  • median() — mediana
  • count() - cantidad

Función reset_index() en el siguiente ejemplo se utiliza para restablecer índices anidados que pandas El valor predeterminado es después de la agregación de datos.

símbolo le permite pasar a la siguiente línea.

Agrupación y agregación en Python: pandas

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

Unión vertical de mesas.

Una operación en la que unes dos o más tablas de la misma estructura. Los datos que cargamos contienen tablas. ga_nov и ga_dec. Estas tablas son idénticas en estructura, es decir tienen las mismas columnas y los tipos de datos en estas columnas.

¿Qué idioma elegir para trabajar con datos: R o Python? ¡Ambos! Migrando de pandas a tidyverse y data.table y viceversa

Esta es una carga de Google Analytics para el mes de noviembre y diciembre; en esta sección combinaremos estos datos en una tabla.

Unir tablas verticalmente en R: tidyverse, dplyr

В dplyr Puedes combinar 2 tablas en una usando la función bind_rows(), pasando tablas como argumentos.

Filtrado de filas en R: dplyr

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

Unir tablas verticalmente en R: data.table

Tampoco es nada complicado, usemos rbind().

Filtrado de filas en R: data.table

## data.table
rbind(ga_nov, ga_dec)

Unir tablas verticalmente en Python: pandas

В pandas la función se utiliza para unir tablas concat(), al que debes pasar una lista de marcos para combinarlos.

Filtrado de cadenas en Python: pandas

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

Unión horizontal de mesas.

Una operación en la que las columnas de la segunda se agregan a la primera tabla por clave. A menudo se utiliza para enriquecer una tabla de hechos (por ejemplo, una tabla con datos de ventas) con algunos datos de referencia (por ejemplo, el costo de un producto).

¿Qué idioma elegir para trabajar con datos: R o Python? ¡Ambos! Migrando de pandas a tidyverse y data.table y viceversa

Hay varios tipos de uniones:

¿Qué idioma elegir para trabajar con datos: R o Python? ¡Ambos! Migrando de pandas a tidyverse y data.table y viceversa

En la tabla previamente cargada titánico tenemos una columna Sexo, que corresponde al código de género del pasajero:

1 - mujer
2 - masculino

Además, hemos creado una tabla, un libro de referencia. género. Para una presentación más conveniente de los datos sobre el sexo de los pasajeros, debemos agregar el nombre del género del directorio. género a la mesa titánico.

Unión de mesa horizontal en R: tidyverse, dplyr

В dplyr Existe toda una familia de funciones para la unión horizontal:

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

El más utilizado en mi práctica es left_join().

Como los dos primeros argumentos, las funciones enumeradas anteriormente toman dos tablas para unirse, y como tercer argumento by debe especificar las columnas a unir.

Unión de mesa horizontal en R: dplyr

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

Unión horizontal de tablas en R: data.table

В data.table Necesitas unir tablas por clave usando la función merge().

Argumentos para la función merge() en data.table

  • x, y — Tablas para unir
  • by — Columna que es la clave para unir si tiene el mismo nombre en ambas tablas
  • by.x, by.y: nombres de columnas que se fusionarán, si tienen nombres diferentes en las tablas
  • all, all.x, all.y — Tipo de unión, all devolverá todas las filas de ambas tablas, all.x corresponde a la operación LEFT JOIN (dejará todas las filas de la primera tabla), all.y — corresponde a la Operación RIGHT JOIN (dejará todas las filas de la segunda tabla).

Unión horizontal de tablas en R: data.table

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

Unión de mesa horizontal en Python: pandas

así como en data.tableEn pandas la función se utiliza para unir tablas merge().

Argumentos de la función merge() en pandas

  • cómo — Tipo de conexión: izquierda, derecha, exterior, interior
  • on — Columna que es una clave si tiene el mismo nombre en ambas tablas
  • left_on, right_on: nombres de columnas clave, si tienen nombres diferentes en las tablas

Unión de mesa horizontal en Python: pandas

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

Funciones básicas de ventana y columnas calculadas.

Las funciones de ventana tienen un significado similar a las funciones de agregación y también se utilizan a menudo en el análisis de datos. Pero a diferencia de las funciones de agregación, las funciones de ventana no cambian el número de filas del marco de datos saliente.

¿Qué idioma elegir para trabajar con datos: R o Python? ¡Ambos! Migrando de pandas a tidyverse y data.table y viceversa

Esencialmente, usando la función de ventana, dividimos el marco de datos entrante en partes de acuerdo con algún criterio, es decir. por el valor de un campo, o de varios campos. Y realizamos operaciones aritméticas en cada ventana. El resultado de estas operaciones se devolverá en cada línea, es decir sin cambiar el número total de filas de la tabla.

Por ejemplo, tomemos la mesa. titánico. Podemos calcular qué porcentaje fue el coste de cada billete dentro de su clase de cabina.

Para hacer esto, necesitamos obtener en cada línea el costo total de un boleto para la clase de cabina actual a la que pertenece el boleto en esta línea, luego dividir el costo de cada boleto por el costo total de todos los boletos de la misma clase de cabina. .

Funciones de ventana en R: tidyverse, dplyr

Para agregar nuevas columnas, sin utilizar agrupación de filas, en dplyr cumple la función mutate().

Puedes resolver el problema descrito anteriormente agrupando datos por campo. Pclase y sumando el campo en una nueva columna Tarifa. A continuación, desagrupe la tabla y divida los valores de los campos. Tarifa a lo sucedido en el paso anterior.

Funciones de ventana en R: dplyr

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

Funciones de ventana en R: data.table

El algoritmo de solución sigue siendo el mismo que en dplyr, necesitamos dividir la tabla en ventanas por campo Pclase. Genere en una nueva columna el monto para el grupo correspondiente a cada fila y agregue una columna en la que calculamos la participación del costo de cada boleto en su grupo.

Para agregar nuevas columnas a data.table operador presente :=. A continuación se muestra un ejemplo de cómo resolver un problema usando el paquete. data.table

Funciones de ventana en R: data.table

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

Funciones de ventana en Python: pandas

Una forma de agregar una nueva columna a pandas - usa la función assign(). Para resumir el coste de los billetes por clase de cabina, sin agrupar filas, utilizaremos la función transform().

A continuación se muestra un ejemplo de una solución en la que agregamos a la tabla titánico las mismas 2 columnas.

Funciones de ventana en Python: pandas

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

Tabla de correspondencia de funciones y métodos.

A continuación se muestra una tabla de correspondencia entre métodos para realizar diversas operaciones con datos en los paquetes que hemos considerado.

Descripción
tidyverse
tabla de datos
Los pandas

Cargando datos
vroom()/ readr::read_csv() / readr::read_tsv()
fread()
read_csv()

Creando marcos de datos
tibble()
data.table()
dict() + from_dict()

Seleccionar columnas
select()
argumento j, segunda posición entre corchetes
pasamos la lista de columnas requeridas entre corchetes / drop() / filter() / select_dtypes()

Filtrar filas
filter()
argumento i, primera posición entre corchetes
Enumeramos las condiciones de filtrado entre corchetes / filter()

Agrupación y agregación
group_by() + summarise()
аргументы j + by
groupby() + agg()

Unión vertical de mesas (UNION)
bind_rows()
rbind()
concat()

Unión horizontal de tablas (JOIN)
left_join() / *_join()
merge()
merge()

Funciones básicas de ventana y adición de columnas calculadas.
group_by() + mutate()
argumento j usando el operador := + argumento by
transform() + assign()

Conclusión

Quizás en el artículo no describí las implementaciones más óptimas del procesamiento de datos, por lo que me alegraré si corrige mis errores en los comentarios o simplemente complementa la información proporcionada en el artículo con otras técnicas para trabajar con datos en R / Python.

Como escribí anteriormente, el propósito del artículo no era imponer la propia opinión sobre qué idioma es mejor, sino simplificar la oportunidad de aprender ambos idiomas o, si es necesario, migrar entre ellos.

Si te gustó el artículo, estaré encantado de tener nuevos suscriptores en mi Youtube и telegrama canales

Entrevista

¿Cuál de los siguientes paquetes utilizas en tu trabajo?

En los comentarios puedes escribir el motivo de tu elección.

Solo los usuarios registrados pueden participar en la encuesta. Registrarsepor favor

¿Qué paquete de procesamiento de datos utiliza (puede seleccionar varias opciones)?

  • 45,2%tidyverse19

  • 33,3%datos.tabla14

  • 54,8%pandas23

42 usuarios votaron. 9 usuarios se abstuvieron.

Fuente: habr.com

Añadir un comentario