{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\"AeroPython\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Clase 5: SymPy" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "![](http://sympy.org/static/images/logo.png)\n", "\n", "_ __SymPy es una biblioteca de Python para matemática simbólica__. Apunta a convertirse en un sistema de algebra computacional (__CAS__) con todas sus prestaciones manteniendo el código tan simple como sea posible para manterlo comprensible y fácilmente extensible. SymPy está __escrito totalmente en Python y no requiere bibliotecas adicionales__. _Este proyecto comenzó en 2005, fue lanzado al público en 2007 y a él han contribuido durante estos años cientos de personas._\n", "\n", "_ Otros CAS conocidos son Mathematica y Maple, sin embargo ambos son software privativo y de pago. [Aquí](https://github.com/sympy/sympy/wiki/SymPy-vs.-Maple) puedes encontrar una comparativa de SymPy con Maple. _\n", "\n", "Hoy veremos cómo:\n", "\n", "* Crear símbolos y expresiones.\n", "* Manipular expresiones (simplificación, expansión...)\n", "* Calcular derivadas e integrales.\n", "* Límites y desarrollos en serie.\n", "* Resolución de ecuaciones.\n", "* Resolción de EDOs.\n", "* Matrices\n", "\n", "Sin embargo, SymPy no acaba aquí ni mucho menos..." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Documentación & SymPy Live Shell" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from IPython.display import HTML\n", "HTML('')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## SymPy Gamma" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "HTML('')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Creación de símbolos" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lo primero, como siempre, es importar aquello que vayamos a necesitar:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Importación\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Lo primero que vemos es que el comando `init_session` ha llevado a cabo algunas acciones por nostros:\n", "\n", "* Gracias a `use_latex=True` obtenemos la salida en $\\LaTeX$.\n", "* __Ha creado una serie de variables__ para que podamos ponernos a trabajar en el momento." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
Nota: \n", "En Python, no se declaran las variables, sin embargo, no puedes usar una hasta que no le hayas asignado un valor. Si ahora intentamos crear una variable `a` que sea `a = 2 * b`, veamos qué ocurre:\n", "
" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Intentamos usar un símbolo que no hemos creado\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Como en `b` no había sido creada, Python no sabe qué es `b`.\n", "\n", "Esto mismo nos ocurre con los símbolos de SymPy. __Antes de usar una variable, debo decir que es un símbolo y asignárselo:__" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Creamos el símbolo a\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Número pi\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Unidad imaginaria\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Número e\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Vemos qué tipo de variable es a\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ahora ya podría crear `b = 2 * a`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "¿Qué está ocurriendo? Python detecta que a es una variable de tipo `Symbol` y al multiplicarla por `2` devuelve una variable de Sympy.\n", "\n", "Como Python permite que el tipo de una variable cambie, __si ahora le asigno a `a` un valor float deja de ser un símbolo.__" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "__Las conclusiones son:__\n", "\n", "* __Si quiero usar una variable como símbolo debo crearla previamente.__\n", "* Las operaciones con símbolos devuelven símbolos.\n", "* Si una varibale que almacenaba un símbolo recibe otra asignación, cambia de tipo.\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__Las variables de tipo `Symbol` actúan como contenedores en los que no sabemos qué hay (un real, un complejo, una lista...)__. Hay que tener en cuenta que: __una cosa es el nombre de la variable y otra el símbolo con el que se representa__." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#creación de símbolos\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Incluso puedo hacer cosas raras como:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Diferencia entre variable y símbolo\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Además, se pueden crear varos símbolos a la vez:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "y símbolos griegos:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__Por defecto, SymPy entiende que los símbolos son números complejos__. Esto puede producir resultados inesperados ante determinadas operaciones como, por ejemplo, lo logaritmos. __Podemos indicar que la variable es real, entera... en el momento de la creación__:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Creamos símbolos reales\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Podemos ver las asunciones de un símbolo\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Expresiones" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Comencemos por crear una expresión como: $\\cos(x)^2+\\sin(x)^2$" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `simplify()`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Podemos pedirle que simplifique la expresión anterior:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "En este caso parece estar claro lo que quiere decir más simple, pero como en cualquier _CAS_ el comando `simplify` puede no devolvernos la expresión que nosotros queremos. Cuando esto ocurra necesitaremos usar otras instrucciones." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `.subs()`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "En algunas ocasiones necesitaremos sustituir una variable por otra, por otra expresión o por un valor." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Sustituimos x por y ** 2\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# ¡Pero la expresión no cambia!\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Para que cambie\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Cambia el `sin(x)` por `exp(x)`" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Particulariza la expresión $sin(x) + 3 x $ en $x = \\pi$" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__Aunque si lo que queremos es obtener el valor numérico lo mejor es `.evalf()`__" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#ver pi con 25 decimales\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#el mismo resultado se obtiene ocn la función N()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Simplificación" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "SymPy ofrece numerosas funciones para __simplificar y manipular expresiones__. Entre otras, destacan:\n", "\n", "* `expand()`\n", "* `factor()`\n", "* `collect()`\n", "* `apart()`\n", "* `cancel()`\n", "\n", "Puedes consultar en la documentación de SymPy lo que hace cada una y algunos ejemplos. __Existen también funciones específicas de simplificación para funciones trigonométricas, potencias y logaritmos.__ Abre [esta documentación](http://docs.sympy.org/latest/tutorial/simplification.html) si lo necesitas." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### ¡Te toca!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pasaremos rápidamente por esta parte, para hacer cosas \"más interesantes\". Te proponemos algunos ejemplos para que te familiarices con el manejor de expresiones:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__Crea las expresiones de la izquierda y averigua qué función te hace obtener la de la derecha:__\n", "\n", "expresión 1| expresión 2\n", ":------:|:------:\n", "$\\left(x^{3} + 3 y + 2\\right)^{2}$ | $x^{6} + 6 x^{3} y + 4 x^{3} + 9 y^{2} + 12 y + 4$\n", "$\\frac{\\left(3 x^{2} - 2 x + 1\\right)}{\\left(x - 1\\right)^{2}} $ | $3 + \\frac{4}{x - 1} + \\frac{2}{\\left(x - 1\\right)^{2}}$\n", "$x^{3} + 9 x^{2} + 27 x + 27$ | $\\left(x + 3\\right)^{3}$\n", "$\\sin(x+2y)$ | $\\left(2 \\cos^{2}{\\left (y \\right )} - 1\\right) \\sin{\\left (x \\right )} + 2 \\sin{\\left (y \\right )} \\cos{\\left (x \\right )} \\cos{\\left (y \\right )}$\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#1\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#2\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#3\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#4\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Derivadas e integrales" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Puedes derivar una expresion usando el método `.diff()` y la función `dif()`" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#creamos una expresión\n", "\n", "\n", "#obtenemos la derivada primera con funcion\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#utilizando método\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__¿derivada tercera?__" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__¿varias variables?__" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__Queremos que la deje indicada__, usamos `Derivative()`" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__¿Será capaz SymPy de aplicar la regla de la cadena?__" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Creamos una función F\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Creamos una función G\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "$$\\frac{d}{d x} F{\\left (G(x) \\right )} $$" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Derivamos la función compuesta F(G(x))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "En un caso en el que conocemos las funciones:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# definimos una f\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# definimos una g(f)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#la derivamos\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### Te toca integrar" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "__Si te digo que se integra usando el método `.integrate()` o la función `integrate()`__. ¿Te atreves a integrar estas casi inmediatas...?:\n", "\n", "$$\\int{\\cos(x)^2}dx$$\n", "$$\\int{\\frac{dx}{\\sin(x)}}$$\n", "$$\\int{\\frac{dx}{(x^2+a^2)^2}}$$\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Límites" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Calculemos este límite sacado del libro _Cálculo: definiciones, teoremas y resultados_, de Juan de Burgos:\n", "\n", "$$\\lim_{x \\to 0} \\left(\\frac{x}{\\tan{\\left (x \\right )}}\\right)^{\\frac{1}{x^{2}}}$$\n", "\n", "Primero creamos la expresión:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Obtenemos el límite con la función `limit()` y si queremos dejarlo indicado, podemos usar `Limit()`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Series" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Los desarrollos en serie se pueden llevar a cabo con el método `.series()` o la función `series()`" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#creamos la expresión\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#la desarrollamos en serie\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Se puede especificar el número de términos pasándole un argumento `n=...`. El número que le pasemos será el primer término que desprecie." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Indicando el número de términos\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si nos molesta el $\\mathcal{O}(x^{10})$ lo podemos quitar con `removeO()`:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Resolución de ecuaciones" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Como se ha mencionado anteriormente las ecuaciones no se pueden crear con el `=`" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#creamos la ecuación\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# También la podemos crear como\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#la resolvemos\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Pero la gracia es resolver con símbolos, ¿no?\n", "$$a e^{\\frac{x}{t}} = C$$" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Creamos los símbolos y la ecuación\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# La resolvemos\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si consultamos la ayuda, vemos que las posibilidades y el número de parámetros son muchos, no vamos a entrar ahora en ellos, pero ¿se ve la potencia?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Ecuaciones diferenciales" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tratemos de resolver, por ejemplo:\n", "\n", "$$y{\\left (x \\right )} + \\frac{d}{d x} y{\\left (x \\right )} + \\frac{d^{2}}{d x^{2}} y{\\left (x \\right )} = \\cos{\\left (x \\right )}$$" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#resolvemos\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Matrices" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#creamos una matriz llena de símbolos\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#sacamos autovalores\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#inversa\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#elevamos al cuadrado la matriz\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "_ Esto ha sido un rápido recorrido por algunas de las posibilidades que ofrece SymPy . El cálculo simbólico es un terreno díficil y este joven paquete avanza a pasos agigantados gracias a un grupo de desarrolladores siempre dispuestos a mejorar y escuchar sugerencias. Sus posibilidades no acaban aquí. En la siguiente clase presentaremos el paquete `mechanics`, pero además cuenta con herramientas para geometría, mecánica cuántica, teoría de números, combinatoria... Puedes echar un ojo [aquí](http://docs.sympy.org/latest/modules/index.html). _" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "\n", "Clase en vídeo, parte del [Curso de Python para científicos e ingenieros](http://cacheme.org/curso-online-python-cientifico-ingenieros/) grabado en la Escuela Politécnica Superior de la Universidad de Alicante." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from IPython.display import YouTubeVideo\n", "\n", "YouTubeVideo(\"OGQRcYVys1Q\", width=560, height=315, list=\"PLGBbVX_WvN7as_DnOGcpkSsUyXB1G_wqb\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si te ha gustado esta clase:\n", "\n", "Tweet\n", "\n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "####

¡Síguenos en Twitter!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "###### Follow @AeroPython " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### \"Licencia
Curso AeroPython por Juan Luis Cano Rodriguez y Alejandro Sáez Mollejo se distribuye bajo una Licencia Creative Commons Atribución 4.0 Internacional." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "##### " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "_Las siguientes celdas contienen configuración del Notebook_\n", "\n", "_Para visualizar y utlizar los enlaces a Twitter el notebook debe ejecutarse como [seguro](http://ipython.org/ipython-doc/dev/notebook/security.html)_\n", "\n", " File > Trusted Notebook" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "Follow @AeroPython\n", "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%html\n", "Follow @AeroPython\n", "" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", "\n", "El estilo se ha aplicado =)\n", "\n", "\n", "\n" ], "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Esta celda da el estilo al notebook\n", "from IPython.core.display import HTML\n", "css_file = '../static/styles/style.css'\n", "HTML(open(css_file, \"r\").read())" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.4.3" } }, "nbformat": 4, "nbformat_minor": 0 }