Probando Jupyter + Python + Pandas
May 03, 2019
Jupyter Notebook es un modo muy fácil de empezar con data science y programar en Python, te permite correr código en diferentes órdenes y combinarlo con texto, gráficas e incluso algunos elementos web que pueden ser muy prácticos para presentar datos. De ahí que sea notebook.
Instalando Jupyter Notebook
No me voy a concentrar en cómo instalar Jupyter. Puedes instalarlo pendiante pip si ya tienes instalado Python o puedes utilizar Anaconda. Si necesitas instalar Python y estas en macOS puedes instalarlo utilizando brew. Recuerda instalar Python 3.
Pandas y Jupyter estan incluidos con Anaconda. Anaconda es un paquete de varias herramietas de data science por lo cual para la mayoría de los usuarios va a ser la forma más fácil de instalar todo.
- Instalación de Python
- Instalando Brew (Opcional si utilizas macOS)
- Instalación de Jupyter (Si utilizas Anaconda no necesitas instalar Python aparte)
¿Qué podemos hacer con Jupyter y Pandas?
Hacer este artículo!
Si! Además de aquí en el blog, este artículo lo cree utilizando Jupyter Notebook. Puedes ver una versión de ella en NBviwer o GitHub (más sobre esas dos cosas adelante).
El resto del artículo esta escrito como si estuvieras leyendo esto en una libreta de Jupyter
Ser el backbone de Five Thirty Eight
Five Thirty Eight es el sitio de periodismo de datos, para algunos de los ejemplos este artículo tomé datos de su Github que utilizaron aquí.
Importar Datos
Para empezar pandas puede adquirir datos de básicamente cualquier lado. Se pueden introducir datos a mano, importar CSVs, leer datos estilo excel que hayas copiado, JSONs, HTMLs, hacer queries de SQL, o conectarse a Google BigQuery y más.
Vamos a empezar importando un CSV sencillo e imprimiendolo cómo tabla.
from IPython.display import display, GeoJSON
import pandas as pd # Por convención lo importamos como pd, porque escribir pandas cada dos lineas es demasiado
t = pd.read_csv('StarWars.csv')
t
RespondentID | Have you seen any of the 6 films in the Star Wars franchise? | Do you consider yourself to be a fan of the Star Wars film franchise? | Which of the following Star Wars films have you seen? Please select all that apply. | Unnamed: 4 | Unnamed: 5 | Unnamed: 6 | Unnamed: 7 | Unnamed: 8 | Please rank the Star Wars films in order of preference with 1 being your favorite film in the franchise and 6 being your least favorite film. | ... | Unnamed: 28 | Which character shot first? | Are you familiar with the Expanded Universe? | Do you consider yourself to be a fan of the Expanded Universe?�� | Do you consider yourself to be a fan of the Star Trek franchise? | Gender | Age | Household Income | Education | Location (Census Region) | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | NaN | Response | Response | Star Wars: Episode I The Phantom Menace | Star Wars: Episode II Attack of the Clones | Star Wars: Episode III Revenge of the Sith | Star Wars: Episode IV A New Hope | Star Wars: Episode V The Empire Strikes Back | Star Wars: Episode VI Return of the Jedi | Star Wars: Episode I The Phantom Menace | ... | Yoda | Response | Response | Response | Response | Response | Response | Response | Response | Response |
1 | 3.292880e+09 | Yes | Yes | Star Wars: Episode I The Phantom Menace | Star Wars: Episode II Attack of the Clones | Star Wars: Episode III Revenge of the Sith | Star Wars: Episode IV A New Hope | Star Wars: Episode V The Empire Strikes Back | Star Wars: Episode VI Return of the Jedi | 3 | ... | Very favorably | I don't understand this question | Yes | No | No | Male | 18-29 | NaN | High school degree | South Atlantic |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
1185 | 3.288373e+09 | Yes | Yes | Star Wars: Episode I The Phantom Menace | Star Wars: Episode II Attack of the Clones | Star Wars: Episode III Revenge of the Sith | Star Wars: Episode IV A New Hope | Star Wars: Episode V The Empire Strikes Back | Star Wars: Episode VI Return of the Jedi | 4 | ... | Very favorably | Han | No | NaN | Yes | Female | 45-60 | $100,000 - $149,999 | Some college or Associate degree | East North Central |
1186 | 3.288373e+09 | Yes | No | Star Wars: Episode I The Phantom Menace | Star Wars: Episode II Attack of the Clones | NaN | NaN | Star Wars: Episode V The Empire Strikes Back | Star Wars: Episode VI Return of the Jedi | 6 | ... | Very unfavorably | I don't understand this question | No | NaN | No | Female | > 60 | $50,000 - $99,999 | Graduate degree | Pacific |
1187 rows × 38 columns
Para empezar la tabla quedó formateada automáticamente. Podemos hacer algunas estadisticas sencillas como
# De las 1187 personas encuestadas ¿Cuantas han visto alguna película de Star Wars?
t['Have you seen any of the 6 films in the Star Wars franchise?'].value_counts()
Yes 936 No 250 Response 1 Name: Have you seen any of the 6 films in the Star Wars franchise?, dtype: int64
O podemos saber muy fácilmente cual, segun nuestros datos, es la pelicula más vista de Star Wars es Empire Strikes Back
watched = t.iloc[:, 3:9].describe().transpose()
watched
count | unique | top | freq | |
---|---|---|---|---|
Which of the following Star Wars films have you seen? Please select all that apply. | 674 | 1 | Star Wars: Episode I The Phantom Menace | 674 |
Unnamed: 4 | 572 | 1 | Star Wars: Episode II Attack of the Clones | 572 |
Unnamed: 5 | 551 | 1 | Star Wars: Episode III Revenge of the Sith | 551 |
Unnamed: 6 | 608 | 1 | Star Wars: Episode IV A New Hope | 608 |
Unnamed: 7 | 759 | 1 | Star Wars: Episode V The Empire Strikes Back | 759 |
Unnamed: 8 | 739 | 1 | Star Wars: Episode VI Return of the Jedi | 739 |
Hacer Gráficas
from bokeh.plotting import figure, output_notebook, show
from bokeh.models import ColumnDataSource,LabelSet
output_notebook()
source = ColumnDataSource(data=dict(y=watched["top"],
right=watched["freq"],
freq=watched["freq"]))
labels = LabelSet(x='right', y='y', text='freq', level='glyph',
x_offset=2, y_offset=5, source=source, render_mode='canvas')
p = figure(plot_width=850, y_range=watched['top'])
p.hbar(y="y", right="right", height=0.5, source=source)
p.add_layout(labels)
show(p)
Mostrar mapas
Solo tienes que activar este complemento de Jupyter.
jupyter labextension install @jupyterlab/geojson-extension
Después de agregarlo solo tienes que importar el display de GeoJSON y tus mapas se mostrarán automáticamente
from IPython.display import GeoJSON
GeoJSON({"type":"FeatureCollection","features":[{"type":"Feature","properties":{},"geometry":{"type":"Point","coordinates":[-98.20627212524414,19.048082808795396]}},{"type":"Feature","properties":{},"geometry":{"type":"Point","coordinates":[-98.20215225219725,19.054978803148376]}},{"type":"Feature","properties":{},"geometry":{"type":"Point","coordinates":[-98.21605682373047,19.061793386528766]}},{"type":"Feature","properties":{},"geometry":{"type":"Point","coordinates":[-98.22275161743164,19.05359962720829]}},{"type":"Feature","properties":{},"geometry":{"type":"Point","coordinates":[-98.23159217834473,19.0492997698019]}},{"type":"Feature","properties":{},"geometry":{"type":"Point","coordinates":[-98.23433876037598,19.046703575532554]}},{"type":"Feature","properties":{},"geometry":{"type":"Point","coordinates":[-98.21288108825684,19.03639952912028]}},{"type":"Feature","properties":{"stroke":"#00fcff","stroke-width":2,"stroke-opacity":1,"fill":"#00fcff","fill-opacity":0.5},"geometry":{"type":"Polygon","coordinates":[[[-98.23416709899902,19.04662244380717],[-98.21296691894531,19.03672407576917],[-98.20635795593262,19.048407332603105],[-98.20206642150879,19.055141058387473],[-98.21648597717285,19.062523503853996],[-98.22223663330077,19.053761883796376],[-98.23142051696776,19.0492997698019],[-98.23416709899902,19.04662244380717]]]}}]})
Escribir con Latex dentro de Jupyter Notebook
O más bien escribir equaciones empleando la notación de Latex. Esto es muy útil para data science, pues porque matemáticas, puedes ver un ejemplo en el artículo de Arkham.
\[\int_y^x f(t) dt = x f(x) - y f(y) - \int_y^x t f'(t) dt\]Presentaciones con Jupyter
Puedes hasta hacer tus presentaciones con Jupyter y si se trata de código hacerlas con Jupyter tiene mucho sentido. De hecho, esta libreta también es una presentación y la puedes ver en modo de presentación aquí.
Considera las ventajas de hacer las cosas solo una vez y tener inmediatamente una presentación de tu trabajo. Sobre todo si estas haciendo data science, dónde la parte gráfica es muy importante, hacer esto es un ahorro impresionante de tiempo y energía.
Compartir tus libretas en linea con NBViwer & GitHub
Esta parte es de mis favoritas, de hecho es algo que he utilizado en varios trabajos para compartir información. Al subir tu libreta a Github será rendereada automáticamente, como aquí y puedes poner ese link en nbviwer que es una interfáz más limpia y te permite ver las libretas en modo de presentación, como aquí.
Para que algunas cosas específicas se vean correctamente en linea, por ejemplo los mapas, seguramente necesitas agregar algunas lineas de Javascript. Pero no es nada complicado, en ese caso te recomiendo utilizar nbviewer porque github no siempre te va a permitir renderear algunos de esos elementos.
¡Y utilizar otros lenguajes!
Jupyter no solo soporta Python. Si estas intersado en data science posiblemente quieras utilizar R y lo puedes hacer con Jupyter. Pero también puedes utilizar Julia, Scala, Haskell, Ruby, Bash…. y muchos otros.
El artículo de Arkham también lo hice inicialmente utilizando Jupyter y estas son ejemplos delibretas utilizando Ruby y Julia.
Espero que esta introducción a Jupyter te sea útil. Y como siempre puedes dejar tus comentarios.
– Anya Reyes