Cuando hice un script de informe de trabajo automático en Python, solo podía pescar gratis todos los días.

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.

Fuente: unsplash

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!

¿Siempre olvidas el código después de aprenderlo? ¡100 proyectos de combate de orugas! Permítete disfrutar del aprendizaje 丨 Aplica lo que aprendes 丨 ¡El próximo dios de Python eres tú!

Supongo que te gusta

Origin blog.csdn.net/ooowwq/article/details/126592024
Recomendado
Clasificación