Primeira vez aqui? Seja bem vindo e cheque o FAQ!
x

Como o python pode ser usado para lidar com dados e, particularmente, organização de dados?

+2 votos
941 visitas
perguntada Fev 12, 2016 em Dados e Bases de Dados por estudante (431 pontos)  

Por exemplo, suponha que eu deseje organizar uma base de dados pública... Python é uma boa opção?

Compartilhe

1 Resposta

+1 voto
respondida Fev 12, 2016 por danielcajueiro (5,261 pontos)  

Sim. O Python é uma excelente opção para análise e dados e também para organização de dados.

O Pandas, um dos pacotes construídos para o Python, é uma ferramenta bastante adequada para lidar com bases de dados em geral. Ele foi inspirado nas estruturas de dados do R com o objetivo de permitir se fazer toda a análise de dados dentro do Python (Python ou R?).

Veja abaixo um pequeno exemplo que você pode executar em alguns minutos.

Suponha que você é interessado em Banking e gostaria de trabalhar com as bases de dados públicas oferecidas no Banco Central do Brasil. Nós no passado usamos algumas dessas bases por exemplo no artigo "Tabak, B. M., Fazio, D. M. and Cajueiro, D. O. The Effects of loan portfolio concentration on Brazilian banks' return and risk. Journal of Banking & Finance, v. 35, p. 3065-3076, 2011."

Vou te apresentar um exemplo mínimo para lidar com dados usando o Python.

Vá no site do banco central e baixe as séries chamadas de "Resumo" de Marco 2013 - Dez 2014:

http://www4.bcb.gov.br/top50/port/top50.asp

Você vai baixar um arquivo zip com 8 arquivos do tipo csv. Cada um desses arquivos apresenta dados de um trimestre. O primeiro trimestre Março de 2013 e o último é Dezembro de 2014.

Para você poder trabalhar com esses dados, você precisa seguir os seguintes passos:

1) Identificar regularidades nos arquivos.

2) Carregar os arquivos para o Python.

3) Usar as regularidades para selecionar a parte de interesse dos dados.

4) Usar os dados da forma que achar conveniente.

Esse mesmo procedimento você pode usar para trabalhar com conjuntos de dados mais longos. Cuidado: Dependendo da estrutura dos dados, você precisará olhar para outras regularidades ou irregularidades na sua base. Cada caso é um caso.

Para carregar os arquivos eu uso a biblioteca "glob", que permite que eu saiba recursivamente quais os arquivos que pertencem a minha base de interesse:

import glob

if __name__ == '__main__':
    for file in glob.glob("MyDirectory/*.csv"):
        fileNames.append(file)

    fileNames.sort() 

Essa parte do código simplesmente guarda o nome de todos os arquivos csv do meu diretório de interesse e os ordena por nome. Ordenando pelo nome, eu já estou colocando esses arquivos por ordem de data. Essa é uma das "regularidades" que encontrei nesses arquivos.

Agora desejo carregar os dados de cada um desses arquivos de forma ordenada e guarda-los em uma estrutura adequada, que nesse caso é o dataframe (inspirado no R).

Eu uso essa parte do código:

import pandas as pd

if __name__ == '__main__':

    period=-1
    dictPanel={}
    for fileName in fileNames:
        period=period+1
        print period
        df = pd.read_csv(fileName,skiprows=8, thousands='.',decimal=',',sep=';',error_bad_lines=False)    
        # I remove all the lines in which the first column is not an integer (the id of the bank)
        df=df[df.ix[:,0].apply(lambda x: str(x).isdigit())]

        myBankData=[0,2,10,29]

        df=df.ix[:,myBankData]

        df.columns = ['id','institution','totalAsset','totalDeposits']

        dictPanel[period]=df

A função principal desse pedaço de código é explorar a regularidade dos dados nessa base. O procedimento "pd.read_csv" simplesmente pula as primeiras 9 linhas do arquivo (0 a 8), diz que milhares são representados por "." e decimais por ",".

Depois que eu carrego esses dados, eu simplesmente mantenho aqueles em que apresentam um número na coluna ID (identidade) da base de dados. Nessas bases, aparecem textos em algumas linhas que apenas sujam a base. Eu faço isso usando

df=df[df.ix[:,0].apply(lambda x: str(x).isdigit())]

Finalmente, eu mantenho apenas as colunas [0,2,10,29] que representam: identidade dos bancos, nome dos bancos, ativos totais e depósitos totais. Eu guardo esses dados num dicionário que identifica cada uma dessas bases pelo período.

Agora é só brincar... Para ficar com o formato usual de painel de dados, eu adiciono uma nova variável a minha base que é o período:

if __name__ == '__main__':
    for n, df in dictPanel.iteritems():
        df['period'] = n

E organizo a base no formato usual de painel usando o resto programa.

O programa completo é apresentado abaixo:

import glob
import pandas as pd
import matplotlib.pyplot as plt
if __name__ == '__main__':


    # Reading all files in the directory

    fileNames=[]

    for file in glob.glob("/home/daniel/Documents/Projetos/Prorum/ProgramasEmPython/Pandas/Files/*.csv"):
        fileNames.append(file)

    fileNames.sort()    


    # Reading the content of each file
    period=-1
    dictPanel={}
    for fileName in fileNames:
        period=period+1
        print period
        df = pd.read_csv(fileName,skiprows=8, thousands='.',decimal=',',sep=';',error_bad_lines=False)    
        # I remove all the lines in which the first column is not an integer (the id of the bank)
        df=df[df.ix[:,0].apply(lambda x: str(x).isdigit())]

        myBankData=[0,2,10,29]

        df=df.ix[:,myBankData]

        df.columns = ['id','institution','totalAsset','totalDeposits']

        dictPanel[period]=df

    # Transforming the dictionary in a typical panel data format

    for n, df in dictPanel.iteritems():
        df['period'] = n

    panelDF = pd.concat([df for df in dictPanel.itervalues()], ignore_index=True)    
    panelDFsort=panelDF.sort_values(['institution','period'])

    # Printing results    
    panelPrint=panelDFsort.set_index(['id','period',
   'institution','totalAsset','totalDeposits']) 

    panelPrint.to_csv('panelFile.csv', sep='\t')

    # Ploting results for Banco do Brasil
    # Note that the Id of Banco do Brasil is 99000000

    bbDF= panelDF.loc[panelDF['id']=='99000000']
    BBtotalDepositsDF=bbDF.as_matrix(columns=['period','totalDeposits'])

    print BBtotalDepositsDF
    fig1 = plt.figure()
    ax1 = fig1.add_subplot(111)  
    ax1.plot(BBtotalDepositsDF[:,0],BBtotalDepositsDF[:,1]/100000000.0,'bo-',
    markersize=4, markeredgewidth=0)
    ax1.set_ylabel('Total Deposits of BB')
    ax1.set_xlabel('Periods')

Usando esse programa, eu construi uma base nesse formato:

id                  period  institution totalAsset  totalDeposits

99000000    0          BB                   1111011902  468744731
99000000    1          BB                   1140056761  478751254
99000000    2          BB                   1179180588  471243653
99000000    3          BB                   1218525361  491349464
99000000    4          BB                   1280779071  482501757
99000000    5          BB                   1303651713  480089499
99000000    6          BB                   1326982264  469063349
99000000    7          BB                   1324464414  469680089
30207           0          BBM                   3057264    671080
30207          1           BBM                   2837084    432174
30207          2           BBM                   3110925    439774
30207          3           BBM                   3232786    655616
30207          4           BBM                   3076504    578374
30207          5           BBM                   2964065    650486
30207          6           BBM                   3488299    489978
30207          7           BBM                  3112561 321630

Gerei também uma figura para a variável depósitos totais do Banco do Brasil ao longo do tempo.

Pandas data organization

comentou Fev 23, 2016 por Iúri Honda (141 pontos)  
Eu tentei rodar o programa, mas obtive um erro que eu não soube interpretar:

"File "pandas/parser.pyx", line 518, in pandas.parser.TextReader.__cinit__ (pandas/parser.c:5030)
ValueError: No columns to parse from file"
comentou Fev 23, 2016 por danielcajueiro (5,261 pontos)  
Vc ta usando exatamente a mesma base? Pode ser alguma diferença entre as bases... Pode ser que a base esteja suja com algo que não considerei. Dependendo do ano, as bases do Bacen sao diferentes.
comentou Fev 23, 2016 por danielcajueiro (5,261 pontos)  
Talvez vc possa começar com os programas desse caderno: http://prorum.com/index.php/list/2199/python-for-introductory-econometrics-jeffrey-wooldridge

As bases do Wooldridge sao limpinhas... Se lembre apenas de trocar o diretorio e coloque onde estao as suas bases!
...