Qual linguagem escolher para trabalhar com dados - R ou Python? Ambos! Migrando de pandas para tidyverse e data.table e vice-versa

Ao pesquisar R ou Python na Internet, você encontrará milhões de artigos e quilômetros de discussões sobre qual deles é melhor, mais rápido e mais conveniente para trabalhar com dados. Mas, infelizmente, todos estes artigos e disputas não são particularmente úteis.

Qual linguagem escolher para trabalhar com dados - R ou Python? Ambos! Migrando de pandas para tidyverse e data.table e vice-versa

O objetivo deste artigo é comparar as técnicas básicas de processamento de dados nos pacotes mais populares de ambas as linguagens. E ajude os leitores a dominar rapidamente algo que ainda não sabem. Para quem escreve em Python, descubra como fazer a mesma coisa em R e vice-versa.

Durante o artigo analisaremos a sintaxe dos pacotes mais populares em R. Estes são os pacotes incluídos na biblioteca tidyversee também o pacote data.table. E compare sua sintaxe com pandas, o pacote de análise de dados mais popular em Python.

Percorreremos passo a passo todo o caminho da análise de dados, desde o carregamento até a execução de funções de janela analítica usando Python e R.

Conteúdo

Este artigo pode ser usado como uma folha de dicas caso você tenha esquecido como realizar alguma operação de processamento de dados em um dos pacotes em consideração.

Qual linguagem escolher para trabalhar com dados - R ou Python? Ambos! Migrando de pandas para tidyverse e data.table e vice-versa

  1. Principais diferenças de sintaxe entre R e Python
    1.1. Acessando funções de pacote
    1.2. Atribuição
    1.3. Indexação
    1.4. Métodos e OOP
    1.5. Gasodutos
    1.6. Estruturas de dados
  2. Algumas palavras sobre os pacotes que usaremos
    2.1. arrumado
    2.2. Tabela de dados
    2.3. pandas
  3. Instalando pacotes
  4. Carregando dados
  5. Criando quadros de dados
  6. Selecionando as colunas que você precisa
  7. Filtrando linhas
  8. Agrupamento e agregação
  9. União vertical de tabelas (UNION)
  10. Junção horizontal de tabelas (JOIN)
  11. Funções básicas de janela e colunas calculadas
  12. Tabela de correspondência entre métodos de processamento de dados em R e Python
  13. Conclusão
  14. Uma breve pesquisa sobre qual pacote você usa

Se você estiver interessado em análise de dados, você pode encontrar meu telegrama и Youtube canais. A maior parte do conteúdo é dedicada à linguagem R.

Principais diferenças de sintaxe entre R e Python

Para facilitar a mudança de Python para R, ou vice-versa, darei alguns pontos principais aos quais você precisa prestar atenção.

Acessando funções de pacote

Depois que um pacote é carregado no R, você não precisa especificar o nome do pacote para acessar suas funções. Na maioria dos casos isso não é comum em R, mas é aceitável. Você não precisa importar um pacote se precisar de uma de suas funções em seu código, basta chamá-lo especificando o nome do pacote e o nome da função. O separador entre os nomes dos pacotes e das funções em R é dois pontos duplos. package_name::function_name().

Em Python, ao contrário, é considerado clássico chamar as funções de um pacote especificando explicitamente seu nome. Quando um pacote é baixado, geralmente recebe um nome abreviado, por exemplo. pandas geralmente um pseudônimo é usado pd. Uma função de pacote é acessada através de um ponto package_name.function_name().

Atribuição

Em R, é comum usar uma seta para atribuir um valor a um objeto. obj_name <- value, embora um único sinal de igual seja permitido, o único sinal de igual em R é usado principalmente para passar valores para argumentos de função.

Em Python, a atribuição é feita exclusivamente com um único sinal de igual obj_name = value.

Indexação

Também existem diferenças bastante significativas aqui. Em R, a indexação começa em um e inclui todos os elementos especificados no intervalo resultante,

Em Python, a indexação começa em zero e o intervalo selecionado não inclui o último elemento especificado no índice. Então projete x[i:j] em Python não incluirá o elemento j.

Existem também diferenças na indexação negativa, na notação R x[-1] retornará todos os elementos do vetor, exceto o último. Em Python, uma notação semelhante retornará apenas o último elemento.

Métodos e OOP

R implementa OOP à sua maneira, escrevi sobre isso no artigo "OOP na linguagem R (parte 1): classes S3". Em geral, R é uma linguagem funcional e tudo nela é baseado em funções. Portanto, por exemplo, para usuários do Excel, vá para tydiverse será mais fácil do que pandas. Embora esta possa ser minha opinião subjetiva.

Resumindo, objetos em R não possuem métodos (se falarmos de classes S3, mas existem outras implementações OOP que são muito menos comuns). Existem apenas funções generalizadas que os processam de forma diferente dependendo da classe do objeto.

Gasodutos

Talvez este seja o nome para pandas Não será totalmente correto, mas tentarei explicar o significado.

Para não economizar cálculos intermediários e não produzir objetos desnecessários no ambiente de trabalho, pode-se utilizar uma espécie de pipeline. Aqueles. passe o resultado de um cálculo de uma função para outra e não salve resultados intermediários.

Vejamos o seguinte exemplo de código, onde armazenamos cálculos intermediários em objetos separados:

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

Realizamos 3 operações sequencialmente e o resultado de cada uma foi salvo em um objeto separado. Mas, na verdade, não precisamos desses objetos intermediários.

Ou pior ainda, mas mais familiar aos usuários do Excel.

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

Nesse caso, não salvamos os resultados intermediários do cálculo, mas a leitura do código com funções aninhadas é extremamente inconveniente.

Veremos diversas abordagens para processamento de dados em R, e elas realizam operações semelhantes de maneiras diferentes.

Pipelines na biblioteca tidyverse implementado pela operadora %>%.

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

Assim pegamos o resultado do trabalho func1() e passe-o como o primeiro argumento para func2(), então passamos o resultado deste cálculo como o primeiro argumento func3(). E no final escrevemos todos os cálculos realizados no objeto obj <-.

Todos os itens acima são ilustrados melhor do que palavras por este meme:
Qual linguagem escolher para trabalhar com dados - R ou Python? Ambos! Migrando de pandas para tidyverse e data.table e vice-versa

В data.table cadeias são usadas de maneira semelhante.

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

Em cada um dos colchetes você pode usar o resultado da operação anterior.

В pandas tais operações são separadas por um ponto.

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

Aqueles. tomamos nossa mesa df e use o método dela fun1(), então aplicamos o método ao resultado obtido fun2()depois de fun3(). O resultado resultante é salvo em um objeto vol .

Estruturas de dados

As estruturas de dados em R e Python são semelhantes, mas têm nomes diferentes.

descrição
Nome em R
Nome em Python/pandas

Estrutura da tabela
data.frame, data.table, tibble
Quadro de dados

Lista unidimensional de valores
Vetor
Série em pandas ou lista em Python puro

Estrutura não tabular multinível
Lista
Dicionário (ditado)

Veremos alguns outros recursos e diferenças na sintaxe abaixo.

Algumas palavras sobre os pacotes que usaremos

Primeiramente, contarei um pouco sobre os pacotes com os quais você se familiarizará ao longo deste artigo.

arrumado

Site oficial: tidyverse.org
Qual linguagem escolher para trabalhar com dados - R ou Python? Ambos! Migrando de pandas para tidyverse e data.table e vice-versa
Biblioteca tidyverse escrito por Hedley Wickham, cientista pesquisador sênior do RStudio. tidyverse consiste em um conjunto impressionante de pacotes que simplificam o processamento de dados, 5 dos quais estão incluídos nos 10 principais downloads do repositório CRAN.

O núcleo da biblioteca consiste nos seguintes pacotes: ggplot2, dplyr, tidyr, readr, purrr, tibble, stringr, forcats. Cada um desses pacotes visa resolver um problema específico. Por exemplo dplyr criado para manipulação de dados, tidyr para trazer os dados para um formato organizado, stringr simplifica o trabalho com strings e ggplot2 é uma das ferramentas de visualização de dados mais populares.

A vantagem tidyverse é a simplicidade e a sintaxe fácil de ler, que é em muitos aspectos semelhante à linguagem de consulta SQL.

Tabela de dados

Qual linguagem escolher para trabalhar com dados - R ou Python? Ambos! Migrando de pandas para tidyverse e data.table e vice-versaSite oficial: r-datatable.com

Pelo autor data.table é Matt Dole do H2O.ai.

O primeiro lançamento da biblioteca ocorreu em 2006.

A sintaxe do pacote não é tão conveniente quanto em tidyverse e lembra mais os dataframes clássicos em R, mas ao mesmo tempo expandiu significativamente em funcionalidade.

Todas as manipulações com a tabela neste pacote são descritas entre colchetes e se você traduzir a sintaxe data.table no SQL, você obtém algo assim: data.table[ WHERE, SELECT, GROUP BY ]

O ponto forte deste pacote é a velocidade de processamento de grandes quantidades de dados.

pandas

Site oficial: pandas.pydata.org Qual linguagem escolher para trabalhar com dados - R ou Python? Ambos! Migrando de pandas para tidyverse e data.table e vice-versa

O nome da biblioteca vem do termo econométrico “dados em painel”, usado para descrever conjuntos estruturados multidimensionais de informações.

Pelo autor pandas é o americano Wes McKinney.

Quando se trata de análise de dados em Python, igual pandas Não. Um pacote muito multifuncional e de alto nível que permite realizar qualquer manipulação de dados, desde o carregamento de dados de qualquer fonte até sua visualização.

Instalando pacotes adicionais

Os pacotes discutidos neste artigo não estão incluídos nas distribuições básicas de R e Python. Embora haja uma pequena ressalva, se você instalou a distribuição Anaconda, instale adicionalmente pandas não é obrigatório.

Instalando pacotes em R

Se você abriu o ambiente de desenvolvimento RStudio pelo menos uma vez, provavelmente já sabe como instalar o pacote necessário em R. Para instalar pacotes, use o comando padrão install.packages() executando-o diretamente no próprio R.

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

Após a instalação, os pacotes precisam ser conectados, para o que na maioria dos casos o comando é utilizado library().

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

Instalando pacotes em Python

Então, se você tiver Python puro instalado, então pandas você precisa instalá-lo manualmente. Abra uma linha de comando ou terminal, dependendo do seu sistema operacional e digite o seguinte comando.

pip install pandas

Então voltamos ao Python e importamos o pacote instalado com o comando import.

import pandas as pd

Carregando dados

A mineração de dados é uma das etapas mais importantes na análise de dados. Tanto Python quanto R, se desejado, oferecem amplas oportunidades para obter dados de qualquer fonte: arquivos locais, arquivos da Internet, sites, todos os tipos de bancos de dados.

Qual linguagem escolher para trabalhar com dados - R ou Python? Ambos! Migrando de pandas para tidyverse e data.table e vice-versa

Ao longo do artigo usaremos vários conjuntos de dados:

  1. Dois downloads do Google Analytics.
  2. Conjunto de dados de passageiros do Titanic.

Todos os dados estão no meu GitHub na forma de arquivos csv e tsv. De onde iremos solicitá-los?

Carregando dados em R: tidyverse, vroom, readr

Para carregar dados em uma biblioteca tidyverse Existem dois pacotes: vroom, readr. vroom mais moderno, mas no futuro os pacotes poderão ser combinados.

Cite de documentação oficial vroom.

vroom vs leitor
O que a liberação de vroom significa para readr? Por enquanto planejamos deixar os dois pacotes evoluirem separadamente, mas provavelmente uniremos os pacotes no futuro. Uma desvantagem da leitura preguiçosa do vroom é que certos problemas de dados não podem ser relatados antecipadamente, portanto, a melhor forma de unificá-los requer alguma reflexão.

vroom vs readr
O que significa liberação? vroom para readr? No momento planejamos desenvolver ambos os pacotes separadamente, mas provavelmente iremos combiná-los no futuro. Uma das desvantagens da leitura preguiçosa vroom é que alguns problemas com os dados não podem ser relatados antecipadamente, então você precisa pensar na melhor forma de combiná-los.

Neste artigo, veremos os dois pacotes de carregamento de dados:

Carregando dados no pacote 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")

Carregando dados em 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")

No pacote vroom, independente do formato dos dados csv/tsv, o carregamento é realizado pela função de mesmo nome vroom(), Na embalagem readr usamos uma função diferente para cada formato read_tsv() и read_csv().

Carregando dados em R: data.table

В data.table existe uma função para carregar dados fread().

Carregando dados no pacote 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")

Carregando dados em Python: pandas

Se compararmos com os pacotes R, neste caso a sintaxe é mais próxima de pandas vontade readrporque pandas pode solicitar dados de qualquer lugar, e há toda uma família de funções neste pacote read_*().

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

E muitas outras funções projetadas para ler dados de vários formatos. Mas para nossos propósitos é suficiente read_table() ou read_csv() usando argumento setembro para especificar o separador de colunas.

Carregando dados em 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")

Criando quadros de dados

Mesa titânico, que carregamos, há um campo Sexo, que armazena o identificador de gênero do passageiro.

Mas para uma apresentação mais conveniente dos dados em termos de género do passageiro, deverá utilizar o nome em vez do código de género.

Para isso, criaremos um pequeno diretório, uma tabela na qual haverá apenas 2 colunas (código e nome do gênero) e 2 linhas, respectivamente.

Criando um dataframe em R: tidyverse, dplyr

No exemplo de código abaixo, criamos o dataframe desejado usando a função tibble() .

Criando um dataframe em R: dplyr

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

Criando um dataframe em R:data.table

Criando um dataframe em R:data.table

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

Criando um dataframe em Python: pandas

В pandas A criação dos frames é realizada em várias etapas, primeiro criamos um dicionário e depois convertemos o dicionário em um dataframe.

Criando um dataframe em Python: pandas

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

Selecionando Colunas

As tabelas com as quais você trabalha podem conter dezenas ou até centenas de colunas de dados. Mas para realizar a análise, via de regra, não são necessárias todas as colunas que estão disponíveis na tabela de origem.

Qual linguagem escolher para trabalhar com dados - R ou Python? Ambos! Migrando de pandas para tidyverse e data.table e vice-versa

Portanto, uma das primeiras operações que você realizará com a tabela de origem é limpá-la de informações desnecessárias e liberar a memória que essas informações ocupam.

Selecionando colunas em R: tidyverse, dplyr

sintaxe dplyr é muito semelhante à linguagem de consulta SQL, se você estiver familiarizado com ela, dominará rapidamente este pacote.

Para selecionar colunas, use a função select().

Abaixo estão exemplos de código com os quais você pode selecionar colunas das seguintes maneiras:

  • Listando os nomes das colunas obrigatórias
  • Consulte os nomes das colunas usando expressões regulares
  • Por tipo de dados ou qualquer outra propriedade dos dados contidos na coluna

Selecionando colunas em 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)

Selecionando colunas em R: data.table

As mesmas operações em data.table são executados de maneira um pouco diferente, no início do artigo forneci uma descrição de quais argumentos estão entre colchetes em data.table.

DT[i,j,by]

Em que:
eu - onde, ou seja, filtragem por linhas
j - selecione|atualizar|fazer, ou seja, selecionando colunas e convertendo-as
por - agrupamento de dados

Selecionando colunas em 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$")]

Variável .SD permite que você acesse todas as colunas e .SDcols filtre as colunas necessárias usando expressões regulares ou outras funções para filtrar os nomes das colunas necessárias.

Selecionando colunas em Python, pandas

Para selecionar colunas por nome em pandas basta fornecer uma lista de seus nomes. E para selecionar ou excluir colunas por nome usando expressões regulares, você precisa usar as funções drop() и filter()e argumento eixo = 1, com o qual você indica que é necessário processar colunas em vez de linhas.

Para selecionar um campo por tipo de dados, use a função select_dtypes(), e em argumentos incluir ou excluir passe uma lista de tipos de dados correspondentes aos campos que você precisa selecionar.

Selecionando colunas em 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'])

Filtrando linhas

Por exemplo, a tabela de origem pode conter dados de vários anos, mas você só precisa analisar o mês anterior. Novamente, linhas extras retardarão o processo de processamento de dados e obstruirão a memória do PC.

Qual linguagem escolher para trabalhar com dados - R ou Python? Ambos! Migrando de pandas para tidyverse e data.table e vice-versa

Filtrando linhas em R: tydyverse, dplyr

В dplyr a função é usada para filtrar linhas filter(). É necessário um dataframe como primeiro argumento e, em seguida, você lista as condições de filtragem.

Ao escrever expressões lógicas para filtrar uma tabela, neste caso, especifique os nomes das colunas sem aspas e sem declarar o nome da tabela.

Ao usar diversas expressões lógicas para filtrar, use os seguintes operadores:

  • & ou vírgula - AND lógico
  • | - OU lógico

Filtrando linhas em R: dplyr

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

Filtrando linhas em R: data.table

Como já escrevi acima, em data.table a sintaxe de conversão de dados está entre colchetes.

DT[i,j,by]

Em que:
eu - onde, ou seja, filtragem por linhas
j - selecione|atualizar|fazer, ou seja, selecionando colunas e convertendo-as
por - agrupamento de dados

O argumento é usado para filtrar linhas i, que tem a primeira posição entre colchetes.

As colunas são acessadas em expressões lógicas sem aspas e sem especificar o nome da tabela.

As expressões lógicas estão relacionadas entre si da mesma maneira que em dplyr através dos operadores & e |.

Filtrando linhas em R: data.table

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

Filtrando strings em Python: pandas

Filtrar por linhas em pandas semelhante a filtrar em data.table, e é feito entre colchetes.

Neste caso, o acesso às colunas é feito necessariamente indicando o nome do dataframe; então o nome da coluna também pode ser indicado entre aspas entre colchetes (exemplo df['col_name']), ou sem aspas após o ponto (exemplo df.col_name).

Se você precisar filtrar um dataframe por diversas condições, cada condição deverá ser colocada entre parênteses. As condições lógicas são conectadas entre si por operadores & и |.

Filtrando strings em 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)]

Agrupamento e agregação de dados

Uma das operações mais comumente utilizadas na análise de dados é o agrupamento e agregação.

Qual linguagem escolher para trabalhar com dados - R ou Python? Ambos! Migrando de pandas para tidyverse e data.table e vice-versa

A sintaxe para realizar essas operações está espalhada por todos os pacotes que analisamos.

Neste caso, tomaremos um dataframe como exemplo titânico, e calcule a quantidade e o custo médio das passagens dependendo da classe da cabine.

Agrupamento e agregação de dados em R: tidyverse, dplyr

В dplyr a função é usada para agrupar group_by(), e para agregação summarise(). Na verdade, dplyr existe toda uma família de funções summarise_*(), mas o objetivo deste artigo é comparar a sintaxe básica, por isso não entraremos nessa selva.

Funções básicas de agregação:

  • sum() - somatório
  • min() / max() – valor mínimo e máximo
  • mean() - média
  • median() - mediana
  • length() - quantidade

Agrupamento e agregação em R: dplyr

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

Em função group_by() passamos a tabela como primeiro argumento titânico, e então indicou o campo Classe P, pelo qual agruparemos nossa tabela. O resultado desta operação usando o operador %>% passado como primeiro argumento para a função summarise()e adicionei mais 2 campos: passageiros и preço_médio. Na primeira, usando a função length() calculou o número de ingressos, e no segundo usando a função mean() recebeu o preço médio do ingresso.

Agrupamento e agregação de dados em R:data.table

В data.table o argumento é usado para agregação j que tem uma segunda posição entre colchetes, e para agrupar by ou keyby, que ocupam a terceira posição.

A lista de funções de agregação neste caso é idêntica àquela descrita em dplyr, porque estas são funções da sintaxe R básica.

Agrupamento e agregação em R: data.table

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

Agrupamento e agregação de dados em Python: pandas

Agrupando em pandas igual a dplyr, mas a agregação não é semelhante a dplyr não em data.table.

Para agrupar, use o método groupby(), na qual você precisa passar uma lista de colunas pelas quais o dataframe será agrupado.

Para agregação você pode usar o método agg()que aceita um dicionário. As chaves do dicionário são as colunas nas quais você aplicará as funções de agregação e os valores são os nomes das funções de agregação.

Funções de agregação:

  • sum() - somatório
  • min() / max() – valor mínimo e máximo
  • mean() - média
  • median() - mediana
  • count() - quantidade

Função reset_index() no exemplo abaixo, é usado para redefinir índices aninhados que pandas o padrão é após a agregação de dados.

Símbolo permite que você passe para a próxima linha.

Agrupamento e agregação em Python: pandas

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

Junção vertical de tabelas

Uma operação na qual você une duas ou mais tabelas da mesma estrutura. Os dados que carregamos contêm tabelas ga_nov и ga_dec. Essas tabelas são idênticas em estrutura, ou seja, têm as mesmas colunas e os tipos de dados nessas colunas.

Qual linguagem escolher para trabalhar com dados - R ou Python? Ambos! Migrando de pandas para tidyverse e data.table e vice-versa

Este é um upload do Google Analytics para o mês de novembro e dezembro. Nesta seção combinaremos esses dados em uma tabela.

Unindo tabelas verticalmente em R: tidyverse, dplyr

В dplyr Você pode combinar 2 tabelas em uma usando a função bind_rows(), passando tabelas como seus argumentos.

Filtrando linhas em R: dplyr

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

Unindo tabelas verticalmente em R: data.table

Também não é nada complicado, vamos usar rbind().

Filtrando linhas em R: data.table

## data.table
rbind(ga_nov, ga_dec)

Unindo tabelas verticalmente em Python: pandas

В pandas a função é usada para unir tabelas concat(), no qual você precisa passar uma lista de frames para combiná-los.

Filtrando strings em Python: pandas

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

Junção horizontal de tabelas

Uma operação na qual as colunas da segunda são adicionadas à primeira tabela por chave. É frequentemente usado ao enriquecer uma tabela de fatos (por exemplo, uma tabela com dados de vendas) com alguns dados de referência (por exemplo, o custo de um produto).

Qual linguagem escolher para trabalhar com dados - R ou Python? Ambos! Migrando de pandas para tidyverse e data.table e vice-versa

Existem vários tipos de junções:

Qual linguagem escolher para trabalhar com dados - R ou Python? Ambos! Migrando de pandas para tidyverse e data.table e vice-versa

Na tabela carregada anteriormente titânico temos uma coluna Sexo, que corresponde ao código de gênero do passageiro:

1 - feminino
2 - masculino

Além disso, criamos uma tabela - um livro de referência gênero. Para uma apresentação mais conveniente dos dados sobre o sexo dos passageiros, precisamos adicionar o nome do sexo do diretório gênero para a mesa titânico.

Junção de tabela horizontal em R: tidyverse, dplyr

В dplyr Existe toda uma família de funções para união horizontal:

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

O mais comumente usado em minha prática é left_join().

Como os dois primeiros argumentos, as funções listadas acima necessitam de duas tabelas para serem unidas, e como o terceiro argumento by você deve especificar as colunas a serem unidas.

Junção de tabela horizontal em R: dplyr

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

Junção horizontal de tabelas em R: data.table

В data.table Você precisa unir tabelas por chave usando a função merge().

Argumentos para a função merge() em data.table

  • x, y — Tabelas para junção
  • by — Coluna que é a chave para unir se tiver o mesmo nome em ambas as tabelas
  • by.x, by.y — Nomes de colunas a serem mescladas, se tiverem nomes diferentes nas tabelas
  • all, all.x, all.y — tipo Join, all retornará todas as linhas de ambas as tabelas, all.x corresponde à operação LEFT JOIN (deixará todas as linhas da primeira tabela), all.y — corresponde ao Operação RIGHT JOIN (deixará todas as linhas da segunda tabela).

Junção horizontal de tabelas em R: data.table

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

Junção de tabela horizontal em Python: pandas

assim como em data.tableEm pandas a função é usada para unir tabelas merge().

Argumentos da função merge() em pandas

  • como - Tipo de conexão: esquerda, direita, externa, interna
  • on — Coluna que é uma chave se tiver o mesmo nome em ambas as tabelas
  • left_on, right_on — Nomes de colunas-chave, se elas tiverem nomes diferentes nas tabelas

Junção de tabela horizontal em Python: pandas

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

Funções básicas de janela e colunas calculadas

As funções de janela têm significado semelhante às funções de agregação e também são frequentemente usadas na análise de dados. Mas, diferentemente das funções de agregação, as funções de janela não alteram o número de linhas do dataframe de saída.

Qual linguagem escolher para trabalhar com dados - R ou Python? Ambos! Migrando de pandas para tidyverse e data.table e vice-versa

Essencialmente, usando a função window, dividimos o dataframe recebido em partes de acordo com algum critério, ou seja, pelo valor de um campo ou de vários campos. E realizamos operações aritméticas em cada janela. O resultado dessas operações será retornado em cada linha, ou seja. sem alterar o número total de linhas da tabela.

Por exemplo, vamos pegar a mesa titânico. Podemos calcular qual foi a porcentagem do custo de cada passagem dentro de sua classe de cabine.

Para fazer isso, precisamos obter em cada linha o custo total de uma passagem para a classe de cabine atual à qual pertence a passagem desta linha e, em seguida, dividir o custo de cada passagem pelo custo total de todas as passagens da mesma classe de cabine. .

Funções de janela em R: tidyverse, dplyr

Para adicionar novas colunas, sem usar agrupamento de linhas, em dplyr serve função mutate().

Você pode resolver o problema descrito acima agrupando os dados por campo Classe P e somando o campo em uma nova coluna Tarifa. A seguir, desagrupe a tabela e divida os valores dos campos Tarifa ao que aconteceu na etapa anterior.

Funções de janela em R: dplyr

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

Funções de janela em R: data.table

O algoritmo de solução permanece o mesmo que em dplyr, precisamos dividir a tabela em janelas por campo Classe P. Produza em uma nova coluna o valor do grupo correspondente a cada linha, e adicione uma coluna na qual calculamos a parcela do custo de cada ingresso em seu grupo.

Para adicionar novas colunas a data.table operador presente :=. Abaixo está um exemplo de solução de um problema usando o pacote data.table

Funções de janela em R: data.table

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

Funções de janela em Python: pandas

Uma maneira de adicionar uma nova coluna a pandas - use a função assign(). Para resumir o custo das passagens por classe de cabine, sem agrupar linhas, usaremos a função transform().

Abaixo está um exemplo de solução em que adicionamos à tabela titânico as mesmas 2 colunas.

Funções de janela em Python: pandas

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

Tabela de correspondência de funções e métodos

Abaixo está uma tabela de correspondência entre métodos para realizar diversas operações com dados nos pacotes que consideramos.

descrição
arrumado
Tabela de dados
pandas

Carregando dados
vroom()/ readr::read_csv() / readr::read_tsv()
fread()
read_csv()

Criando quadros de dados
tibble()
data.table()
dict() + from_dict()

Selecionando Colunas
select()
argumento j, segunda posição entre colchetes
passamos a lista de colunas obrigatórias entre colchetes / drop() / filter() / select_dtypes()

Filtrando linhas
filter()
argumento i, primeira posição entre colchetes
Listamos as condições de filtragem entre colchetes / filter()

Agrupamento e agregação
group_by() + summarise()
argumentos j + by
groupby() + agg()

União vertical de tabelas (UNION)
bind_rows()
rbind()
concat()

Junção horizontal de tabelas (JOIN)
left_join() / *_join()
merge()
merge()

Funções básicas da janela e adição de colunas calculadas
group_by() + mutate()
argumento j usando o operador := + argumento by
transform() + assign()

Conclusão

Talvez no artigo eu não tenha descrito as implementações de processamento de dados mais ideais, então ficarei feliz se você corrigir meus erros nos comentários ou simplesmente complementar as informações fornecidas no artigo com outras técnicas para trabalhar com dados em R/Python.

Como escrevi acima, o objetivo do artigo não era impor a opinião sobre qual idioma é melhor, mas simplificar a oportunidade de aprender os dois idiomas ou, se necessário, migrar entre eles.

Se você gostou do artigo, ficarei feliz em ter novos assinantes no meu Youtube и telegrama canais.

Опрос

Qual dos seguintes pacotes você usa em seu trabalho?

Nos comentários você pode escrever o motivo da sua escolha.

Apenas usuários registrados podem participar da pesquisa. Entrarpor favor

Qual pacote de processamento de dados você usa (você pode selecionar várias opções)

  • 45,2%arrumado19

  • 33,3%dados.tabela14

  • 54,8%pandas23

42 usuários votaram. 9 usuários se abstiveram.

Fonte: habr.com

Adicionar um comentário