9
8

More than 3 years have passed since last update.

Qiitaの人気タグをBar Chart Raceで可視化するまでの話

Posted at

この記事は?

前回の記事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をアップロード。
これで可視化出来る!!

9
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
8