print(  3*3 )

"""
Explanation: 1 Introduccion a IPython notebooks/ Jupyter



Que es exactamente?
Una libreta IPython/Jupyter es un ambiente interactivo para escribir y correr codigo de python. Es un historial completo y auto-contenido de un calculo y puede ser convertido a otros formatos para compartir con otros.
En particular es batante popular en la comunidad cientifica porque es una herramienta interactiva, iterativa para analisis de datos, visualizacion y contar historias.
Puedes combinar:
- Codigo en vivo
- Widgets Interactivos
- Graficas
- Texto Narrrativo
- Ecuaciones
- Imagenes
- Video
Un poco mas...
El projecto Ipython reciente se expandio en la versio 3.0 para incluir otros kerneles de computo como R, Julia, C++ y Matlab.
Para mas informacion/ideas checa los links abajo de este Ipython Notebook.
Vamos a empezar!
Corriendo codigo
Notas: Presionar shift + enter
Corre tu codido usando Shift-Enter o presionando el boton <button class='btn btn-default btn-xs'><i class="icon-play fa fa-play"></i></button> en la barra de herramientas arriba.
End of explanation
"""


usuario = 32
x = 1000

"""
Explanation: Computo Iterativo
El "kernel" mantiene un estado de todos los calculos del la libreta.
Por ejemplo puedes guardar el resultado de un calculo en una variable
End of explanation
"""


usuario + x

"""
Explanation: y usarlo en otra celda
End of explanation
"""


import time
time.sleep(1000)

"""
Explanation: Parar codigo
El codigo se corre en un proceso separado llamado el"kernel:". Este puede ser interumpido o reseteado.
Trata de correr el siguiente codigo y dale al boton <button class='btn btn-default btn-xs'><i class='icon-stop fa fa-stop'></i></button>.
End of explanation
"""


lista = ['perro' ,'delfin','perezoso','leon','gato']
lista2 = [3,8,10,3]
print(lista)

"""
Explanation: Resetear
Puedes resetear usando el boton <button class='btn btn-default btn-xs'><i class='fa fa-repeat icon-repeat'></i></button>.
Python Basico
Lists and Arrays (Listas y arreglos)
End of explanation
"""


lista[1]

"""
Explanation: podemos agregar elementos
End of explanation
"""


import numpy as np

array_1 = np.array([3,4,5]) 
array_2 = np.array([4,8,7]) 
array_1 + array_2

"""
Explanation: o podemos usar el modulo Numpy para arreglos numericos (Protip: quieres saber mas? dale click a la imagen)
End of explanation
"""


array_1 = np.zeros(17304)
print(array_1)

"""
Explanation: y que tal arreglos vacios? Aqui creamos un vector de 5 x 1
End of explanation
"""


array_1[1100]

"""
Explanation: podemos cambiar valores usando  [ indice ]:
End of explanation
"""


arreglo = np.random.randint(1,10,500000)
np.mean(arreglo)

"""
Explanation: y que tal arreglos de numeros aleatorios?
Utilidades de Array
Tenemos muchas utilidades para trabajar con arreglos...

Sortear valores: entoces usamos np.sort(array)
Encontrar Maximo, Minimo: entoces usamos np.min(array), np.max(array)
Encontrar el indices del Maximo o Minimo: entoces usamos np.argmin(array), np.argmax(array)
Calcular medias o desviaciones estandar : usamos np.mean(array),np.std(array)
End of explanation
"""


lista = ['perro' ,'delfin','perezoso','leon','gato']

for domesticos in lista:
    print(domesticos)
    print("Otro animal:")

"""
Explanation: For loops (Ciclos For)
Un for loop va sobre cada elemento del ciclo, Ojo! nota el espaciamiento/indentacion justo despues del for!
End of explanation
"""


lista = ['perro' ,'delfin','perezoso','leon','gato']

for domesticos in lista:
    for animal in lista:
        print(domesticos,animal)
        print(" nada")
        

"""
Explanation: Doble!
End of explanation
"""


arreglo = np.random.randint(1,10,5000)

for indice,animal in enumerate(arreglo):
    print(indice,animal)
print("fin")

"""
Explanation: un loop pero enumerado, te rergresa un indice y un elemento
End of explanation
"""


def tienda(animalito):
    print("barato baratoooo")
    print(animalito)
    return

for animal in lista:
    tienda(animal)

"""
Explanation: Y si quieres un elemento aleatorio de la lista?
El modulo random al rescate, corre varias veces la celda y checa si son aleatorios
Que tal funciones?
End of explanation
"""


lista = ['mAJAdITO','picopas de pollo','quemacho','trancapechos']
for i in lista:
    print(i)

"""
Explanation: Actividad 1 : Ejercicios de Programacion
Meta: Obtener confianza con Python.
1.a) Usa un ciclo-for e imprime tus platillos bolivianos favoritos
End of explanation
"""


n =20
arreglo = np.random.randint(1,10,n)
print(arreglo)

"""
Explanation: 1.b) Crea un arreglo de numeros aleatorios de tamano $n$
End of explanation
"""


def mifuncion(n):
    arreglo = np.random.randint(1,10,n)
    return arreglo

mifuncion(66)

"""
Explanation: 1.c) Encapsula la funcion pasada en una funcion
End of explanation
"""


import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

a = np.random.randint(1,10,10)
plt.hist(a)

"""
Explanation: 1.d)  Grafica un histograma de numeros aleatorios con $n=10,50,100,1k,10k$
Para graficar histogramas usa plt.hist().
End of explanation
"""


from IPython.display import Image
Image(filename='files/large-hadron-collider.jpg')

"""
Explanation: Extra: Sumatoria de ondas

Aproximaremos la siguiente onda cuadrada:
$$
f(x) = \sum^{\infty}_{n=1} \frac{ sin(2 \pi (2n-1) x)}{2n -1}
$$
via la formula:
$$
f(x) = \sum^{N}_{n=1} \frac{ sin(2 \pi (2n-1) x)}{2n -1}
$$
Pasos:

Crear una onda sinosoidal y graficarla $sin(2 \pi  x)$
Crear una onda sumada de cuatro ondas sinosoidal (n=1,2,3,4) y graficarla.
Lo mismo pero utilizando un ciclo para un numero arbitraio $n$
Crear una funcion que para un numero $n$ crea una aproximacion a la onda cuadrada.
Graficar para $n=4,8,12,16,50$

Extra: Mas cosas para darle sabor
Celdas de Texto: Latex & Markdown
Celdas se crean por default como celdas de codigo, pero se pueden cambiar.
Cell are by default created as code cells, can be but can be easily changed to text cells by cliking on the toolbar.
    
In text cells you can embed narrative text using Markdown, HTML code and LaTeX equations with inline dollar signs \$ insert equation \$ and new line as \$\$ insert equation \$\$.
For example: $$H\psi = E\psi$$
The code for this cell is:
```markdown
Text Cells: Latex & Markdown
Cell are by default created as code cells, can be but can be easily changed to text cells by cliking on the toolbar.
    
In text cells you can embed narrative text using Markdown, HTML code and LaTeX equations with inline dollar signs \$ insert equation \$ and new line as \$\$ insert equation \$\$.
For example: $$H\psi = E\psi$$
```
Images
We can work with images (JPEG, PNG) and SVG via the Image and SVG class.
End of explanation
"""


from IPython.display import YouTubeVideo
#https://www.youtube.com/watch?v=_6uKZWnJLCM
YouTubeVideo('_6uKZWnJLCM')

"""
Explanation: Videos?
End of explanation
"""


from IPython.display import HTML
HTML('<iframe src=http://ipython.org/ width=700 height=350></iframe>')

"""
Explanation: External Websites, HTML?
End of explanation
"""


