Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Como filtrar um dataset pelas datas?

Olá,

Estou fazendo uma análise que eu tenho um dataframe com dados dos últimos 10 anos com colunas como Empresa, Faturamento e diversas outras colunas com características dessas empresas.

Eu preciso adicionar duas colunas ao final desse dataframe

Uma coluna é mostrando o nome das top 4 empresas em faturamento no último ano móvel (range de mês que vai do mês atual até 1 ano atrás) e caso a empresa não esteja no top 4 ela seja nomeada como Outras

Uma segunda coluna rankeando esses 5 novos valores e colocando o outros sempre como 5º colocado

Alguém consegue dar uma luz?

4 respostas

Olá Eduardo,

Se possível compartilha com a gente esse dataframe por favor, de preferência em csv. Caso não seja possível, manda pelo menos o resultado do código nome_do_dataframe.dtypes e um exemplo de como está o campo com a data (talvez seja preciso fazer alguma conversão).

Oi Lucas

Segue o dtypes, eu já converti o dados['Date (mm/jjjj)'] para o formato de data

Date (mm/jjjj)          datetime64[ns]
Year                             int64
Month                            int64
Week                             int64
Company                       object
Units Panel                      int64
Value Panel                    float64
dtype: object

O que eu consegui fazer até agora foi gerar um negócio que acho que é um dataframe rankeando as empresas pelo Value Panel. Precisava pegar desse filtro as top 5 e fazer aparecer em uma coluna no final do dataframe original o nome delas com o restante aparecendo como outros e depois pegar esse ranking e colocar o numero referente a cada empresa.

Mas nesse código que fiz abaixo dei uma gambiarra no ano móvel T_T

dados.query('Year >= (@currentYear - 1)')['Company'].drop_duplicates()
grupoCompany = dados.groupby('Company')
grupoCompany = pd.DataFrame(data = grupoCompany[['Value Panel']].sum().rank(ascending = False).sort_values('Value Panel'))
grupoCompany.head()
solução!

Você já está no caminho certo, o que complica é as companhias se repetirem, força a gente a criar agrupamentos que acaba aumentando a complexidade um pouco.

Olha se esse código funciona:

# imports
import pandas as pd
import numpy as np
from datetime import datetime, timedelta

# Essas 3 linhas são para somar o faturamento baseado no nome da companhia
# a gente modifica o index para que o "Total Value" seja retornado corretamente para cada companhia já que estamos agrupando para somar o "Value"
dados.set_index('Company', inplace=True)
dados['Total Value'] = dados.groupby('Company').sum()['Value']
dados.reset_index(inplace=True)

# Variável que representa o último ano móvel
last_year = datetime.now() - timedelta(days=365)

# Criação do ranking
# o legal é que mesmo com uma seleção menor que o DataFrame ele ainda cria a Series Rank para as companhias corretas e coloca o resto como NaN
dados['Rank'] = dados[dados['Date'] > last_year]['Total Value'].rank(ascending=False, method='dense')

# Aplica os nomes definidos para o top 4
dados['Top 4 Last Year'] = dados['Rank'].apply(lambda x: x if (x <= 4 or np.isnan(x)) else 'Outras')

# Aplica os nomes definidos para o top 5
dados['Top 5 Last Year'] = dados['Rank'].apply(lambda x: x if (x <= 4 or np.isnan(x)) else 5)
dados['Top 5 Last Year'] = dados['Top 5 Last Year'].apply(lambda x: x if np.isnan(x) else str(int(x)) + 'º')

dados

Espero ter ajudado, se tiver alguma dúvida é só perguntar!

Oi Lucas,

O código rodou

Obrigado :)