Pythonを用いて天猫店の販売を分析した.下

4567 ワード

2か月ぶりに爬虫類の任務が完成した.前回は(Pythonを利用して天猫店舗の販売を分析した.上)と述べ、次の4つの機能を完成させた.
  • 毎晩1日採集したデータを分析し、今日の最高の販売量を分析した.
  • 販売量と単価によって毎日の売上高を計算する.
  • 上記の内容を統一してpdfレポートを生成する.
  • レポートをメールボックスに送信します.

  • 前回のタスクが完了した後、タスクの最後はcrontabによって毎日8時、13時、18時、23時に設定され、タイミング的にタスクが収集され、この内容の目的は毎日23時に最後のタスクが完了した後、その日に収集されたデータを処理し、時間は23時30分に設定され、crontabによってタイミング的に開くことである.

    ベスト・セールスおよび売上高の計算


    これはSQLiteで毎日収集したデータを再抽出すれば、当日の販売データはSCOUNTテーブルに収集され、データの列名は時間に基づいて命名されるため、当日の4つの時点で収集した販売データを得るためには、まず列名を取得する必要があります.SQLiteでは、Pragmaによってすべてのカラム名情報を取得できます.Pragmaには、内部操作の変更とテーブル固有データの取得、table_を介した2つの機能があります.infoは、カラム名情報を取得できます.すべてのカラム名情報を取得した後、list comprehensions(これはどのように翻訳するか分かりません)を通じて、今日新たに生成された4つの販売データ列を取得できます.
    def get_today_columns(c, today):
        c.execute("PRAGMA table_info(SCOUNT);")
        column_list = c.fetchall()
        return ["[" + column[1] + "]" for column in column_list if today in column[1]]
    

    そして、取得した販売データは、SKU毎に1日に4回収集され、収集されたSKUがダウンフレームする可能性があるため、SKUリストには各SKUが収集される可能性がないため、収集に必要なデータにはdropnaが必要であり、SKU情報テーブルと販売データテーブルをmerge関数で統合して必要なdataを形成する必要がある.各SKUは、時刻ごとに収集されるデータが変動し、販売データが連続的に増加する過程ではないため、当日の販売量を求めるために、1日の最大数と最小数の差をとることができる.
    def today_sells(today_columns, conn):
        query_data = "SELECT scountskuid,%s, %s, %s, %s FROM SCOUNT;" % (today_columns[0],today_columns[1],today_columns[2],today_columns[3])
        data = pd.read_sql(query_data, conn, index_col="scountskuid")
        data.dropna(axis= 0 , how='all', inplace=True)
        query_name = "SELECT skuid, name FROM UB"
        name = pd.read_sql(query_name, conn, index_col="skuid")
        data = pd.merge(name, data, how = 'inner', left_index=True, right_index=True)
        data['sells'] = data.max(axis=1, numeric_only=True)-data.min(axis=1, numeric_only=True)
        return data[['name', 'sells']]
    

    売上高を生成する方法は似ていますが、ここにはリストされません.

    PDFレポートの生成


    PDFを生成するというのは当時の想定でしたが、後にこのチュートリアルを参考にして作られた(Practical Business Pythonは良いサイトで、お勧め)、原理はDataFrameを通じてHTMLに変換し、HTMLをPDFに変換することです.しかし、メールモジュールを書くときにHTMLが埋め込まれていることに気づき、わざわざPDFを生成して添付ファイルで送る必要はありません.しかし、ここでは、まずプロセス全体を整理します.
    Jinja 2でPDFを生成するには、まずテンプレートを生成する必要があります.テンプレートにはHTMLのスタイルを設定する必要があります.これはチュートリアルを参考にして書いたHTMLのスタイルです.
    
    
    
        
        {{ title }}
    
    
        

    {{ table_title }}

    {{ data_table }}

    完了後、DataFrameをto_html関数はHTMLに変換され、スタイルに埋め込まれます.
    from jinja2 import Environment, FileSystemLoader
        env = Environment(loader=FileSystemLoader('.'))
        template = env.get_template('myreport.html')
        template_vars = {'title': today+' ',
                        'table_title': today,
                        'data_table': data.to_html()}
        html_out = template.render(template_vars)
    

    最後にPDFを生成し、1つのモジュールを入れて一言飲むだけでいいです.Weasyprintこのモジュールは、HTMLまたはCSSをPDFに変換するためのものです.
    from weasyprint import HTML
        HTML(string = html_out).write_pdf("my_report.pdf")
    

    メールを送信


    pythonには専用のメールモジュール、emailモジュールがあります.メールのモジュールは2つの部分を含み、一部はメール本文モジュールであり、一部はメール送信モジュールである.
    メール本文モジュールは、MIMETextで完了します.メールモジュールには、対応するメール本文タイプを生成するための専用(MIME,Multipurpose Internet Mail Extensions,多用途インターネットメール拡張)モジュールがあります.ここではまずテキストモジュールMIMETextを用いて例を示します.
    from email.mime.text import MIMEText
    # me ==  
    # you ==  
    msg = MIMEText(html_out, 'html')
    msg['Subject'] = " %s  " % today
    msg['From'] = me
    msg['To'] = you
    

    それからメールを送ります.stmplibモジュールを経由する必要があります.以下で詳しく説明します.メールを送信するには、まずsmtp(Simple Mail Transfer Protocol)のアドレスとポートを設定し、一部のメールボックスでTTS暗号化プロトコルを使用する必要がある場合はstartts()関数を使用する必要があります.次に対応するのはログインしたユーザー名のパスワードで、上に書いたmsgを出して、最後にquitすればいいです.
    #smtp_address: smtp ;
    #smtp_port: smtp , TTS , ;
    #login_username: ;
    #login_password: ;
    
    import smtplib
    try:
        s = smtplib.SMTP(smtp_address, smtp_port)
        s.starttls()
        s.login(login_username, login_password)
        s.send_message(msg)
        s.quit()
        print(today + " !")
    except smtplib.SMTPException:
        print("Error:  ")
    

    締めくくり


    まとめて、前に設定したタスクはほぼ完了しました.しかし、前にDataFrameを採用したとき、データを可視化していなかったり、HTMLのテンプレートを再美化したりすることができます.また、データ可視化を導入したら、どのように可視化された画像をメールに埋め込むかなど、深化できる内容もたくさんあります.メールはその部分にログインして、一部のメールボックスではこの方法で送信できません(smtp設定を再考する必要があります).
    これらの問題は、今後も小さなプロジェクトの形で研究を続けます.プラットフォーム間の販売状況の比較なども後から行うことができ、要するに、このプロジェクトには大きな拡張空間がある.まぁ、今回はとりあえずこれで終わりにしましょう.