見出し画像

【95日目】Django_日付情報を使ってグラフ作成②_pandasで日付データを整理

 このnoteは、31歳未経験からエンジニアを目指して勉強していく記録を綴っているものです。現在はAdTechでカスタマーサクセスを担当しつつ、色んなチャンスに恵まれ、CS業務や子育てと並行しながらチャレンジしています。

 これからプログラミングを始める方にとってのTipsやモチベアップに繋げられるように頑張りたいと思っています。
--------------------------------------------

本日もDjangoでのグラフ表示にチャレンジ中です。
前回はグラフの箱まで完成させましたが、今回はここにデータを流し込むことまでできました。

↓前回


見た目はだいぶ汚いですが、以下のようにデータが入っています。

元データは以下です。2月以降、2/6と2/8に最終更新している10件がカウントされていることが分かります。


前回views.pyに定義したクラスを修正して実装できました。
完成したコードは以下です。

[views.py]
 
import pandas as pd
 
 
class TodoAnalysis(TemplateView):
    template_name = "todo/todo_analysis.html"

    def get_context_data(self, **kwargs):
        # グラフに表示する期間を指定する
        d1 = datetime.date(2022,2,1)
        d2 = datetime.date.today()
        N = (d2 - d1).days + 1
        # 指定期間の辞書を作る
        tasks = {}
        for i in range(N):
            date = d1 + timedelta(i)
            tasks[date] = 0
        # Todoモデルのクエリセットからupdated_at(=最終更新日)を取得してdate型にする
        qs = Todo.objects.all()
        update_list = [ele.updated_at for ele in qs]
        dataf = pd.DataFrame({'time': update_list})
        dataf['time'] = pd.to_datetime(dataf['time']).dt.date

        for ele in dataf['time']:
            if ele in tasks:
                tasks[ele] += 1

        x = [x for x in tasks.keys()]
        y = [y for y in tasks.values()]
        chart = graph.Plot_Graph(x, y)

        context = super().get_context_data(**kwargs)
        context['chart'] = chart
        return context
    
    def get(self, request, *args, **kwargs):
        return super().get(request, *args, **kwargs)

Todoモデルのクエリセットからupdated_atというフィールドを取得して、それをdate型に直す所が今回修正したポイントです。pandasというデータ分析に特化したライブラリを活用して、モデルから受け取った日時データを「日付」のみのdate型に変更しています。

↓まずはupdated_atフィールドでリストを作ります。

        update_list = [ele.updated_at for ele in qs]

↓pandasのDataFrameメソッドで、timeというキーの要素としてリストを格納します。

        dataf = pd.DataFrame({'time': update_list})

↓timeキーの要素の型をdate型に変更しています。

        dataf['time'] = pd.to_datetime(dataf['time']).dt.date

↓tasks{}にはキーとして指定期間の日付が入っているので、これとupdated_atの日付が一致したらカウントされていく処理にしています。

        for ele in dataf['time']:
            if ele in tasks:
                tasks[ele] += 1

timeの要素であるupdate_listはイテラブルなので、for文でループ処理が可能です。


このほかは前回紹介した内容で、無事グラフにデータが入ってきました。
次は、複雑度が高そうな順番に、以下にチャレンジしようと思います。

①表示する期間を任意に指定できるようにする
②完了済のタスクのみを数えるようにする
③見た目を整える


↓①と②まで完成しました!


これまで修了したコース等

【YouTube_Django関係】
Pythonでウェブサービスを作ろう! #1
テンプレートをマスターしよう! #2
静的ファイルを配信しよう !#3
本番公開しよう! #4
データベースと接続しよう! #5
ブログを作って学ぶモデル入門! #6
これが汎用ビューの力! #7
Djangoフォームを自由自在に操ろう! #8
djagoを最大限使って効率よくログインを作ろう! #9
ログイン完成!サインアップ & メール認証 #10
データベースマイグレーション前編 #15
データベースマイグレーション後編 #16

【Paiza】
Aランクレベルアップメニュー 24/49問
データセット選択メニュー   12/17問
配列メニュー         61/64問
ループメニュー1      20/20問
ループメニュー2      12/20問
条件分岐メニュー       25/25問
二重ループメニュー      19/19問
配列活用メニュー       26/26問
文字列処理メニュー      30/30問
Bランクレベルアップメニュー 62/62問
Cランクレベルアップメニュー 30/30問
ランクB合格
ランクC合格
JavaScript体験篇       15/15講座
辞書(ディクショナリ)の基礎 8/8講座

【書籍/ブログ】
Django入門 | 初心者でも1時間でWebアプリ(Todoアプリ)を作成するコース
基礎からのMySQL     514/514頁
Web技術の基本      189/189頁 ※2周目中
京大のPython教科書    116/201頁
Pythonデータベースプログラミング 194/194頁
Pythonエンジニアファーストブック読了

【Progate】
Python Ⅰ~Ⅴ
Python アプリ版 コースⅠ~Ⅴ
SQL Ⅰ~ Ⅳ
SQL アプリ版 コースⅢ
HTML&CSS 初級編

【その他】
Pythonの環境構築
VSCodeの環境構築
MySQLの環境構築(MAMP)
Git / GitHubの環境構築
HEROKUの環境構築


この記事が気に入ったらサポートをしてみませんか?