segunda-feira, 10 de agosto de 2020

Reduzindo memoria utilizada pelo pandas

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