Photo by Cristina Gottardi on Unsplash |
Quando criamos um dataframe com a biblioteca pandas esse dataframe tem os seus tipos de dados muito bem definidos. Isso não acontece quando importamos dados de um arquivo CSV. Nesse caso a biblioteca pandas precisar deduzir qual é o tipo de dados. E isso pode causar um aumento no consumo de memoria, já que a biblioteca pode ocupar espaço de armazenar um numero de ponto flutuante quando só precisa ocupar espaço para um inteiro.
Nesse tutorial vamos aprender a definir o tipo de dados de uma coluna. Fazendo isso vamos reduzir a quantidade de memoria utilizada pelo dataframe.
Como reduzir a memoria utilizada mudando o tipo de dado
Vamos utilizar o método info()
para saber o tipo de dado de cada coluna. Com esse método temos um resultado total de quanta memoria o dataframe esta usando.
>>> filmes = pd.read_csv('filmes.csv') >>> filmes.info() <class 'pandas.core.frame.DataFrame'> RangeIndex: 9262 entries, 0 to 9261 Data columns (total 9 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 indice 9262 non-null int64 1 codigo_obra 9262 non-null int64 2 titulo_original 9262 non-null object 3 titulo_brasil 9262 non-null object 4 ano_producao 9259 non-null float64 5 diretor 9262 non-null object 6 razao_social_requerente 9262 non-null object 7 cnpj_requerente 9262 non-null object 8 data_exibicao 9262 non-null object dtypes: float64(1), int64(2), object(6) memory usage: 434.2+ KB
Para saber a quantidade individual que cada coluna esta usando chamamos o método memory_usage()
. O método memory_usage()
retorna uma série com os nomes de cada coluna e a quantidade de memoria utilizada em bytes.
>>> filmes.memory_usage(deep=True) Index 64 indice 74096 codigo_obra 74096 titulo_original 441609 titulo_brasil 474434 ano_producao 74096 diretor 434254 razao_social_requerente 615172 cnpj_requerente 435066 data_exibicao 357076 dtype: int64
No dataframe filmes, a coluna ano_producao
esta ocupando espaço para armazenar números de ponto flutuante, quando na realidade só precisaria ocupar espaço para armazenar inteiros. Por isso esse dataframe esta utilizando mais memoria do que deveria. Podemos resolver isso convertendo os valores da coluna para inteiros.
>>> filmes.info() <class 'pandas.core.frame.DataFrame'> RangeIndex: 9262 entries, 0 to 9261 Data columns (total 9 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 indice 9262 non-null int64 1 codigo_obra 9262 non-null int64 2 titulo_original 9262 non-null object 3 titulo_brasil 9262 non-null object 4 ano_producao 9259 non-null float64 5 diretor 9262 non-null object 6 razao_social_requerente 9262 non-null object 7 cnpj_requerente 9262 non-null object 8 data_exibicao 9262 non-null object dtypes: float64(1), int64(2), object(6) memory usage: 434.2+ KB >>> filmes.info() <class 'pandas.core.frame.DataFrame'> RangeIndex: 9262 entries, 0 to 9261 Data columns (total 9 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 indice 9262 non-null int64 1 codigo_obra 9262 non-null int64 2 titulo_original 9262 non-null object 3 titulo_brasil 9262 non-null object 4 ano_producao 9262 non-null int32 5 diretor 9262 non-null object 6 razao_social_requerente 9262 non-null object 7 cnpj_requerente 9262 non-null object 8 data_exibicao 9262 non-null object dtypes: int32(1), int64(2), object(6) memory usage: 398.0+ KB
Com isso reduzimos o uso de memoria usado pelo dataframe. Nesse dataframe reduzimos pouco, mas imagine um dataframe com gigabytes de dados do tipo float que podem ser convertidos para int.
Reduzir a memoria utilizada por um dataframe pode não ser possível em algumas situações. A situação onde a redução é mais comum é quando importamos dados de um dataset. Por isso é bom analisar os dados e verificar se a conversão é possível.
Referência:
Método read_csv()
Método info()
Método memory_usage()
0 comentários:
Postar um comentário