[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