ICE-B ICE-B ICE-B ICE-B ICE-B ICE-B ICE-B ICE-B ICE-B 15 - Organizar Dados 15 - Organizar Dados 15 - Organizar Dados 15 - Organizar Dados 15 - Organizar Dados 15 - Organizar Dados 15 - Organizar Dados 15 - Organizar Dados 15 - Organizar Dados Ludwig Krippahl
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Organizar DadosOrganizar DadosOrganizar DadosOrganizar DadosOrganizar DadosOrganizar DadosOrganizar DadosOrganizar DadosOrganizar Dados
Resumo■ Organização de dados:• Ficheiros, listas, matrizes e dicionários
■ Ler e representar dados (gráficos)■ Dicionário como relação de atributos■ Vector de dicionários como uma tabela■ Selecção de campos e cruzamento de tabelas
Exemplo: temperaturas por país■ PRT.csv ■ DEU.csvyear,data
1901,14.236396789550781
1902,14.387377738952637
1903,14.560417175292969
1904,14.721814155578613
1905,14.297182083129883
...
year,data
1901,7.781550407409668
1902,7.262444972991943
1903,8.382242202758789
1904,8.436717987060547
1905,8.02903938293457
...
■ Podemos obter estes valores do World Bank neste URL:http://climatedataapi.worldbank.org/climateweb/rest/v1/country/cru/tas/year/[COD].csv
■ Ou então podemos tê-los já em ficheiros no disco.■ Vamos considerar ambas as possibilidades:• Carregar um lote de países para um dicionário de tabelas• De ficheiro ou do servidor
Exemplo: temperaturas por país■ Decompor o problema:• Um país, uma tabela, de ficheiro ou servidor• Vários países, um dicionário, de ficheiro ou servidor
def load_temperatures(file_name, online=False): """Return numpy array with years and temperatures for given name (code.csv) If online load from server""" def load_countries(codes, online=False): """Return dictionary with one table per country code Loads tables from file, or server if online is True"""
import numpy as np from requests import get BASE_URL = 'http://climatedataapi.worldbank.org/'+\ 'climateweb/rest/v1/country/cru/tas/year/' def load_temperatures(file_name, online=False): """Return numpy array with years and temperatures for given name (code.csv) If online load from server""" if online: response = get(BASE_URL+file_name) lines = response.text.strip().split('\n') else: lines = open(file_name).readlines() table = [] for line in lines[1:]: year, temp = line.split(',') table.append( (int(year),float(temp))) return np.array(table)
def load_temperatures(file_name, online=False): """Return numpy array with years and temperatures for given name (code.csv) If online load from server""" ...
def load_countries(codes, online=False): """Return dictionary with one table per country code Loads tables from file, or server if online is True""" countries = {} for code in codes: countries[code] = load_temperatures(code+'.csv', online) return countries
In : countries = load_countries(['PRT','ESP','FRA'],True) Out: {'PRT': array([[1901. , 14.23639679],...]), 'ESP': array([[1901. , 12.61713982],...]), 'FRA': array([[1901. , 9.74886513],...])}
■ Ou omitindo (ou False) o segundo argumento se tivermos osficheiros na pasta.
■ Já temos os dados organizados, vamos fazer o gráfico■ Generalizar:• Podemos escolher o intervalo de anos• Podemos escolher os países (daqueles que há no dicionário)
def plot_years(first,last,codes,countries): """from countries dictionary, plot countries given in codes in specified interval""" plt.figure(figsize=(10,5)) for code in codes: table = countries[code] years = np.logical_and(table[:,0]>=first, table[:,0]<=last) data = table[years,:] plt.plot(data[:,0],data[:,1],label=code) plt.legend() plt.show()
In : plot_years(1960,2000,['PRT','ESP','FRA'],countries)
Exemplo (antiquado): Clube de vídeo■ Cada tabela tem campos diferentes• Filmes: id_filme, tipo, titulo, classificacao• Clientes: id_cliente, nome, morada, c_credito
Exemplo (antiquado): Clube de vídeo■ Ler as tabelas para um dicionário• Cada tabela é uma lista de dicionários com os campos e valores• A nossa "base de dados" será um dicionário com todas as tabelas• Vamos fazer uma funçao genérica, que sirva para qualquer tabela
■ Processar os dados• Juntar duas tabelas por um campo (e.g. identificador)• Seleccionar colunas da tabela (os campos dos registos)• Mostrar uma tabela (print)
def load_table(file_name,fields): "Read file into list of dictionaries with given fields" lines = open(file_name).readlines() table = [] for line in lines: cells = line.strip().split('\t') record = {} for ix in range(len(fields)): record[fields[ix]]=cells[ix] table.append( record ) return table
In : load_table('filmes.tsv',['id_filme','titulo','tipo','classificacao']) Out: [{'classificacao': 'maiores de 12','id_filme': '101', 'tipo': 'suspense drama', 'titulo': 'Sexto Sentido'}, {'classificacao': 'maiores de 6','id_filme': '102', 'tipo': 'comedia aventura', 'titulo': 'Regresso ao Futuro'}, ...]
def load_table(file_name,fields): "Read file into list of dictionaries with given fields" lines = open(file_name).readlines() table = [] for line in lines: cells = line.strip().split('\t') record = {} for ix in range(len(fields)): record[fields[ix]]=cells[ix] table.append( record ) return table
In : load_table('clientes.tsv',['id_cliente','nome','morada','c_credito']) Out: [{'c_credito': '123412341234123401', 'id_cliente': '101', 'morada': 'Rua da Paz, 20', 'nome': 'Artur Meireles'}, {'c_credito': '123412341234123402', 'id_cliente': '102', 'morada': 'Rua da Guerra, 1234', 'nome': 'Joana Fonseca '}, ...]
def load_table(file_name,fields): "Read file into list of dictionaries with given fields" lines = open(file_name).readlines() table = [] for line in lines: cells = line.strip().split('\t') record = {} for ix in range(len(fields)): record[fields[ix]]=cells[ix] table.append( record ) return table
■ Ler as tabelas para um dicionário de tabelas ("base de dados")• A partir de um dicionário com o esquema das tabelas
def load_db(table_defs): """Reads all tables into a dictionary Argument table_defs is dictionary with table name and dictionary with file name and fields """ db = {} for table_name in table_defs: table = table_defs[table_name] db[table_name] = load_table(table['file'],table['fields']) return db table_defs = {'filmes':{'file':'filmes.tsv', 'fields':['id_filme','titulo','tipo','classificacao']}, 'clientes':{'file':'clientes.tsv', 'fields':['id_cliente','nome','morada','c_credito']}, 'alugueres':{'file':'alugueres.tsv', 'fields':['id_aluguer','id_filme','id_cliente', 'data_aluguer','data_entrega']}, }
■ Ler as tabelas para um dicionário de tabelas ("base de dados")• A partir de um dicionário com o esquema das tabelas
def load_db(tables): """Reads all tables into a dictionary Argument is dictionary describing tables""" db = {} for table_name in tables: table = tables[table_name] db[table_name] = load_table(table['file'],table['fields']) return db
In : db = load_db(table_defs) In : db['filmes'] Out: [{'classificacao': 'maiores de 12', 'id_filme': '101', 'tipo': 'Sexto Sentido', 'titulo': 'suspense drama'}, {'classificacao': 'maiores de 6', 'id_filme': '102', 'tipo': 'Regresso ao Futuro', 'titulo': 'comedia aventura'}, ...]
■ Juntar um registo com todos os que partilhem esse campo
def join_rec(rec,table,field): "join record to all in table sharing same value in field" new_table=[] for other_rec in table: if rec[field] == other_rec[field]: new_rec={} for f in rec: new_rec[f] = rec[f] for f in other_rec: new_rec[f] = other_rec[f] new_table.append(new_rec) return new_table
In : filme = db['filmes'][5] In : filme Out: {'classificacao': 'maiores de 12', 'id_filme': '106', 'tipo': 'Elizabeth', 'titulo': 'drama historico'} In : join_rec(filme,db['alugueres'],'id_filme') Out: [{'classificacao': 'maiores de 12', 'data_aluguer': '05/12/14', 'data_entrega': 'NULL', 'id_aluguer': '1002', 'id_cliente': '101', 'id_filme': '106', 'tipo': 'Elizabeth', 'titulo': 'drama historico'}]
def join(table1, table2, field): "Return all pairs of records with shared field" new_table = [] for rec in table1: new_table.extend(join_rec(rec,table2,field)) return new_table
■ Confuso, com informação a mais. Vamos seleccionar campos
def select(table, fields): "Return table with selected fields" new_table = [] for rec in table: new_rec = {} for f in fields: new_rec[f] = rec[f] new_table.append(new_rec) return new_table
In : filmes_alug = join(db['filmes'],db['alugueres'],'id_filme') In : film_client_alug = join(filmes_alug,db['clientes'],'id_cliente') In : film_client = select(film_client_alug,['nome','titulo']) In : film_client Out: [{'nome': 'Cavaco Silva', 'titulo': 'Regresso ao Futuro'}, {'nome': 'Joana Fonseca ', 'titulo': 'Alien'}, {'nome': 'Artur Meireles', 'titulo': 'Elizabeth'}, {'nome': 'Joana Fonseca ', 'titulo': 'Idade do Gelo'}]
def print_table(table, separator = '\t'): "Prints a table using separator" fields = table[0].keys() print(separator.join(fields)) for rec in table: vals = [str(rec[f]) for f in fields] print(separator.join(vals))
In : print_table(film_client) nome titulo Cavaco Silva Regresso ao Futuro Joana Fonseca Alien Artur Meireles Elizabeth Joana Fonseca Idade do Gelo
In : some_list = [] for x in range(10): some_list.append(x) In : some_list Out: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] In : some_list = [x for x in range(10)] In : some_list Out: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
def print_table(table, separator = '\t'): "Prints a table using separator" fields = table[0].keys() print(separator.join(fields)) for rec in table: vals = [str(rec[f]) for f in fields] print(separator.join(vals))
In : print_table(film_client,';') nome;titulo Cavaco Silva;Regresso ao Futuro Joana Fonseca ;Alien Artur Meireles;Elizabeth Joana Fonseca ;Idade do Gelo
31
Organizar DadosOrganizar DadosOrganizar DadosOrganizar DadosOrganizar DadosOrganizar DadosOrganizar DadosOrganizar DadosOrganizar Dados