當我用Python做了個自動工作彙報的腳本後,每天都閑的只能摸魚

来源:https://www.cnblogs.com/hahaa/archive/2022/08/30/16639888.html
-Advertisement-
Play Games

哈嘍兄弟們 之前經常編寫Python腳本來進行數據處理、數據傳輸和模型訓練。隨著數據量和數據複雜性的增加,運行腳本可能需要一些時間。在等待數據處理完成時可以同時做一些其他工作。 為了達到這個目的,編寫了一組用於解決這個問題的Python腳本。使用這些腳本向手機發送流程更新、可視化和完成通知。當偶爾擁 ...


哈嘍兄弟們

之前經常編寫Python腳本來進行數據處理、數據傳輸和模型訓練。隨著數據量和數據複雜性的增加,運行腳本可能需要一些時間。在等待數據處理完成時可以同時做一些其他工作。

為了達到這個目的,編寫了一組用於解決這個問題的Python腳本。使用這些腳本向手機發送流程更新、可視化和完成通知。當偶爾擁有這些自由的時刻,你可以享受而不是擔心模型的進度。

一、需要什麼

第一個問題是,需要知道什麼?這取決於你正在做的工作。對於筆者來說主要有有三個可能會占用時間的處理任務:

  • 模型訓練
  • 數據處理和/或傳輸
  • 金融模型

我們需要對於每一種情況具體分析。

二、模型訓練

更新每n個epoch,必須包括關鍵指標。例如,訓練和驗證集的損失和準確性。接著完成通知,包括:

  • 訓練期間關鍵指標的可視化(同樣,訓練和驗證集的損失和準確性)

  • 其他不太重要但仍然有用的信息,如本地模型目錄、訓練時間、模型架構等

  • 預測輸出,對於文本生成來說輸出生成的文本(或它的一個樣本);對於圖像生成

來說,輸出結果是一個(希望)很酷的可視化

以訓練一個神經網路來重現給定的藝術風格為例。我們需要重點從模型中生成的圖像,損失和精度圖,當前的訓練時間,和一個模型的名稱。

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

 

每隔100個epoch,就會發送一封包含上述所有內容的電子郵件。以下是其中一封郵件:

三、數據處理和傳輸

這點不是很有趣,但在時間消耗方面,它排第一名。

以使用Python將批量數據上傳到SQLServer為例(對於沒有BULK INSERT的人)。在上傳腳本的最後,會有一個簡單的消息通知上傳完成。

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)

 

如果偶爾拋出錯誤,還可以添加一個try-except語句來捕獲錯誤,並將其添加到一個列表中,以包含在更新和/或完成電子郵件中。

四、金融模型

金融建模中運行的所有東西實際上都非常快,所以此處只能提供一個示例。

以現金流動模型工具 為例。現實中,這個過程只需要10-20秒,但現在假設你是華爾街炙手可熱的定量分析師,正在處理幾百萬筆貸款。在這封電子郵件中,可能想要包含一個高級概要分析的投資組合。可以隨機選擇一些貸款,併在給定的時間段內可視化關鍵值——給定一個小樣本來交叉檢驗模型的性能。

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

 

五、代碼

上面的所有功能節選自一個名為notify.py的腳本。在示例代碼中將使用Outlook。這裡需要兩個Python庫,email和smtplib:

· email :用於管理電子郵件消息。有了這個庫就可以設置電子郵件消息本身,包括主題、正文和附件。

· smtplib :處理SMTP連接。簡單郵件傳輸協議(SMTP)是大多數電子郵件系統使用的協議,允許郵件通過互聯網發送。

圖源:unsplash

六、MIME

消息本身是使用來自email模塊的MIMEMultipart對象構建的。還需要使用三個MIME子類,並將它們附加到MIMEMultipart對象上:

  • mimetext:這將包含電子郵件“有效負載”,即電子郵件正文中的文本。

  • mimeimage :這是用於在電子郵件中包含圖像。

  • mimeapplication:用於MIME消息應用程式對象。也就是文件附件。

除了這些子類之外,還有其他參數,比如MimeMultipart中的Subject值。所有這些加在一起就形成了下麵的結構。

把它們都放在一起會發生什麼:

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

 

這個腳本相當簡單。在頂部,有導入(這是以前介紹過的MIME部分)以及Python的os庫。

接下來定義一個名為message的函數。這允許使用不同的參數調用函數並輕鬆地構建一個電子郵件消息對象。例如,可以這樣寫一封帶有多張圖片和附件的郵件:

email_msg= message(
    text="Model processing complete,please see attached data.",
    img=[ accuracy.png ,  loss.png ],
    attachments=[ data_in.csv ,  data_out.csv ]
)

 

首先,初始化MIMEMultipart對象,並將其分配給msg;然後,使用“subject”鍵設置電子郵件主題。attach方法向MIMEMultipart對象添加不同的MIME子類。你可以使用MIMEText子類添加電子郵件正文。

對於圖像img和attachment附件,可以什麼都不傳遞,只傳遞一個文件路徑,或者傳遞一組文件路徑。我們通過首先檢查參數是否為None來處理它,如果參數為None,則傳遞;否則,檢查給定的數據類型,不是一個list,就創建一個,這就使得可以用下麵的for迴圈來遍歷項。

接著,使用MIMEImage和MIMEApplication子類分別附加圖像和文件。使用os.basename從給定的文件路徑中獲取文件名,附件名包括該文件名。

七、SMTP

現在已經構建好電子郵件消息對象,下一步就是發送它。這就是smtplib模塊發揮作用的地方。代碼同樣非常簡單,只有一處例外。

由於直接處理不同的電子郵件供應商和他們各自的伺服器,需要不同的SMTP地址。在谷歌中輸入“outlook smtp”。不需要單擊頁面,你就可以得到伺服器地址smtp-mail.outlook.com和埠號587。

當使用smtplib.SMTP初始化SMTP對象時,這兩種方法都需要用。SMTP -接近開始的send函數:

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()和smtp.starttls()都是SMTP命令。ehlo(擴展Hello)本質上是向伺服器打招呼。starttls通知伺服器,將使用加密傳輸級別安全(TLS)連接進行通信。

在此之後,只需從文件中讀取電子郵件和密碼,分別存儲在email和pwd中。然後,使用smtp.login登錄到SMTP伺服器。登錄並使用smtp.sendmail發送電子郵件。

筆者總是給自己發送通知,但在自動報告的情況下,可能希望將電子郵件發送到其他地方。為此,我會更改destination_address: smtp.sendmail(email、destination_address、 msg.as_string)。

最後,終止會話並關閉與smtp.quit的連接。

將所有這些都放在try-except語句中。在瞬間網路連接丟失的情況下,將無法連接到伺服器。導致socket.gaierror。使用try-except語句可以防止程式在網路連接失敗的情況下崩潰。

筆者將其用於ML模型培訓更新和數據傳輸完成。如果郵件沒有被髮送,那也沒有關係。這種簡單、被動地處理連接丟失是合適的。

八、放在一起

現在已經寫了代碼的兩部分,我們就可以發送電子郵件了:

 # builda message object
msg = message(text="See attached!", img= important.png ,
             attachment= data.csv )send(msg)  #send the email (defaults to Outlook)
# 兄弟們學習python,有時候不知道怎麼學,從哪裡開始學。掌握了基本的一些語法或者做了兩個案例後,不知道下一步怎麼走,不知道如何去學習更加高深的知識。
# 那麼對於這些大兄弟們,我準備了大量的資料,PDF電子書籍,以及源代碼!
# Python學習基地 279199867 都放在這個君羊了

 

這是所有的電子郵件通知和/或使用Python的自動化的全過程。感謝email和smptlib庫,設置過程變得非常容易。

還有一點請註意,公共電子郵件提供程式伺服器地址和TLS埠。

對於任何耗費大量時間的處理或訓練任務,進度更新和完成通知通常才是真正的解放。Python,讓工作更美好!

好了兄弟們,今天的分享就到這裡,給大家推薦一套Python教程,涵蓋了常見的大部分案例實戰,希望對 大家有所幫助!

代碼總是學完就忘記?100個爬蟲實戰項目!讓你沉迷學習丨學以致用丨下一個Python大神就是你!

 
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Java泛型02 5.自定義泛型 5.1自定義泛型類 基本語法: class 類名<T,R...>{//…表示可以有多個泛型 成員 } 註意細節: 普通成員可以使用泛型(屬性、方法) 使用泛型的數組不能初始化 靜態方法中不能使用類的泛型 泛型類的類型,是在創建類的對象時確定的(因為創建對象時,需要指 ...
  • ##HttpServletRequest request(請求) 所有的 和請求相關的操作,都用這對象來處理 當有請求來的時候 , request就被實例化 ##HttpServletResponse response(響應) 所有和響應相關的操作,都用這個對象來處理 當有請求來的時候 , resp ...
  • 問題描述: 前端使用Get請求並且使用請求體傳遞參數,後端使用@RequestBody註解封裝參數,這時會出現400的異常信息。 解決方法: 1、Get請求不要使用請求體,使用請求體的話用POST請求。(建議,這樣才是正常的規範寫法) 2、保留Get請求與請求體,後端也可以用對象來封裝請求體中的參數 ...
  • 首先上結構 mynode -> app5 -> urls.py & views.py | -> templates -> 5 -> upload.html | -> mynode -> urls.py | -> media 按照順序,先上app5/urls.py from django.urls i ...
  • 眾所周知,Go lang的作用域相對嚴格,數據之間的通信往往要依靠參數的傳遞,但如果想在多個協程任務中間做數據通信,就需要通道(channel)的參與,我們可以把數據封裝成一個對象,然後把這個對象的指針傳入某個通道變數中,另外一個協程從這個通道中讀出變數的指針,並處理其指向的記憶體對象。 通道的聲明與 ...
  • 來源:https://segmentfault.com/a/1190000021109130 問題描述 前幾天在幫同事排查生產一個線上偶發的線程池錯誤 邏輯很簡單,線程池執行了一個帶結果的非同步任務。但是最近有偶發的報錯: java.util.concurrent.RejectedExecutionE ...
  • 如果說Go lang是靜態語言中的皇冠,那麼,Goroutine就是併發編程方式中的鑽石。Goroutine是Go語言設計體系中最核心的精華,它非常輕量,一個 Goroutine 只占幾 KB,並且這幾 KB 就足夠 Goroutine 運行完,這就能在有限的記憶體空間內支持大量 Goroutine協 ...
  • 原文連接:https://www.zhoubotong.site/post/78.html 開發中對於http請求是經常遇到,一般可能網路延遲或介面返回超時,對於發起客戶端的請求, 除了設置超時時間外,請求重試是很有必要考慮的,我們不用重覆造輪子,可以使用 https://github.com/ra ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...