La vida es demasiado corta, uso Python
1. Escribe al principio
Hola hermanos
Anteriormente, los scripts de Python a menudo se escribían para el procesamiento de datos, la transferencia de datos y el entrenamiento de modelos. Ejecutar el script puede llevar algún tiempo a medida que aumenta el volumen y la complejidad de los datos. Puede hacer otro trabajo al mismo tiempo mientras espera que se complete el procesamiento de datos.
Para lograr esto, se escribieron un conjunto de scripts de Python para resolver este problema. Utilice estos scripts para enviar actualizaciones de procesos, visualizaciones y notificaciones de finalización a su teléfono. Cuando tiene estos momentos de libertad de vez en cuando, puede disfrutar en lugar de preocuparse por el progreso de su modelo.
2. Lo que se necesita
La primera pregunta es, ¿qué necesitas saber? Depende de lo que estés haciendo. Para el autor, hay tres tareas principales de procesamiento que pueden llevar tiempo:
- entrenamiento modelo
- Tratamiento y/o transferencia de datos
- modelo financiero
Tenemos que analizar cada caso en detalle.
3. Formación modelo
Actualizar cada n épocas, debe incluir métricas clave. Por ejemplo, pérdida y precisión en conjuntos de entrenamiento y validación. Luego complete la notificación, incluyendo:
-
Visualización de métricas clave durante el entrenamiento (nuevamente, pérdida y precisión en conjuntos de entrenamiento y validación)
-
Otra información menos importante pero aún útil, como el directorio del modelo local, el tiempo de capacitación, la arquitectura del modelo, etc.
-
Salida prevista, para la generación de texto, salida del texto generado (o una muestra del mismo); para la generación de imágenes
El resultado es una visualización genial (con suerte)
Tomemos el ejemplo de entrenar una red neuronal para reproducir un estilo de arte dado. Necesitamos centrarnos en las imágenes generadas a partir del modelo, las gráficas de pérdida y precisión, el tiempo de entrenamiento actual y el nombre de un modelo.
import notify
START= datetime.now() # this line would be placed before modeltraining begins
MODELNAME="SynthwaveGAN" # giving us ourmodel name
NOTIFY=100 # so we send an update notification every100 epochs
# for each epoch e,we would include the following code
if e % notify_epoch ==0and e !=0:
# here we createthe email body message
txt = (f"{
MODELNAME} update as of "
f"{
datetime.now().strftime( %H:%M:%S )}.")
# we build theMIME message object with notify.message
msg = notify.message(
subject= Synthwave GAN ,
text=txt,
img=[
f ../visuals/{
MODELNAME}/epoch_{
e}_loss.png ,
f ../visuals/{
MODELNAME}/epoch_{
e}_iter_{
i}.png
]
) # note that weattach two images here, the loss plot and
# ...a generated image output from our model
notify.send(msg) # we then send the message
Cada 100 épocas, se envía un correo electrónico con todo lo anterior. Este es uno de los correos electrónicos:
4. Procesamiento y transmisión de datos
No es muy interesante, pero en términos de consumo de tiempo, ocupa el primer lugar.
Tome el ejemplo de cargar datos masivos a SQLServer usando Python (para aquellos sin BULK INSERT). Al final de la secuencia de comandos de carga, habrá un mensaje simple que notifica que la carga se completó.
import os
import notify
from data importSql # seehttps://jamescalam.github.io/pysqlplus/lib/data/sql.html
dt =Sql( database123 , server001 ) # setup theconnection to SQL Server
for i, file inenumerate(os.listdir( ../data/new )):
dt.push_raw(f ../data/new/{
file} ) # push a file to SQL Server
# once the upload is complete, send a notification
# first we create the message
msg = notify.message(
subject= SQL Data Upload ,
text=f Data upload complete, {
i} filesuploaded. ,
)
# send the message
notify.send(msg)
Si se produce un error de vez en cuando, también puede agregar una instrucción try-except para detectar el error y agregarlo a una lista para incluirlo en los correos electrónicos de actualización y/o finalización.
5. Modelo Financiero
Todo lo que se ejecuta en el modelado financiero es realmente muy rápido, por lo que solo puedo dar un ejemplo aquí.
Tome la herramienta de modelado de flujo de efectivo como ejemplo. En realidad, este proceso solo toma de 10 a 20 segundos, pero ahora imagina que eres el analista cuantitativo más importante de Wall Street, procesando varios millones de préstamos. En este correo electrónico, es posible que desee incluir una cartera de perfiles avanzados. Es posible seleccionar aleatoriamente algunos préstamos y visualizar las cifras clave durante un período de tiempo determinado, dada una pequeña muestra para cotejar el rendimiento del modelo.
end = datetime.datetime.now() # get the ending datetime
# get the total runtime in hours:minutes:seconds
hours,rem =divmod((end - start).seconds, 3600)
mins,secs =divmod(rem, 60)
runtime= {
:02d}:{
:02d}:{
:02d} .format(hours, mins,secs)
# now built our message
notify.msg(
subject="Cashflow Model Completion",
text=(f {
len(model.output)} loansprocessed.
f Total runtime:{
runtime} ),
img=[
../vis/loan01_amortisation.png ,
../vis/loan07_amortisation.png ,
../vis/loan01_profit_and_loss.png ,
../vis/loan07_profit_and_loss.png
]
)
notify.send(msg) # and send it
6. Código
Todas las funciones anteriores se extraen de un script llamado notificar.py. Outlook se utilizará en el código de ejemplo. Aquí se necesitan dos bibliotecas de Python, email y smtplib:
email: Se utiliza para gestionar los mensajes de correo electrónico. Con esta biblioteca es posible configurar el propio mensaje de correo electrónico, incluido el asunto, el cuerpo y los archivos adjuntos.
smtplib: maneja las conexiones SMTP. El Protocolo simple de transferencia de correo (SMTP) es el protocolo utilizado por la mayoría de los sistemas de correo electrónico para permitir el envío de correo a través de Internet.
Siete, MIME
El mensaje en sí se construye utilizando el objeto MIMEMultipart del módulo de correo electrónico. También hay tres subclases MIME que deben usarse y adjuntarse al objeto MIMEMultipart:
-
mimetext: Contendrá la "carga útil" del correo electrónico, el texto en el cuerpo del correo electrónico.
-
mimeimage: Esto se usa para incluir imágenes en los correos electrónicos.
-
mimeapplication: El objeto de aplicación para mensajes MIME. Es decir, archivos adjuntos.
Además de estas subclases, existen otros parámetros, como el valor del Sujeto en MimeMultipart. Todo esto se suma a la estructura a continuación.
Qué sucede cuando los pones todos juntos:
import os
from email.mime.text importMIMEText
from email.mime.image importMIMEImage
from email.mime.application importMIMEApplication
from email.mime.multipart importMIMEMultipart
defmessage(subject="PythonNotification", text="", img=None, attachment=None):
# build messagecontents
msg =MIMEMultipart()
msg[ Subject ] = subject # add in thesubject
msg.attach(MIMEText(text)) # add text contents
# check if wehave anything given in the img parameter
if img isnotNone:
# if we do, wewant to iterate through the images, so let s check that
# what we haveis actually a list
iftype(img) isnot list:
img = [img] # if it isn t alist, make it one
# now iteratethrough our list
for one_img in img:
img_data =open(one_img, rb ).read() # read the imagebinary data
# attach theimage data to MIMEMultipart using MIMEImage, we add
# the givenfilename use os.basename
msg.attach(MIMEImage(img_data, name=os.path.basename(one_img)))
# we do the samefor attachments as we did for images
if attachment isnotNone:
iftype(attachment) isnot list:
attachment = [attachment] # if it isn t a list, make it one
for one_attachment in attachment:
withopen(one_attachment, rb ) as f:
# read in theattachment using MIMEApplication
file =MIMEApplication(
f.read(),
name=os.path.basename(one_attachment)
)
# here we editthe attached file metadata
file[ Content-Disposition ] =f attachment; filename="{os.path.basename(one_attachment)}"
msg.attach(file) # finally, addthe attachment to our message object
return msg
Este script es bastante simple. En la parte superior, hay importaciones (esta es la parte MIME que se cubrió antes) y la biblioteca os de Python.
A continuación, defina una función llamada mensaje. Esto permite llamar a funciones con diferentes argumentos y crear fácilmente un objeto de mensaje de correo electrónico. Por ejemplo, un correo electrónico con varias imágenes y archivos adjuntos se puede escribir así:
email_msg= message(
text="Model processing complete,please see attached data.",
img=[ accuracy.png , loss.png ],
attachments=[ data_in.csv , data_out.csv ]
)
Primero, el objeto MIMEMultipart se inicializa y se asigna a msg; luego, el asunto del correo electrónico se establece usando la tecla "asunto". El método de conexión agrega diferentes subclases MIME al objeto MIMEMultipart. Puede usar la subclase MIMEText para agregar el cuerpo del correo electrónico.
Para imágenes img y archivos adjuntos, puede pasar nada más que una ruta de archivo o pasar un conjunto de rutas de archivo. Lo manejamos verificando primero si el argumento es Ninguno, y si es Ninguno, páselo; de lo contrario, verifique el tipo de datos dado, no una lista, y cree uno, lo que hace posible iterar sobre los elementos con el ciclo for abajo.
A continuación, utilice las subclases MIMEImage y MIMEApplication para adjuntar imágenes y archivos, respectivamente. Use os.basename para obtener el nombre de archivo de la ruta de archivo dada, incluido el nombre de archivo en el nombre del archivo adjunto.
8. SMTP
Ahora que el objeto del mensaje de correo electrónico está construido, el siguiente paso es enviarlo. Aquí es donde entra en juego el módulo smtplib. El código también es muy simple con una excepción.
Se requieren diferentes direcciones SMTP debido a que se trata directamente con diferentes proveedores de correo electrónico y sus respectivos servidores. Escriba "perspectiva smtp" en google. Sin hacer clic en la página, puede obtener la dirección del servidor smtp-mail.outlook.com y el número de puerto 587.
Ambos métodos son necesarios al inicializar el objeto SMTP mediante smtplib.SMTP. SMTP: función de envío cerca del principio:
import smtplib
import socket
defsend(server= smtp-mail.outlook.com , port= 587 , msg):
# contain followingin try-except in case of momentary network errors
try:
# initialiseconnection to email server, the default is Outlook
smtp = smtplib.SMTP(server, port)
# this is the Extended Hello command, essentially greeting our SMTP or ESMTP server
smtp.ehlo()
# this is the Start Transport Layer Security command, tells the server we will
# becommunicating with TLS encryption
smtp.starttls()
# read email andpassword from file
withopen( ../data/email.txt , r ) as fp:
email = fp.read()
withopen( ../data/password.txt , r ) as fp:
pwd = fp.read()
# login tooutlook server
smtp.login(email, pwd)
# sendnotification to self
smtp.sendmail(email, email, msg.as_string())
# disconnectfrom the server
smtp.quit()
except socket.gaierror:
print("Network connection error, email notsent.")
smtp.ehlo() y smtp.starttls() son comandos SMTP. ehlo (Hola extendido) esencialmente dice hola al servidor. starttls informa al servidor que se utilizará una conexión de seguridad de nivel de transporte (TLS) cifrada para la comunicación.
Después de esto, simplemente lea el correo electrónico y la contraseña del archivo, guárdelos en correo electrónico y pwd respectivamente. Luego, inicie sesión en el servidor SMTP usando smtp.login. Inicie sesión y envíe un correo electrónico usando smtp.sendmail.
Siempre me envío notificaciones a mí mismo, pero en el caso de los informes automáticos, es posible que desee enviar el correo electrónico a otra parte. Para esto, cambiaría la dirección_destino: smtp.sendmail(email, dirección_destino, msg.as_string).
Finalmente, termine la sesión y cierre la conexión a smtp.quit.
Ponga todo esto en una sentencia try-except. En caso de una pérdida momentánea de conectividad de red, no será posible conectarse al servidor. da como resultado socket.gaierror. Utilice la instrucción try-except para evitar que su programa se bloquee si falla la conexión de red.
El autor lo usa para actualizar el entrenamiento del modelo ML y completar la transferencia de datos. No importa si el correo no se envía. Este manejo simple y pasivo de la pérdida de conexión es apropiado.
Nueve, juntos
Ahora que se han escrito las dos partes del código, podemos enviar el correo electrónico:
# builda message object
msg = message(text="See attached!", img= important.png ,
attachment= data.csv )send(msg) #send the email (defaults to Outlook)
Todo esto es notificación por correo electrónico y/o automatización de todo el proceso usando Python. Gracias a las bibliotecas de correo electrónico y smptlib, el proceso de configuración es muy fácil.
Una cosa más a tener en cuenta, la dirección del servidor del proveedor de correo electrónico público y el puerto TLS.
Para cualquier tarea de procesamiento o capacitación que requiera mucho tiempo, las actualizaciones de progreso y las notificaciones de finalización suelen ser la verdadera liberación. Python, ¡mejora el trabajo!
Los hermanos aprenden python, a veces no saben cómo aprender y por dónde empezar. Después de dominar un poco de gramática básica o de hacer dos casos, no sé qué hacer a continuación y no sé cómo adquirir conocimientos más avanzados.
Entonces, para estos hermanos mayores, ¡he preparado muchos materiales, libros electrónicos en PDF y código fuente! Todo está en la tarjeta de abajo.
Muy bien chicos, eso es todo por lo que compartimos hoy. Les recomiendo un conjunto de tutoriales de Python que cubren la mayoría de los casos comunes y el combate real. ¡Espero que les sea útil!