(Quase) tudo que você precisa saber sobre Pandas

July 20, 2019 | python | pandas |

Pandas é uma biblioteca open source, licenciada pelo BSD, que fornece estruturas de dados de alto desempenho, fáceis de usar e ferramentas de análise de dados para a linguagem de programação Python.

Se você é programador e gosta da área financeira ou é da área financeira e gosta de programar, é essencial conhecer a linguagem de programação Python junto com a biblioteca Pandas.

Quando vamos analisar ações da bolsa de valores, nós pegamos através de uma API externa que nos retorna todos os valores de uma ação em um determinado período na forma de um objeto do Pandas chamado Dataframe.

De acordo com a documentação oficial, um Dataframe é:

Estrutura de dados tabulares bidimensionais mutáveis, potencialmente heterogêneos, com eixos rotulados (linhas e colunas).

O Dataframe possui diversas funções para ser manipulado. Vamos ver algumas delas aqui.

Vamos começar importando o Pandas e chamá-lo de pd.

import pandas as pd

Agora vamos ler o CSV com os valores das ações preferenciais da Petrobras (PETR4) do ano de 2018:

# Uma das colunas desse CSV é o `Date`.
# Vamos setar essa coluna como o índice do dataframe com o parâmetro `index_col`.

petrobras = pd.read_csv('petrobras.csv', index_col='Date')

O read_csv lê um CSV e retorna um Dataframe com todos os valores. Para confirmar o tipo do objeto:

type(petrobras)
pandas.core.frame.DataFrame

Para lermos as 5 primeiras linhas do nosso dataframe, usamos o método head(). Se quisermos ler um número de linhas diferente de 5, basta passar por parâmetro o número desejado.

petrobras.head()
# petrobras.head(3)
# petrobras.head(10)
Date High Low Open Close Volume Adj Close Retorno Diário
2018-01-02 16.549999 16.190001 16.190001 16.549999 33461800.0 15.793664 0.027950
2018-01-03 16.719999 16.370001 16.490000 16.700001 55940900.0 15.936812 0.009064
2018-01-04 16.959999 16.620001 16.780001 16.730000 37064900.0 15.965438 0.001796
2018-01-05 16.860001 16.570000 16.700001 16.830000 26958200.0 16.060867 0.005977
2018-01-08 17.030001 16.709999 16.740000 17.030001 28400000.0 16.251730 0.011884

Já para lermos as últimas 5 linhas do dataframe, temos o tail(). Aqui também podemos passar por parâmetro o número de linhas desejado.

petrobras.tail()
# petrobras.tail(2)
# petrobras.tail(11)
Date High Low Open Close Volume Adj Close Retorno Diário
2018-12-20 22.32 21.350000 22.309999 21.490000 141767000.0 20.682493 -0.034157
2018-12-21 21.98 21.250000 21.400000 21.549999 90384300.0 20.740236 0.002792
2018-12-26 21.68 20.420000 20.590000 21.680000 77104200.0 21.583012 0.040635
2018-12-27 21.98 21.280001 21.520000 21.670000 74083700.0 21.573057 -0.000461
2018-12-28 22.83 22.080000 22.110001 22.680000 61634700.0 22.578539 0.046608

Para ver todos os índices do dataframe:

petrobras.index

    Index(['2018-01-02', '2018-01-03', '2018-01-04', '2018-01-05', '2018-01-08',
           '2018-01-09', '2018-01-10', '2018-01-11', '2018-01-12', '2018-01-15',
           ...
           '2018-12-13', '2018-12-14', '2018-12-17', '2018-12-18', '2018-12-19',
           '2018-12-20', '2018-12-21', '2018-12-26', '2018-12-27', '2018-12-28'],
          dtype='object', name='Date', length=246)

E se quisermos ver o cabeçalho (ou o nome das colunas) do nosso dataframe:

petrobras.columns

    Index(['High', 'Low', 'Open', 'Close', 'Volume', 'Adj Close',
           'Retorno Diário'],
          dtype='object')

Para calcularmos dados estatísticos como média, desvio padrão (std) e amplitude interquartil de cada coluna do dataframe:

petrobras.describe()
  High Low Open Close Volume Adj Close Retorno Diário
count 246.000000 246.000000 246.000000 246.000000 2.460000e+02 246.000000 246.000000
mean 21.393821 20.651748 21.037520 21.000081 6.684552e+07 20.103414 0.002116
std 3.266526 3.172321 3.234649 3.205470 3.198269e+07 3.091664 0.033054
min 14.890000 14.170000 14.260000 14.500000 0.000000e+00 13.865026 -0.148577
25% 19.129999 18.405000 18.682500 18.719999 4.598482e+07 17.935410 -0.014510
50% 21.215000 20.520000 20.700001 20.709999 6.020400e+07 19.777866 0.002385
75% 23.165000 22.652500 23.005000 22.900000 7.806155e+07 21.988045 0.019487
max 28.330000 27.410000 28.260000 28.160000 2.403438e+08 26.994181 0.141336

Para ordenarmos o dataframe por uma coluna específica, temos o método sort_values e nele passamos por parâmetro by o nome da coluna que desejamos ordenar.

petrobras.sort_values(by='Retorno Diário')
Date High Low Open Close Volume Adj Close Retorno Diário
2018-06-01 19.750000 14.900000 19.559999 16.160000 216954700.0 15.452330 -0.148577
2018-05-28 19.200001 16.910000 19.200001 16.910000 134504900.0 16.169487 -0.145960
2018-05-24 20.750000 19.650000 20.049999 20.080000 240343800.0 19.200668 -0.137086
2018-10-02 22.820000 21.900000 22.000000 22.820000 127231800.0 21.875259 0.086667
2018-10-08 26.969999 25.750000 26.940001 26.600000 188109000.0 25.498768 0.110184
2018-05-29 19.440001 17.600000 18.000000 19.299999 181509800.0 18.454824 0.141336

Se quisermos apenas uma coluna do Dataframe:

petrobras['Adj Close']

    Date
    2018-01-02    15.793664
    2018-01-03    15.936812
    2018-01-04    15.965438
    ...           ...    
    2018-12-26    21.583012
    2018-12-27    21.573057
    2018-12-28    22.578539
    Name: Adj Close, Length: 246, dtype: float64

Para trazer apenas algumas linhas no meio do dataframe, é só escrever o intervalo de linhas que precisa.

Por exemplo, para retornar da décima primeira até a décima quinta linha, basta fazer [10:15].

Lembrando que o número à esquerda dos dois pontos é zero-based, por isso 10 é a décima primeira linha. Mas o número à direita é one-based, ou seja, a contagem começa do 1. Então 15 é 15 mesmo. =D

petrobras[10:15]
Date High Low Open Close Volume Adj Close Retorno Diário
2018-01-16 17.840000 17.299999 17.350000 17.650000 58618300.0 16.843393 0.017291
2018-01-17 18.360001 17.809999 17.920000 18.360001 58488900.0 17.520950 0.040227
2018-01-18 18.530001 17.930000 18.350000 18.219999 48575800.0 17.387346 -0.007625
2018-01-19 18.420000 18.030001 18.309999 18.260000 33470200.0 17.425518 0.002195
2018-01-22 18.469999 18.090000 18.260000 18.469999 33920000.0 17.625917 0.011500

Mas se quisermos ver as linhas através do índice, que é uma data:

petrobras['2018-10-01':'2018-10-05']
Date High Low Open Close Volume Adj Close Retorno Diário
2018-10-01 21.360001 20.799999 21.250000 21.000000 56540400.0 20.130608 -0.004267
2018-10-02 22.820000 21.900000 22.000000 22.820000 127231800.0 21.875259 0.086667
2018-10-03 25.420000 23.459999 25.250000 23.790001 152189200.0 22.805101 0.042507
2018-10-04 24.520000 23.209999 23.450001 24.020000 99743300.0 23.025579 0.009668
2018-10-05 24.590000 23.660000 24.490000 23.959999 104693400.0 22.968063 -0.002498

E para ver apenas algumas colunas de algumas datas, usamos o método loc.

petrobras.loc['2018-03-01':'2018-03-10', ['Volume', 'Adj Close']]
Date Volume Adj Close
2018-03-01 66380900.0 20.068930
2018-03-02 52682900.0 20.526993
2018-03-05 54242600.0 21.109116
2018-03-06 57240800.0 20.899170
2018-03-07 50956600.0 20.679682
2018-03-08 36156800.0 20.708311
2018-03-09 45560000.0 21.366777

Para fazer a mesma coisa que acima, mas ao invés de passar o índice propriamente dito e os nomes das colunas, passarmos o número da linha e da coluna, usamos o método iloc.

petrobras.iloc[55:60, 0:2]
Date High Low
2018-03-22 22.040001 21.580000
2018-03-23 22.110001 21.530001
2018-03-26 22.200001 21.840000
2018-03-27 22.180000 21.370001
2018-03-28 21.410000 20.990000

Também podemos fazer condições.

Por exemplo, quero ver todos os dias que houve uma alta maior que 10%:

petrobras[petrobras['Retorno Diário'] > 0.1]
Date High Low Open Close Volume Adj Close Retorno Diário
2018-05-29 19.440001 17.60 18.000000 19.299999 181509800.0 18.454824 0.141336
2018-10-08 26.969999 25.75 26.940001 26.600000 188109000.0 25.498768 0.110184

Ou uma queda maior 10%

petrobras[petrobras['Retorno Diário'] < -0.1]
Date High Low Open Close Volume Adj Close Retorno Diário
2018-05-24 20.750000 19.65 20.049999 20.08 240343800.0 19.200668 -0.137086
2018-05-28 19.200001 16.91 19.200001 16.91 134504900.0 16.169487 -0.145960
2018-06-01 19.750000 14.90 19.559999 16.16 216954700.0 15.452330 -0.148577

Para ver qual foi a média de retorno diário que essa ação teve:

media_diaria = petrobras['Retorno Diário'].mean()
print('{}%'.format(round(media_diaria * 100, 3)))

0.212%

E o desvio padrão (std - standard deviation).

Obs.: o desvio padrão mede a volatilidade dos preços da ação. Quanto maior esse valor, mais volátil ela é.

petrobras['Retorno Diário'].std()

0.0330541216641421

E para plotar um gráfico de uma determinada coluna, é tão simples quanto ver a média ou o desvio padrão.

Obs.: Abaixo eu passei mais um parâmetro que é o tamanho do gráfico: figsize=().

petrobras['Retorno Diário'].plot(figsize=(17,6))

Edit this post on GitHub

Leia também