Introducción a la introducción

Los padres físicos y virtuales de la criatura: Fernando Pérez y John Hunter, Numpy y Matplotlib

http://2013.es.pycon.org/media/python-ciencia-amor.pdf by @pybonacci

Primer contacto con el ecosistema ipython: github e instalación (o no)

Proyecto muy activo en Github https://github.com/ipython/ipython desde donde lo clonaremos para instalarlo o correremos inmediatamente

Práctica con los atajos del teclado (Esc-h) mientras vemos las posibilidades de edición de texto con Markdown en ipython http://127.0.0.1:8888/notebooks/Dia%20Pythonista%20en%20Sorbas%20/Markdown%20Cells.ipynb

Veremos también el autocompletado con tab , el uso de comandos del terminal de linux (ls, cd, pwd, cat, etc ...) , las magias y las ayudas con ?

Numpy: Base de la programación científica en python

En el siguiente minitutorial nos podremos hacer una idea de lo que va: http://127.0.0.1:8888/notebooks/Dia%20Pythonista%20en%20Sorbas%20/Clase%203.ipynb

Un ejemplo sencillo de visualización y tratamiento de datos con ipython: Liebres y linces

El archivo populations.txt muestra las poblaciones de liebres , linces y zanahorias en el norte de Canada durante los veinte primeros años del siglo pasado

In [15]:
cat populations.txt
# year	hare	lynx	carrot
1900	30e3	4e3	48300
1901	47.2e3	6.1e3	48200
1902	70.2e3	9.8e3	41500
1903	77.4e3	35.2e3	38200
1904	36.3e3	59.4e3	40600
1905	20.6e3	41.7e3	39800
1906	18.1e3	19e3	38600
1907	21.4e3	13e3	42300
1908	22e3	8.3e3	44500
1909	25.4e3	9.1e3	42100
1910	27.1e3	7.4e3	46000
1911	40.3e3	8e3	46800
1912	57e3	12.3e3	43800
1913	76.6e3	19.5e3	40900
1914	52.3e3	45.7e3	39400
1915	19.5e3	51.1e3	39000
1916	11.2e3	29.7e3	36700
1917	7.6e3	15.8e3	41800
1918	14.6e3	9.7e3	43300
1919	16.2e3	10.1e3	41300
1920	24.7e3	8.6e3	47300
In [6]:
#Cargamos los módulos que vamos a necesitar
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
In [11]:
#Metemos los datos del txt en un array de numpy
data = np.loadtxt('populations.txt') # Convierte data en un array bidimensional, en una matriz vamos ...
print data
year, hares, lynxes, carrots = data.T # Traspuesta
print year
print carrots
[[  1900.  30000.   4000.  48300.]
 [  1901.  47200.   6100.  48200.]
 [  1902.  70200.   9800.  41500.]
 [  1903.  77400.  35200.  38200.]
 [  1904.  36300.  59400.  40600.]
 [  1905.  20600.  41700.  39800.]
 [  1906.  18100.  19000.  38600.]
 [  1907.  21400.  13000.  42300.]
 [  1908.  22000.   8300.  44500.]
 [  1909.  25400.   9100.  42100.]
 [  1910.  27100.   7400.  46000.]
 [  1911.  40300.   8000.  46800.]
 [  1912.  57000.  12300.  43800.]
 [  1913.  76600.  19500.  40900.]
 [  1914.  52300.  45700.  39400.]
 [  1915.  19500.  51100.  39000.]
 [  1916.  11200.  29700.  36700.]
 [  1917.   7600.  15800.  41800.]
 [  1918.  14600.   9700.  43300.]
 [  1919.  16200.  10100.  41300.]
 [  1920.  24700.   8600.  47300.]]
[ 1900.  1901.  1902.  1903.  1904.  1905.  1906.  1907.  1908.  1909.
  1910.  1911.  1912.  1913.  1914.  1915.  1916.  1917.  1918.  1919.
  1920.]
[ 48300.  48200.  41500.  38200.  40600.  39800.  38600.  42300.  44500.
  42100.  46000.  46800.  43800.  40900.  39400.  39000.  36700.  41800.
  43300.  41300.  47300.]
In [12]:
#Dibujo el gráfico
plt.plot(year,hares,    year, lynxes,     year,carrots)
plt.legend(('Hare', 'Lynx', 'Carrot'))
Out[12]:
<matplotlib.legend.Legend at 0xa03f5ac>
In [16]:
# Recorto la matriz de datos para quedarme solo con las poblaciones (slicing)
populations = data[:, 1:]
In [17]:
# Valores estadísticos de las poblaciones: Media y desviación típica
print populations.mean(axis=0)
print populations.std(axis=0)
[ 34080.95238095  20166.66666667  42400.        ]
[ 20897.90645809  16254.59153691   3322.50622558]
In [18]:
# ¿Que especies tienen la población más alta cada año?
np.argmax(populations, axis=1)
Out[18]:
array([2, 2, 0, 0, 1, 1, 2, 2, 2, 2, 2, 2, 0, 0, 0, 1, 2, 2, 2, 2, 2])
In [23]:
# ¿Que años son superados los 50000 elementos por alguna población?
print populations > 50000
print ""
print populations[populations > 50000]
print ""
above_50000 = np.any(populations > 50000, axis=1) # np.any devuelve un array con True donde se cumpla alguna de las condiciones
print above_50000
print ""
print "Any above 50000: ", year[above_50000]
[[False False False]
 [False False False]
 [ True False False]
 [ True False False]
 [False  True False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [ True False False]
 [ True False False]
 [ True False False]
 [False  True False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]]

[ 70200.  77400.  59400.  57000.  76600.  52300.  51100.]

[False False  True  True  True False False False False False False False
  True  True  True  True False False False False False]

Any above 50000:  [ 1902.  1903.  1904.  1912.  1913.  1914.  1915.]

El paquete científico Scipy

Un ejemplo sencillo para el análisis de señales http://glowingpython.blogspot.com.es/2011/08/how-to-plot-frequency-spectrum-with.html

Para algo mas riguroso, seguir la documentación: http://docs.scipy.org/doc/scipy/reference/tutorial/signal.html

Mas ejemplos con el ipython notebook

Referencias

In [ ]: