[Python-es] Parseando CSV con pandas
Alberto Curro
bertothunder en gmail.com
Jue Nov 21 00:31:25 CET 2013
El 20 de noviembre de 2013 23:10, Alberto Curro
<bertothunder en gmail.com>escribió:
> Hola lista,
>
> estoy jugando con Pandas para un pequeño proyecto profesional donde
> tengo que analizar datos de unos servidores. Hasta ahora se integraban
> estos CSV en servidores SQL y se ejecutaban consultas sobre ellos para
> generar unos report.
>
> Básicamente cada CSV contiene los datos de procesado del servidor, con
> requests desde un cliente, tiempos de procesado en el servidor (en
> segundos) en las distinas etapas, y forwarding a otro servidor, con su
> respuesta (http result code).
>
> El CSV contendría algo tal que:
>
> date, time, uri, size, process_request, parsing, transform, forward,
> result_code, ....
>
> Con pandas cargo el CSV diario y proceso a procesar, que no es otra cosa
> que agrupamientos:
>
> - por result code
> - por hora
> - por tamaño
>
> hay operaciones adicionales, pero que no importan ahora.
>
> La cuestión es: ¿cómo hago el agrupado por hora y result? he probado
> varios métodos, alguno me funciona, pero estoy seguro que pandas me ofrece
> algo mejor y/o más eficiente.
>
> La operación sería el equivalente a un SELECT GROUP BY (time,
> result_code) WHERE (time > 22:59:59 y time < 23:59:59), por poner un
> ejemplo. Y perdonad mi SQL, hace tiempo que no lo uso... demasiado.
>
> Pues bien, mientras jugueteaba, hice esto:
>
> dft = df[df.time > '22:59:59']
> dft = dft[dft.time < '23:59:59']
>
> grouped = dft.groupby('result_code')
>
> Básicamente ahora tengo el agrupado hecho, pero si hago un:
>
> grouped.first()
>
> Veo algo tal que:
>
> date time
> uri process ....
> result
> 200 2013/11/18 2013/11/18
>
Perdón! me lié con la combinación de teclas :-(
Decía que con la operación:
grouped = dft.groupby('result_code')
grouped.first()
veo algo tal que:
date time uri
process ....
result
200 2013/11/18 2013/11/18 2013/11/18 2013/11/18
400 2013/11/18 2013/11/18 2013/11/18 2013/11/18
Y no lo que esperaría ver ahí, o sea, los campos tal cual. Se confirma que
los valores no son correctos con un poco de navegación:
df.groupby('result_code').first().uri
result
200 2013/11/18
400 2013/11/18
df.groupby('result_code').first().time
result
200 2013/11/18
400 2013/11/18
¿por qué ocurre esto? Estoy leyendo la documentación de pandas pero no veo
qué hago mal...
Por otro lado, si agrupo por dos campos, es incluso peor:
df3 = df.groupby(['result_code', 'time'])
df3.first()
<class 'pandas.core.frame.DataFrame'>
MultiIndex: 2203 entries, (200, '23:00:00') to (408, '23:01:26')
Data columns:
date 2203 non-null values
request_time 2203 non-null values
filename 2203 non-null values
uri 2203 non-null values
.....
dtypes: object(9)
df3.uri
200 00:00:00 http://post.vsslive5-i.akamaihd.net/206570/809_hr
....
23:00:04 http://post.vsslive1-i.akamaihd.net/206543/810_tv
23:00:05 http://post.vsslive5-i.akamaihd.net/206570/809_hr
400 18:05:05
http://post.vsslive1-i.akamaihd.net/206570/808_hr<http://post.vsslive5-i.akamaihd.net/206570/809_hr>
...
22:51:00
http://post.vsslive2-i.akamaihd.net/206533/709_hr<http://post.vsslive5-i.akamaihd.net/206570/809_hr>
Lo que busco es:
agrupar por result_code, dentro de una hora determinada, o un rango, y
tener el subrango de datos para calcular con ellos.
¿Sólo se puede hacer mediante la primera forma? Aunque rápido, creo que
debería poder hacerlo de la segunda manera, no?
Saludos
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20131120/db6aa6ba/attachment.html>
Más información sobre la lista de distribución Python-es