見出し画像

【94日目】Django_日付情報を使ってグラフ作成①

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

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


Djangoでのグラフ表示にチャレンジ中で、前回まではグラフだけのアプリを作ってとりあえず表示させてみる、というところまでやりました。

↓前回


本日から、自作してきたTodoアプリにグラフを実装したいと思います。
以下のようなグラフを作ろうとしています。


縦軸が【完了済タスクの数】で、横軸が【最終更新日】のグラフ
・完了日がバラついている人=
 マルチタスクせず一つずつ終わらせている?
 タスクを細分化している?
・完了日が固まっている人=
 複数のタスクを並行して進めている?
 タスクを大雑把にまとめている?

パフォーマンスが良い人がどういうグラフになっているかで、仕事の進め方の参考になりそうです。



一撃ではうまくいかなかったので、本日はデータの入ってない箱だけが出来上がりました。


グラフ化するためのクラスは前回記事で紹介したものと同じものをgraph.pyに作成しました。

[graph.py]

import matplotlib.pyplot as plt
import base64
from io import BytesIO

def Output_Graph():
    buffer = BytesIO()
    plt.savefig(buffer, format="png")
    buffer.seek(0)
    img = buffer.getvalue()
    graph = base64.b64encode(img)
    graph = graph.decode("utf-8")
    buffer.close()
    return graph

def Plot_Graph(x,y):
    plt.switch_backend("AGG")
    plt.figure(figsize=(10,5))
    plt.bar(x,y)
    plt.xticks(rotation=45)
    plt.title("完了済タスク数の推移")
    plt.xlabel("日付")
    plt.ylabel("タスク数")
    plt.tight_layout()
    graph = Output_Graph()
    return graph


本日の肝はviews.pyです。新しくビューを作り、その中で①グラフに表示する期間と、②各日付=最終更新日となっているタスクを数える機能を記述しています。

[views.py]

from django.views.generic import TemplateView
from . import graph
from datetime import timedelta

 
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(=最終更新日)を取得して処理する
        # 最終更新日が辞書の中にあったらカウントする、という処理を実装したい(まだうまくいってない) 
        qs = Todo.objects.all()
        for ele in qs:
            date = ele.updated_at
            if date in tasks:
                tasks[date] += 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)

この内容で記述して、冒頭の空のグラフが出来上がりました。中段の「for ele in qs」以降の処理がうまくいってないのではないかと考えています(というか、「date = ele.updated_at」に日付だけじゃなくて時間の情報まで入ってしまっているせいだと踏んでいます)。


日付の処理って何かと繊細ですね。明日はまずここを直す方法を探していきたいと思います。

とりあえずグラフにデータを表示させたい…!!


↓次回記事です


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

【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の環境構築


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