この記事は?
前回の記事1でQiitaの人気タグを月ごとにBar Chart Raceで可視化したので、その手順を載せる
1. Qiita Apiを使って情報取得
前回の記事でも述べたとおり、基本的に先人の知恵2を借りている。
この方法ではある半月内に書かれた記事を取得し、期間をずらすことですべての期間を集計しようとしている。
しかし、
query = "&query=created:>" + start_date + "+created:<" + end_date
としており
start_date = ["2018-01-15","2018-01-31",...]
end_date = ["2018-01-31","2018-02-15",...]
となっているため、境界が含まれていない。
そのため以下のようにした。
query = "&query=created:>" + start_date + "+created:<=" + end_date
2. pandas使って処理
以下の通り。
詳細はコメントを参照。
import datetime
from dateutil.relativedelta import relativedelta
import copy
# 1.で作った全結果ファイルをロード
df_all = pd.read_csv("results/summary.csv")
# 開始日時
ref_date = datetime.date(2011,9,1)
# created_atでソート
df_all = df_all.sort_values("created_at")
# tag情報とdate情報だけ抜き出し
tags_list = list(df_all["tags_str"])
date_list = list(df_all["created_at"])
# relativedelta等が使える型に変換
date_list = [pd.to_datetime(one) for one in date_list]
# key:タグ名, value:回数
tags_dict =dict()
# 先頭の年(2011)、集計対象の年が変わるたびに更新
y = date_list[0].year
# 先頭の月(9)、集計対象の月が変わるたびに更新
m = date_list[0].month
# 結果格納用
ref_date = datetime.date(y,m,1)
# 各月での途中結果(累和)格納用リスト
monthly_result = []
# 各月格納用リスト
month = []
for i,(one_tags, one_date) in tqdm(enumerate(zip(tags_list,date_list))):
try:
# カンマ区切りテキストをリストに
tags = one_tags.split(",")
except AttributeError:
# たまにNaNが入っているのでその時はcontinue(タグ未設定時?)
continue
# tags_dictを見てすでにそのタグが入っていれば+1、そうでなければdictに登録して1を格納する
for one_tag in tags:
try:
tags_dict[one_tag] += 1
except KeyError:
tags_dict[one_tag] = 1
# 月が変わったときの処理
if one_date.year == y and one_date.month == m:
continue
else:
# month, monthly_resultにその時の日付、そこまでのdictを格納
month.append(ref_date)
monthly_result.append(copy.deepcopy(tags_dict))
ref_date += relativedelta(months=1)
y = ref_date.year
m = ref_date.month
# 終了時に最後の状態を格納
month.append(ref_date)
monthly_result.append(copy.deepcopy(tags_dict))
# 各月のdictについて、その月までに投稿されていないタグをdictに登録、0を格納
for one in monthly_result:
ref_keys = one.keys()
for one_tag in tags_dict:
if not one_tag in ref_keys:
one[one_tag] = 0
# 成形
monthly_result_num = []
for one_dict in monthly_result:
# ソートするためにdictからlistへ
tmp_list = [one for one in one_dict.items()]
# 名前でソート
tmp_list = sorted(tmp_list, key=lambda x:x[0])
# 回数だけ格納
monthly_result_num.append([one[1] for one in tmp_list ])
# タグ名を一時的にDataFrameの値に格納
df_align = pd.DataFrame({"tags":sorted(ref_keys)})
# 各月までのタグ登録回数の累和値をDataFrameに格納
for one_date,one_nums in zip(month,monthly_result_num):
df_align[one_date.strftime("%Y-%m")] = one_nums
# タグ名をindexにしてcsvに書き出し
df_align.set_index('tags').to_csv("all_result.csv")
3. flourishのbar chart raceを使って可視化
https://app.flourish.studio/
のbar chart raceにはき出したcsvをアップロード。
これで可視化出来る!!