{ "metadata": { "name": "", "signature": "sha256:29686bfc9c258eab82fb1f11ba2f6ba8dbcfb336ae668c883c20cea83b17976e" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Paquetes\n", "\n", "Con \u00e9ste Notebook trataremos de dar a conocer `plotly`, un servicio web gratuito para generar gr\u00e1ficos interactivos y que permite la creaci\u00f3n de proyectos colaborativos.\n", "\n", "\u00c9ste Notebook emplea los siguentes paquetes:\n", "\n", "+ [`pandas`](http://pandas.pydata.org) 0.14.0, para importar y analizar estructuras de datos en Python.\n", "+ [`matplotlib`](http://matplotlib.org) 1.3.1, para generar diversisos tipos de gr\u00e1ficos con calidad de imprenta.\n", "+ [`plotly`](https://plot.ly/) 1.1.2, para generar gr\u00e1ficos interactivos para la web.\n", "\n", "que iremos cargando conforme los vayamos a utilizar.\n", "\n", "Empezaremos por importar los datos con `pandas`. Podeis encontrar una introducci\u00f3n a `pandas` en \u00e9ste post de [Pybonacci](http://pybonacci.wordpress.com/2014/05/30/pandas-i/).\n", "\n", "# Datos\n", "\n", "La estructura de datos con la que vamos a trajar es un `CSV` con datos de telemetr\u00eda correspondientes a un BMW Z4 GT3 compitiendo en el circuito Brands Hatch Indy.\n", "El paquete de datos nos lo ha proporcionado Steve Barker, un mec\u00e1nico que pasa la mayor parte de su tiempo en la GP2. Pero aqu\u00ed s\u00f3lo vamos a trabajar con los datos de la vuelta 27 de la primera carrera.\n", "\n", "El propio `pandas` incluye rutinas para importar datos desde diversas fuentes, ya sea un simple `CSV` o un Excel de multiples hojas." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Importamos pandas de la manera habitual\n", "import pandas as pd" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 1 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pero antes de proceder a cargar los datos debemos conocer un poco la estructura del archivo en cuesti\u00f3n del que he recortado una muestra.\n", "\n", " Format;MoTeC CSV File;;;Workbook;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n", " Venue;brandshatch indy;;;Worksheet;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n", " Vehicle;bmwz4gt3;;;Vehicle Desc;bmwz4gt3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n", " Driver;Steve Barker;;;Engine ID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n", " Device;ADL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n", " Comment;;;;Session;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n", " Log Date;02/07/2014;;;Origin Time;1196.94;s;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n", " Log Time;23:05:43;;;Start Time;1196.95;s;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n", " Sample Rate;60;Hz;;End Time;1240.017;s;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n", " Duration;43.067;s;;Start Distance;49849;m;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n", " Range;Lap 27;;;End Distance;51765;m;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n", " ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n", " ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n", " Time;Distance;Gear;Engine RPM;Manifold Pres;Throttle Pos;Brake Pedal Pos;Clutch\n", " s;m;;rpm;kpa;%;%;%;deg;N.m;;m;km/h;G;G;G;deg;deg;deg;deg/s;deg/s;deg/s;C;kPa;V;\n", " ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n", " ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n", " 0;0;5;8657;0.99752352;100;0;100;-5.724613;1.5780677;26;0.6267;225.407808;-0.296\n", " 0.017;1;5;8658;0.9975208;100;0;100;-6.10625;1.7365016;26;1.66957;225.514112;-0.\n", " 0.033;2;5;8654;0.99751824;100;0;100;-6.160785;1.929843;26;2.71285;225.58688;-0.\n", " 0.05;3;5;8670;0.99751552;100;0;100;-6.160785;2.5375902;26;3.7565;225.653952;-0.\n", "\n", "Como bien podemos apreciar, las primeras 11 l\u00edneas aportan informaci\u00f3n generada por MoTeC al exportar los datos.\n", "Las cabeceras de lo que realmente nos interesa son las l\u00edneas 14 y 15, siendo la primera la descripci\u00f3n del par\u00e1metro y la segunda las unidades de medida.\n", "Y ya en la l\u00ednea 18 empiezan los datos.\n", "\n", "Tomaremos como \u00edndice del `DataFrame` la variable tiempo (aunque tambi\u00e9n podr\u00edamos optar por la distancia)." ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Cargamos el archivo. Recordemos que pandas, y Python en general, es 0-indexed.\n", "data = pd.io.parsers.read_csv('brandshatch_lap27.csv', sep=';', header=13, index_col=0, skiprows=[14,15,16])\n", "# Otra forma alternativa de leer los datos de un archivo CSV ser\u00eda a trav\u00e9s del\n", "# propio DataFrame de pandas, pero \u00e9ste no nos permite saltarnos filas de datos:\n", "# data = pd.DataFrame.from_csv('brandshatch_lap27.csv', sep=';', header=13, index_col=0)\n", "data.head(5)" ], "language": "python", "metadata": {}, "outputs": [ { "html": [ "
\n", " | Distance | \n", "Gear | \n", "Engine RPM | \n", "Manifold Pres | \n", "Throttle Pos | \n", "Brake Pedal Pos | \n", "Clutch Pedal Pos | \n", "Steering Wheel Angle | \n", "Steering Wheel Torque | \n", "Lap Number | \n", "... | \n", "WaterTemp | \n", "Yaw | \n", "YawRate | \n", "dcABS | \n", "dcBrakeBias | \n", "dcFuelMixture | \n", "dcThrottleShape | \n", "dcTractionControl | \n", "dcTractionControlToggle | \n", "Fuel Density | \n", "
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Time | \n", "\n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " |
0.000 | \n", "0 | \n", "5 | \n", "8657 | \n", "0.997524 | \n", "100 | \n", "0 | \n", "100 | \n", "-5.724613 | \n", "1.578068 | \n", "26 | \n", "... | \n", "88.536890 | \n", "-0.790032 | \n", "-0.064797 | \n", "9 | \n", "3570.19424 | \n", "1 | \n", "10 | \n", "3 | \n", "0 | \n", "0.75 | \n", "
0.017 | \n", "1 | \n", "5 | \n", "8658 | \n", "0.997521 | \n", "100 | \n", "0 | \n", "100 | \n", "-6.106250 | \n", "1.736502 | \n", "26 | \n", "... | \n", "88.540582 | \n", "-0.791088 | \n", "-0.063974 | \n", "9 | \n", "3570.19424 | \n", "1 | \n", "10 | \n", "3 | \n", "0 | \n", "0.75 | \n", "
0.033 | \n", "2 | \n", "5 | \n", "8654 | \n", "0.997518 | \n", "100 | \n", "0 | \n", "100 | \n", "-6.160785 | \n", "1.929843 | \n", "26 | \n", "... | \n", "88.544275 | \n", "-0.792130 | \n", "-0.067104 | \n", "9 | \n", "3570.19424 | \n", "1 | \n", "10 | \n", "3 | \n", "0 | \n", "0.75 | \n", "
0.050 | \n", "3 | \n", "5 | \n", "8670 | \n", "0.997516 | \n", "100 | \n", "0 | \n", "100 | \n", "-6.160785 | \n", "2.537590 | \n", "26 | \n", "... | \n", "88.547936 | \n", "-0.793190 | \n", "-0.067915 | \n", "9 | \n", "3570.19424 | \n", "1 | \n", "10 | \n", "3 | \n", "0 | \n", "0.75 | \n", "
0.067 | \n", "4 | \n", "5 | \n", "8695 | \n", "0.997512 | \n", "100 | \n", "0 | \n", "100 | \n", "-5.997180 | \n", "2.660200 | \n", "26 | \n", "... | \n", "88.551744 | \n", "-0.794294 | \n", "-0.072090 | \n", "9 | \n", "3570.19424 | \n", "1 | \n", "10 | \n", "3 | \n", "0 | \n", "0.75 | \n", "
5 rows \u00d7 215 columns
\n", "