ブログ記事投稿数をPythonで自動グラフ化!

ブログ記事投稿のモチベーションを保つために、記事の投稿数をグラフ化して投稿ペースを確認しようと思いました。

まだブログを開始したばかりなので大した記事数ではないですが、これから定期的にグラフ化して投稿ペースを確認したいので、できるだけ楽にグラフ化する方法を検討しました。

今回は、WordPressのデータベースからダウンロードした記事の情報に関するcsvデータをPythonを使ってグラフ化することにしました。

csvのダウンロードは手動ですが簡単にできますし、グラフはPythonを実行するだけで作成できるので、csvをダウンロードする所からグラフ化まで約1-2分ほどで作業が完了します。

WordPressのデータベースからcsvをダウンロードする方法は、以下の記事を参照して下さい。

プラグインを使わずにphpMyAdminからダウンロードしています。

プラグイン無しでWordPressデータベースからcsv出力する方法
この記事で分かること
  • Pythonを使ってcsvファイルをグラフ化する方法がわかります。
  • グラフ化にはPlotlyを使っています。グラフ設定に関するコードが参考になります。

作成した投稿記事数のグラフ

今回、作成したグラフは以下です。

下記のグラフはPCなら見やすいですが、スマホでは見づらいと思います。

そのような場合は、右上にあるカメラのアイコンを押せば、画像がダウンロードできるので便利です。

「Plotly」とは

PlotlyはPythonで使用できるライブラリで、上記のような見た目の良いグラフが簡単に作成できます。

インタラクティブに操作ができ、グラフを拡大縮小したり、マウスオーバーでデータ内容を表示したり、凡例をクリックすることでその項目を非表示にできたり、とても高機能です。

試しに上のグラフを色々と触ってみてください。

Plotlyの公式サイトは以下です。

英語ですが、いろいろな種類のグラフが作れることがわかります。

作成したコード

今回作成したPythonのコードや使用したcsvデータについて書いておきます。

私の環境は以下です。

  • Windows10 Home 64ビット
  • Python 3.8.3
  • Plotly 4.14.3

使用したcsvデータの内容

今回使用したcsvファイルは、phpMyAdminでダウンロードした投稿記事に関する情報です。

中身は投稿してステータスが「公開」となっている記事のみに関する情報です。

投稿日や記事のタイトル、記事の内容や公開ステータスなどが入っています。

この中で、今回は「post_date」のみ使います。「post_date」は記事を投稿した時の投稿日時です。

csvファイルの中身

作成したコード

作成したコードは下記です。

コードの内容についてはコメントで記載しています。

import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import datetime
df = pd.read_csv("wp_posts.csv", encoding="utf-8") # CSVを読み込む
today = datetime.date.today().strftime('%Y%m%d') # 今日の日付をyyyymmdd形式で取得
number = len(df) # 記事の全投稿数を取得
df_date = pd.to_datetime(df['post_date']).dt.strftime('%Y-%m-%d') # 日付をyyyy-mm-dd形式にして、データフレームに格納
df_date = pd.to_datetime(df_date) # 日付をobject型からdatetime型に変換。これをしないと日付の計算が上手くいかなかった。
df_date_counts = df_date.value_counts().sort_index() # 日付ごとの記事数をカウント
df_date_counts = pd.DataFrame(df_date_counts).reset_index() # データフレームに変換
df_date_counts.columns = ['日付', '投稿数'] # 列名を付ける
df_date_counts = df_date_counts.set_index('日付') # 日付列をindexにする
df_date_counts = df_date_counts.asfreq('d', fill_value=0) # 投稿をしていない日を挿入して、valueは0で埋める
df_date_counts["累積投稿数"] = df_date_counts['投稿数'].cumsum() # 累積投稿数の列を作成
df_date_counts["経過日数"] = ((df_date_counts.index - df_date_counts.index[0]).days) + 1 # 投稿初日(ブログ開始日)空の経過日数を計算し、データフレームに追加
df_date_counts["平均投稿数"] = round(df_date_counts["累積投稿数"] / df_date_counts["経過日数"], 1) # 平均投稿日数を計算し、データフレームに追加
# グラフを作成する
graphtitle = "全投稿" + str(number) + "件" + " ブログ開始" + str(df_date_counts["経過日数"][-1]) + "日" + " 平均投稿数" + str(df_date_counts["平均投稿数"][-1]) + "件"
fig = make_subplots(specs=[[{"secondary_y": True}]]) # 2軸で作成するためのコード
fig.add_trace(go.Bar(x=df_date_counts.index, y=df_date_counts["投稿数"], name="1日の投稿数"), secondary_y=False)
fig.add_trace(go.Scatter(x=df_date_counts.index, y=df_date_counts["平均投稿数"], name="1日の平均投稿数"), secondary_y=False)
fig.add_trace(go.Scatter(x=df_date_counts.index, y=df_date_counts["累積投稿数"], name="累積投稿数", mode="lines"), secondary_y=True)
# グラフの設定関連
fig.update_layout(title=graphtitle) # グラフタイトルを設定
fig.update_xaxes(tickvals=df_date_counts.index,tickformat="%Y-%m-%d")
fig.update_xaxes(title_text="日時")
fig.update_yaxes(range=(0,5), secondary_y=False) # y軸の最大最小値を指定
fig.update_yaxes(title_text="1日の投稿数 1日の平均投稿数", secondary_y=False)
fig.update_yaxes(title_text="累積投稿数", secondary_y=True)
fig.update_layout(template="plotly_white") # 白背景のテーマに変更
# 凡例の位置を変更
fig.update_layout(legend=dict(x=0.01, y=0.99, xanchor='left', yanchor='top', orientation='h', ))
fig.show()
# グラフをhtml形式で保存。保存場所はこのpythonファイルを同じディレクトリ。
filename = "posts-graph-" + today
with open(filename + '.html', 'w') as f: f.write(fig.to_html(include_plotlyjs='cdn'))

使い方

  1. 「wp_posts.csv」を上記Pythonファイルと同じディレクトリに置く。ファイル名が違う場合は、6行目のcsvのファイル名を変える。
  2. 「wp_posts.csv」には、「post_date」という列名の日時データが入っている。
  3. 上記Pythonファイルを実行すると、ブラウザにグラフが表示され、Pythonファイルと同じディレクトリにhtmlファイルがダウンロードされる。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


検索

アーカイブ

プロフィール

プロフィール背景画像
プロフィール画像

チャベス

機械機器メーカーで研究開発をしている機械系エンジニアです。 Notion、SANGO(WordPress)、Pythonが好きです。 詳細プロフィールはこちらnoteにNotionの記事も書いています。 Notion公式資格のNotion Essentials Badge取得。

WP-Searchにサイト事例として掲載されています。