Datos Tabulares:
La Manera Pythónica
Turicas aka Álvaro Justen
Meetup de Python Montevideo
17 de agosto de 2016 - Montevideo, Uruguay
bit.ly/rows-mvd
Turicas, un gusto! =)
¡Síganme los buenos!
{ ,
,
,
,
}
/turicas
twitter
github
youtube
slideshare
instagram
alvaro@CursoDeArduino.com.br
turicas.info
Nómada Digital
cursodearduino.com.br
pythonic.cafe
generonumero.media
escoladedados.org
Software Libre
Desde 2003-2004
Python
Desde 2005
Arduino
Desde 2009
Organización de Conferencia
Organización de Conferencia
pythonquito.tk
AgendaDatos tabulares: que es?
Librerías en Python
Lalibreríarows
LaCLI de rows
Datos Tabulares?
Columnas: nombre ytipo (int, oat, str etc.)
Filas: valores paracadacolumna
Formatos:
CSV, TSV
JSON(arrayde objects)
XLS
XLSX
ODS
HTML (con table)
SQLite yotros bancos de datos
Parquet(de Spark)
...
Librerías en Python
CSV, TSV: csvo unicodecsv
JSON: json
XLS: xlrdyxlwt
XLSX: openpyxl
ODS: odfpyo zipylxml
HTML: lxml
SQLite: sqlite3o SQLAlchemy
Parquet: parquet
CSV - Codigo
importcsv
filename='examples/data/tesouro-direto.csv'
reader=csv.DictReader(open(filename))
forrowinreader:
print(row)
CSV - Resultado
{
'preco_compra':'7261.57',
'preco_venda':'7246.25',
'taxa_compra':'0%',
'taxa_venda':'0.04%',
'timestamp':'2015-11-06T17:43:00',
'titulo':'TesouroSelic2021(LFT)',
'vencimento':'2021-03-01'
}
CSV - Cómo deberia ser
{
'preco_compra':7261.57,
'preco_venda':7246.25,
'taxa_compra':0.0,
'taxa_venda':0.0004,
'timestamp':datetime.datetime(2015,11,6,17,43),
'titulo':'TesouroSelic2021(LFT)',
'vencimento':datetime.date(2021,3,1)
}
(ver )
CSV - Conversiones
defconvert_row(row):
row['preco_compra']=_convert_float(row['preco_compra'])
row['preco_venda']=_convert_float(row['preco_venda'])
row['taxa_compra']=_convert_percent(row['taxa_compra'])
row['taxa_venda']=_convert_percent(row['taxa_venda'])
row['vencimento']=_convert_date(row['vencimento'])
row['timestamp']=_convert_datetime(row['timestamp'])
forrowinreader:
convert_row(row)
print(row)
#TODO:crear_convert_float
#TODO:crear_convert_percent
#TODO:crear_convert_date
#TODO:crear_convert_datetime
02_csv.py
Conversiones
XLS - Codigo
importxlrd
def_convert_row(row):
return[cell.valueforcellinrow]
defmy_xls_reader(filename):
workbook=xlrd.open_workbook(filename)
sheet=workbook.sheet_by_index(0)
header=_convert_row(sheet.row(0))
forrow_numberinrange(1,sheet.nrows):
data=_convert_row(sheet.row(row_number))
yielddict(zip(header,data))
filename='examples/data/tesouro-direto.xls'
forrowinmy_xls_reader(filename):
print(row)
XLS - Resultado
{
u'preco_compra':7261.57, #bueno!
u'preco_venda':7246.25, #bueno!
u'taxa_compra':0.0, #bueno!
u'taxa_venda':0.0004, #bueno!
u'timestamp':42314.73819444444, #???
u'titulo':u'TesouroSelic2021(LFT)', #bueno!
u'vencimento':44256.0 #???
}
WTF?
u'timestamp':42314.73819444444,
u'vencimento':44256.0
(ver )
XLS - Conversiones
def_convert_date(data,sheet):
time_tuple=xlrd.xldate_as_tuple(data,sheet.book.datemode)
date=datetime.datetime(*time_tuple)
returndatetime.date(date.year,date.month,date.day)
def_convert_datetime(data,sheet):
time_tuple=xlrd.xldate_as_tuple(data,sheet.book.datemode)
returndatetime.datetime(*time_tuple)
defmy_xls_reader(filename):
(...)
data=_convert_row(sheet.row(row_number))
row=dict(zip(header,data))
row['vencimento']=_convert_date(row['vencimento'],sheet)
row['timestamp']=_convert_datetime(row['timestamp'],sheet)
yieldrow
04_xls.py
HTML - Codigo
fromlxml.htmlimportdocument_fromstring
def_convert_row(row):
values=row.xpath('.//th/text()')+
row.xpath('.//td/text()')
return[text.strip()fortextinvalues]
defmy_html_reader(filename):
withopen(filename)asfobj:
tree=document_fromstring(fobj.read())
tables=tree.xpath('//table')
table=tables[0]
rows=table.xpath('.//tr')
header=_convert_row(rows[0])
forrowinrows[1:]:
yielddict(zip(header,_convert_row(row)))
filename='examples/data/tesouro-direto.html'
XPath
HTML - Resultado
{
'preco_compra':'7261.57', #TODO:convertir
'preco_venda':'7246.25', #TODO:convertir
'taxa_compra':'0.00%', #TODO:convertir
'taxa_venda':'0.04%', #TODO:convertir
'timestamp':'2015-11-06T17:43:00', #TODO:convertir
'titulo':'TesouroSelic2021(LFT)',
'vencimento':'2021-03-01' #TODO:convertir
}
Problemas
Nitodos os formatos tienen información de tipos
Conversión puede tener muchos errores
APIs son muydiferentes
rows to the rescue!
pip install rows # Python Package Index
apt-get install rows # Debian
dnf install rows # Fedora
github.com/turicas/rows
CSV con rows - Codigo
importrows
filename='examples/data/tesouro-direto.csv'
table1=rows.import_from_csv(filename)
forrowintable1:
print(row)
CSV con rows - Resultado
Row(timestamp=datetime.datetime(2015,11,6,17,43),
titulo=u'TesouroIPCA+comJurosSemestrais2017(NTNB)',
vencimento=datetime.date(2017,5,15),
taxa_compra=Decimal('0.0702'),
taxa_venda=Decimal('0.063'),
preco_compra=0.0,
preco_venda=2792.97)
#namedtuple#FTWo/
XLS con rows - Codigo
importrows
filename='examples/data/tesouro-direto.xls'
table2=rows.import_from_xls(filename)
forrowintable2:
print(row)
XLS con rows - Resultado
Row(timestamp=datetime.datetime(2015,11,6,17,43),
titulo=u'TesouroIPCA+comJurosSemestrais2017(NTNB)',
vencimento=datetime.date(2017,5,15),
taxa_compra=Decimal('0.0702'),
taxa_venda=Decimal('0.063'),
preco_compra=0.0,
preco_venda=2792.97)
#namedtuple#FTWo/
HTML con rows - Codigo
importrows
filename='examples/data/tesouro-direto.html'
table3=rows.import_from_html(filename)
forrowintable3:
print(row)
HTML con rows - Resultado
Row(timestamp=datetime.datetime(2015,11,6,17,43),
titulo=u'TesouroIPCA+comJurosSemestrais2017(NTNB)',
vencimento=datetime.date(2017,5,15),
taxa_compra=Decimal('0.0702'),
taxa_venda=Decimal('0.063'),
preco_compra=0.0,
preco_venda=2792.97)
#namedtuple#FTWo/
rows
Interfaz única(independiente de formato)
Escrebir es tan facilcuanto leer
Muchos plugins
Command-line interface!o/
Conversión automática de datos
Yohehecolas pruebas
rows - Plugins
CSV
JSON
HTML (+ XPath)
TXT
XLS
XLSX
SQLite
ODS
Parquet(de Spark)
(yotros en desarrolo)
Command-Line Interface
print
convert
sum
join
query(sí, SQL!)
Live coding (CLI)
github.com/turicas/rows
pythonbrasil.org.br
13 a18 de outubro
Florianópolis/SC
?
Gracias! (:
Turicas aka Álvaro Justen
{ ,
,
,
,
}
/turicas
twitter
github
youtube
slideshare
instagram
alvaro@CursoDeArduino.com.br
turicas.info
bit.ly/rows-mvd

Datos Tabulares: La Manera Pythónica