Como ejecutar un cuaderno de Jupyter Notebook en Visual Studio Code


En efecto gracias a la extensión de Jupyter para Visual Studio Code podemos ejecutar nuestros cuadernos en python de Jupyter Notebook desde el interfaz de Visual Studio Code, editor que como probablemente amigo lector sabrà es gratuito y uno de los más potentes IDEs hasta la fecha.

Jupyter Notebook es una herramienta increíblemente poderosa para desarrollar y presentar proyectos de ciencia de datos de forma interactiva. Este post intentara guiarle de cómo usar Jupyter Notebooks para proyectos de ciencia de datos y cómo configurarlo en su máquina local pero en vez de usar un navegador lo cual nos genera ciertos problemas ( versionado, restauración de código , etc.) lo usaremos desde el potente IDE de Visual Studio Code.

jupyter-notebook las mejores herramientas gratuitas de ciencia de datos

Pero primero: ¿qué es un “cuaderno”?

Un cuaderno integra código y su salida en un solo documento que combina visualizaciones, texto narrativo, ecuaciones matemáticas y otros medios enriquecidos. En otras palabras: es un documento único en el que puede ejecutar código, mostrar el resultado y también agregar explicaciones, fórmulas, gráficos y hacer que su trabajo sea más transparente, comprensible, repetible y compartible. 

El uso de Notebooks es ahora una parte importante del flujo de trabajo de la ciencia de datos en empresas de todo el mundo. Si su objetivo es trabajar con datos, el uso de una computadora portátil acelerará su flujo de trabajo y facilitará la comunicación y el intercambio de resultados. 

Lo mejor de todo es que, como parte del proyecto de código abierto  Jupyter , los cuadernos de Jupyter son completamente gratuitos. Puede descargar el software  solo o como parte del kit de herramientas de ciencia de datos de Anaconda .

Aunque es posible utilizar muchos lenguajes de programación diferentes en Jupyter Notebooks, nos centraremosen Python, ya que es el caso de uso más común. (Entre los usuarios de R, R Studio  tiende a ser una opción más popular).Jupyter Notebooks también puede actuar como una plataforma flexible para familiarizarse con los pandas e incluso con Python, como se verá en este tutorial.


Las extensiones de Visual Studio Code proporcionan soporte básico de cuaderno para los kernels de lenguaje que son compatibles con los cuadernos Jupyter hoy en día. Muchos kernels de lenguaje funcionarán sin ninguna modificación. Para habilitar las características avanzadas, pueden ser necesarias modificaciones en las extensiones de lenguaje de VS Code.

La extensión Jupyter incluye por defecto las extensiones Jupyter Keymaps y Jupyter Notebook Renderers. La extensión Jupyter Keymaps proporciona mapas de teclado consistentes con Jupyter y la extensión Jupyter Notebook Renderers proporciona renderizadores para tipos MIME como latex, plotly, vega, y similares. Ambas extensiones pueden deshabilitarse o desinstalarse. Y por cierto, la extensión está disponible en varios idiomas: de, en, es, fa, fr, it, ja, ko-kr, nl, pl, pt-br, ru, tr, zh-cn, zh-tw

La Extensión Jupyter utiliza el soporte de cuadernos incorporado de VS Code. Esta interfaz de usuario ofrece una serie de ventajas a los usuarios de cuadernos:

  • Soporte inmediato de la amplia gama de funciones básicas de edición de código de VS Code, como la salida en caliente, la búsqueda y el reemplazo, y el plegado de código.
  • Extensiones del editor como VIM, coloración de corchetes, linters y muchas más están disponibles mientras se edita una celda.
  • Profunda integración con el banco de trabajo general y con las funciones basadas en archivos de VS Code, como la vista de esquema (tabla de contenidos), las migas de pan y otras operaciones.
  • Tiempos de carga rápidos para los archivos Jupyter notebook (.ipynb). Cualquier archivo de cuaderno se carga y renderiza lo más rápidamente posible, mientras que las operaciones relacionadas con la ejecución se inicializan entre bastidores.
  • Incluye una herramienta de diferencias para cuadernos, que facilita la comparación y la visualización de las diferencias entre las celdas de código, los resultados y los metadatos.
  • Extensibilidad más allá de lo que proporciona la extensión Jupyter. Las extensiones ahora pueden añadir su propio lenguaje o tiempo de ejecución específico a los cuadernos, como los cuadernos interactivos de .NET y Gather
  • Aunque la extensión de Jupyter viene con un amplio conjunto de los renderizadores más utilizados para la salida, el mercado admite renderizadores personalizados instalables para que el trabajo con tus cuadernos sea aún más productivo. Para empezar a escribir los tuyos propios, consulta la documentación de la api de renderizadores de VS Code.

Trabajar con Python


Si quiere trabajar con Python sólo tiene que asegurarte de que utiliza la última versión de la Extensión Python para disfrutar de la asociación conjunta de las Extensiones Python y Juypter.

Por favor, siga las instrucciones de Léame de la Extensión Python para empezar y visite la Documentación de Python para aprender más sobre cómo la Extensión Python y Jupyter trabajan juntas para proporcionar una experiencia óptima de cuadernos Python.

Ejecutar por línea


Para iniciar una sesión de depuración ligera y ejecutar celdas de código línea por línea en cuadernos de Python, pulse F10 mientras selecciona una celda o haga clic en el botón Ejecutar por línea de la barra de herramientas de la celda. También admite núcleos remotos.

Una vez que inicies una sesión de Ejecutar por Línea, aparecerá el Explorador de Variables y los valores de las variables se actualizarán a medida que itera a través de su código.

Para recorrer el resto de la celda durante una sesión Run by Line pulse Ctrl+Enter. Para parar, puede hacer clic en el botón de interrupción en el lado izquierdo de la celda.


Por cierto como ya se ha comentado ,la Extensión Jupyter soporta otros lenguajes además de Python como Julia, R y C#.

Estsos serian los pasos a seguir para un Inicio rápido


Para crear un nuevo cuaderno, abra la paleta de comandos (Windows: Ctrl + Shift + P, macOS: Command + Shift + P) y seleccione el comando «Crear: Nuevo cuaderno Jupyter».

Selecciona su kernel haciendo clic en el selector de kernel en la parte superior derecha del cuaderno o invocando el comando «Notebook: Seleccionar núcleo de cuaderno».(Notebook: Select Notebook Kernel)

Cambie el idioma de la celda haciendo clic en el selector de idioma o invocando el comando «Cuaderno: Cambiar idioma de la celda». (Notebook: Change Cell Language)

Comandos útiles


Abre la paleta de comandos (Comando+Mayúsculas+P en macOS y Ctrl+Mayúsculas+P en Windows/Linux) y escribe uno de los siguientes comandos:

CommandDescription
Create: New Jupyter NotebookCreate: New Jupyter Notebook
Notebook: Select Notebook KernelSelect or switch kernels within your notebook
Notebook: Change Cell LanguageChange the language of the cell currently in focus
Jupyter: Export to HTML Jupyter: Export to PDFCreate a presentation-friendly version of your notebook in HTML or PDF

Para ver todos los comandos disponibles de Jupyter Notebook, abra la paleta de comandos y escriba Jupyter o Notebook.

Teclas de contexto para los enlaces de teclas


Puede utilizar las teclas de contexto de la extensión en cláusulas «cuando». He aquí un ejemplo:

  {
    "key": "ctrl+i",
    "command": "jupyter.runAndDebugCell",
    "when": "!jupyter.webExtension"
  }

Ese keybinding establece que el comando jupyter.runAndDebugCell debe asignarse a CTRL+I cuando no está en la jupyter.webExtension.

La lista completa de teclas de contexto se puede encontrar aquí: https://github.com/microsoft/vscode-jupyter/wiki/Extensibility-for-other-extensions#context-keys-for-keybindings

Mas información:


Aprenda más sobre las ricas características de la extensión Jupyter:

IntelliSense: Edite su código con autocompletado, navegación por el código, comprobación de sintaxis y mucho más. (mas info en https://code.visualstudio.com/docs/python/editing#_autocomplete-and-intellisense)

Cuadernos Jupyter: Cree y edite cuadernos Jupyter, añada y ejecute celdas de código/marcadas, haga trazados, cree versiones de su cuaderno aptas para la presentación exportándolas a HTML o PDF y mucho más. (mas info en https://code.visualstudio.com/docs/python/jupyter-support)

Descarga extension Jupyter para Visual Studio Code:Mas información en https://marketplace.visualstudio.com/items?itemName=ms-toolsai.jupyter

Cálculo resistencia de carga para sensores no invasivos de tensión


A la hora de medir con un controlador la intensidad de un circuito de ca, existen shunts , modernamente sensores hall, pero ambos adolecen de ser intrusivos porque requieren interrumpir el circuito para conectar estos. Modernamente han aparecido sensores no intrusivos basados en un núcleo partido que se puede abrir para intercalar el fase del circuito a medir. En este ámbito destacan los sensores de corriente alterna SCT-013 , los cuales podríamos clasificarlos en dos grupos: los que proporcionan una corriente o los que proporcionan un voltaje siendo la gran diferencia entre ellos que en los primeros no viene incluida una resistencia de carga y en los segundos sí (el nombre resistencia de carga o resistencia «burden» se refiere a la función que hace, no a como están fabricadas siendo su función convertir la corriente en un voltaje limitado que podamos medir, por ejemplo, con un microcontrolador).

El sensor SCT-013-000 es el único que nos proporciona una corriente y por tanto no tiene resistencia de carga. Puede medir una corriente de entre 50 mA y 100 A. El resto de la familia de sensores SCT-013 sí que tienen incluida la resistencia de carga. Podemos encontrar varios modelos pero todos tienen un voltaje de salida entre 0V y 1V.

Esta tabla nos describe las principales características de la familia de sensores SCT disponible :

Elegir uno u otro sensor SCT-013 dependerá de las necesidades reales. Como vemos en la tabla anterior, deberá elegir la intensidad de corriente que mejor se acople a sus necesidades o bien seleccionar el modelo «personalizado» SCT-013-000.

En post por tanto vamos a trabajar con el SCT-013-000 debido a que no tiene resistencia de carga lo cual nos va a permitir seleccionar la resistencia de carga más adecuada para medir con masa precisión el consumo eléctrico de un electrodoméstico en concreto como por ejemplo podria ser un frigorífico.

Para conectar un sensor CT a un Arduino, la señal de salida del sensor CT debe acondicionarse para que cumpla con los requisitos de entrada de las entradas analógicas Arduino, es decir, un  voltaje positivo entre 0 V y el voltaje de referencia ADC.

Este ejemplo vemos una placa Arduino que funciona a 5 V y el EmonTx que funciona a 3,3 V. Asegúrese de utilizar el voltaje de suministro y el voltaje de polarización correctos en sus cálculos que correspondan a su configuración.

Esto se puede lograr con el siguiente circuito que consta de dos partes principales: 

  1. El sensor CT y la resistencia de carga
  2. El divisor de voltaje de polarización ( R1 y R2 )

Basta con sumar 2,5V y estaría resuelto. Esto lo haremos a través de un circuito conocido como circuito offset en DC,lo cual básicamente consiste en poner un divisor de tensión y un condensador (el condensador tiene que ser de 10μF y unos pocos cientos de voltios lo cual hace que la reactancia sea baja y la corriente alterna evite la resistencia).

El valor de las resistencias del divisor de tensión puede ser 10kΩ siempre y cuando lo alimentemos a través de la red eléctrica, pero si su dispositivo va a funcionar con baterías utilice unas resistencias de 470kΩ para que el consumo sea mínimo.

Cálculo de un tamaño de resistencia de carga adecuado

Si el sensor CT es del tipo de «salida de corriente» como el YHDC SCT-013-000 , la señal de corriente debe convertirse en una señal de voltaje con una resistencia de carga. Si se trata de un CT de salida de voltaje, puede omitir este paso y omitir la resistencia de carga, ya que la resistencia de carga está integrada en el CT.

Este es el cálculo de la citada resistencia:

1) Elija el rango actual que desea medir

El YHDC SCT-013-000 CT tiene un rango de corriente de 0 a 100 A. Para este ejemplo, elijamos 100 A como nuestra corriente máxima.

2) Convierta la corriente RMS máxima en corriente pico multiplicando por √2.

Corriente máxima primaria = corriente RMS × √2 = 100 A × 1,414 = 141,4 A

Resultado =141,4 Amp

3) Divida el pico de corriente por el número de vueltas en el TC para obtener el pico de corriente en la bobina secundaria.

El TC YHDC SCT-013-000 tiene 2000 vueltas, por lo que la corriente pico del secundario será:

Pico de corriente secundario = Pico de corriente primario / no. de vueltas = 141.4 A / 2000 = 0.0707A

Resultado 2= 0.07Amp

4) Para maximizar la resolución de la medición, el voltaje a través de la resistencia de carga en el pico de corriente debe ser igual a la mitad del voltaje de referencia analógico de Arduino. (AREF / 2)

Si está utilizando un Arduino que funciona a 5V: AREF / 2 será de 2,5 voltios. 

Entonces la resistencia de carga ideal será:

Resistencia de carga ideal = (AREF/2) / Pico de corriente secundario = 2,5 V / 0,0707 A = 35,4 Ω

Resultado 3= 35,4 ohmios

Es fácil adivinar que 35 Ω no es un valor de resistencia común. Los valores más cercanos a ambos lados de 35 Ω son 39 y 33 Ω. Elija siempre el valor más pequeño, o la corriente de carga máxima creará un voltaje más alto que AREF. Recomendamos una carga de 33 Ω ±1%. En algunos casos, el uso de 2 resistencias en serie estará más cerca del valor de carga ideal. Cuanto más lejos del ideal esté el valor, menor será la precisión.

Aquí están los mismos cálculos que arriba en una forma más compacta:

Resistencia de carga (ohmios) = (AREF * CT TURNS) / (2√2 * corriente primaria máx.)

emonTx V2

Si está utilizando un emonTx V2 alimentado por batería, AREF comenzará a 3,3 V y disminuirá lentamente a medida que el voltaje de la batería caiga a 2,7 V. Por lo tanto, la resistencia de carga ideal para el voltaje mínimo sería:

Resistencia de carga ideal = (AREF/2) / Pico de corriente secundario = 1,35 V / 0,0707 A = 19,1 Ω

19 Ω no es un valor común. Tenemos una opción de 18 o 22 Ω. Recomendamos utilizar una carga de 18 Ω ±1%.

emonTx V3

El emonTx V3 usa un regulador de 3.3V, por lo que es V CC y por lo tanto AREF, siempre será de 3.3V independientemente del voltaje de la batería. El emonTx V3 estándar usa resistencias de carga de 22 Ω para CT 1, 2 y 3, y una resistencia de 120 Ω para CT4, el canal de alta sensibilidad. 

2) Agregar un sesgo de CC

Si tuviera que conectar uno de los cables del TC a tierra y medir el voltaje del segundo cable, con respecto a tierra, el voltaje variaría de positivo a negativo con respecto a tierra. Sin embargo, las entradas analógicas de Arduino requieren un voltaje positivo. Al conectar el cable de CT que conectamos a tierra, a una fuente a la mitad del voltaje de suministro, el voltaje de salida de CT ahora oscilará por encima y por debajo de 2,5 V, por lo que permanecerá positivo.

Las resistencias R1 y R2 en el diagrama de circuito anterior son un divisor de voltaje que proporciona la fuente de 2,5 V (1,65 V para el emonTx). El condensador electrolítico C1 tiene una reactancia baja de unos pocos cientos de ohmios, y proporciona un camino para que la corriente alterna evite la resistencia. Un valor de 10 μF es adecuado por ejemplo de 100v.

Elegir un valor adecuado para las resistencias R1 y R2:

Una mayor resistencia reduce el consumo de energía en reposo por lo que podemos usar resistencias de 10 kΩ para monitores alimentados por la red. El emonTx utiliza resistencias de 470 kΩ para mantener el consumo de energía al mínimo, ya que está diseñado para funcionar con baterías durante varios meses.

Boceto de Arduino

Para usar el circuito descrito para medir la corriente RMS, con un voltaje RMS fijo asumido (por ejemplo, 240 V) para indicar la potencia aparente aproximada, podemos usar el siguiente código en Arduino:

// Include Emon Library
#include "EmonLib.h"
 
// Crear una instancia EnergyMonitor
EnergyMonitor energyMonitor;
 
// Voltaje de nuestra red eléctrica
float voltajeRed = 220.0;
 
void setup()
{
  Serial.begin(9600);
 
  // Iniciamos la clase indicando
  // Número de pin: donde tenemos conectado el SCT-013
  // Valor de calibración: valor obtenido de la calibración teórica
  energyMonitor.current(0, 2.6);
}
 
void loop()
{
  // Obtenemos el valor de la corriente eficaz
  // Pasamos el número de muestras que queremos tomar
  double Irms = energyMonitor.calcIrms(1484);
 
  // Calculamos la potencia aparente
  double potencia =  Irms * voltajeRed;
 
  // Mostramos la información por el monitor serie
  Serial.print("Potencia = ");
  Serial.print(potencia);
  Serial.print("    Irms = ");
  Serial.println(Irms);
}


Mas info en https://openenergymonitor.github.io/forum-archive/node/156.html