【WordPress】テーマCocoonの集計結果を取り出す方法【Python】

※ 当サイトではアフィリエイト広告を利用しています。リンクは広告リンクも含みます。

この記事は約8分で読めます。
広告

WordPressのテーマCocoonでは記事ごとにアクセス数がわかります。
管理画面やログインしていると表示されます。
そのデータが、どこにあるか分かったので、
取り出してPythonで集計する方法をご紹介します。JupiterNotebookで実行します。
最終的にはStreamlitでグラフで公開しました。
イチゲブログ、イチゲブログ別館2階のアクセス数(Cocoon集計値)

広告

どこにあるか

データベースにあります。サーバーによりますがphpmyadminが動くものであれば取り出せます。
無料のシン・クラウド for Freeで実際にやってみました。

wp_cocoon_accesses

シン・クラウド for Freeの場合
サーバーパネル→データベース→phpmyadmin(MariaDB10.5)
ユーザー名はMySQLユーザー設定タブのアクセス権所有データベース
パスワードは、詳細をクリックすると変更できます。
画面左でユーザー名のディレクトリを開いてwp_cocoon_accessesをクリック→エクスポートをクリック
→フォーマット:csv、行:すべての行をダンプする
→エクスポート

wp_cocoon_accesses.csvというファイルがダウンロードできます。
中身はこんな感じ。必要なのは赤色のデータです。
"id","post_id","post_type","date","count","last_ip"
"1","1","post","2023-10-07","5","14.8.96.194"
"2","12","post","2023-10-07","2","220.108.176.140"
"3","12","post","2023-10-08","3","45.250.255.9"

お名前ドットコムの場合
レンタルサーバーコントロールパネル→データベース→phpmyadmin→ユーザー名、パスワードで後は同じです。
私のブログは開設してから3年、約200記事なのでエクスポートしたファイルサイズが
wp_cocoon_accesses.csvが3M、wp_posts.csvが280Mでした。
目次へ

wp_posts

wp_cocoon_accesses.csvを見ると投稿記事の判別がpost_idという数字で分かりにくいです。
post_idとタイトルの関係もデータベースにあるので、それもエクスポートします。
それはwp_postsです。同じ要領でエクスポートすると
wp_posts.csvというファイルがダウンロードできます。
IDがwp_cocoon_accesses.csvのpost_idに対応しています。
post_titleが記事のタイトルです。
しかしこのデータ、post_contentが投稿内容になるのでファイルサイズは大きくなります。

"ID","post_author","post_date","post_date_gmt","post_content","post_title",・・・

pythonで加工

以下のコードと同じところに
wp_cocoon_accesses.csvとwp_posts.csvを置きます。

#必要なライブラリ
import pandas as pd

from datetime import date

#wp_cocoon_accesses.csvをデータフレーム化
df = pd.read_csv('wp_cocoon_accesses.csv', index_col=0)
df

結果
id  post_id	post_type	date	count	last_ip					
1	1	post	2023-10-07	5	*.*.*.194
2	12	post	2023-10-07	2	*.*.*.140
3	12	post	2023-10-08	3	*.*.*.9

#wp_posts.csvをデータフレーム化
df1 = pd.read_csv('wp_posts.csv', usecols=["ID","post_title"])
df1
結果
ID	post_title
0	1	Hello world!
1	2	サンプルページ
2	3	プライバシーポリシー

# 項目名を揃えます
df1.rename(columns={'ID': 'post_id'}, inplace=True)

# post_idをキーにして内部結合
merged_df = pd.merge(df, df1, on='post_id', how='inner')

# df1だけにあるpost_idの行を削除
merged_df = merged_df[merged_df['post_id'].isin(df1['post_id'])]

# 不要な項目を削除
merged_df.drop(columns=['last_ip'], inplace=True)
# 結合後のデータフレームを表示
merged_df
結果
post_id	post_type	date	count	post_title
0	1	post	2023-10-07	5	Hello world!
1	1	post	2023-10-08	1	Hello world!
2	1	post	2023-10-09	1	Hello world!

# 文字列から数字に変換
df['count'] = df['count'].astype(int)
df['post_id'] = df['post_id'].astype(int)

これで集計する準備ができました。
目次へ

全期間の合計

# post_idごとに全期間の合計を計算
aggregated_df = merged_df.groupby('post_id').agg({
    'count': 'sum',  # 合計
    'post_title': 'first'  #列の最初の値
}).reset_index()

# 昇順に並び替え
aggregated_df.sort_values(by='post_id')
結果
 post_id	count	post_title
0	1	38	Hello world!
1	12	19	Bingに聞いてブログを書いてみた!
2	16	13	PageSpeed Insightsでシン・クラウド for Freeを測定してみた。

日、週、月ごとに集計

データフレームのgroupbyで集計すると
週と月の集計値はCocoonの集計期間の取り方の違いで値が違ってます。

# 日付型 (datetime) に変換
merged_df['date'] = pd.to_datetime(merged_df['date'])

# 日付ごとに集計
daily_aggregated = merged_df.groupby(['post_id', pd.Grouper(key='date', freq='D')])['count'].sum().reset_index()

# 週ごとに集計、集計期間が多分、月~日でCocoonと異なる。
#参考:https://hesma2.hatenablog.com/entry/2021/01/22/003526
#Cocoonは直近7日間で集計してるかも

weekly_aggregated = merged_df.groupby(['post_id', pd.Grouper(key='date', freq='W')])['count'].sum().reset_index()

# 月ごとに集計、集計期間が多分、月ごとでCocoonと異なる。Cocoonは直近1か月で集計してるかも
monthly_aggregated = merged_df.groupby(['post_id', pd.Grouper(key='date', freq='M')])['count'].sum().reset_index()

print("post_idに対する日付ごとの集計:")
print(daily_aggregated)

print("\npost_idに対する週ごとの集計:")
print(weekly_aggregated)

print("\npost_idに対する月ごとの集計:")
print(monthly_aggregated)
csvへの出力
weekly_aggregated.to_csv("weekly.csv")
目次へ

Streamlitで週のアクセス数を公開

イチゲブログ、イチゲブログ別館2階のアクセス数(Cocoon集計値)
特徴は

  • 2つのブログのアクセス数を切り替えられる。
  • post_titleを選択して2個グラフ表示できる。
  • 任意の期間で表示できる。
  • y軸は大きい方のmaxカウント値をmaxに設定。デフォルト20。
  • データ(weekly.csv、wp_posts.csv)をアップロードできる。
    (パスワードで保護しているが、パスワードはソース自体をpublicでGitHubにあげているので丸見えです。)
    (st.file_uploaderは200Mまでしかアップロードできないようなのでwp_posts.csvはJupiterNotebookで不要な部分を削除してサイズを小さくしないとダメです。)
    (st.file_uploaderでアップロードしたファイルは、一時的なものなのでアプリがスリープ状態になってしまうと、GitHubでデプロイしたときのcsvファイルに戻ります。)

まとめ

Cocoonの週と月の集計の仕方が不明だが、恐らく直近7日と1月で算出してると思われる。
今回使ったPythonのpandasのgroupbyとは集計方法が違うので週と月の値が異なってくる。

目次へ
イチゲをOFUSEで応援する(御質問でもOKです)Vプリカでのお支払いがおすすめです。
MENTAやってます(ichige)

コメント

タイトルとURLをコピーしました