回顾所有推文
推文数量的时间序列分析
我觉得这反映了我自己的一些事情,所以我将对推文数量的变化进行时间序列分析。
- 可视化时间序列数据
- (总体/年/月/日)趋势可视化
- 使用变化点检测逻辑进行变化点检测
被扔进 Prophet 进行分析。
参考:这个博客
准备数据 - 从 Twitter 获取数据
花了很长时间才得到推特官方的推文,
微博我会尝试从
当我用csv得到它时,处理推文中的换行符很麻烦,所以我尝试用xml得到它。
准备库 - 用于处理 XML
导入 xml 处理所需的库。
import pandas as pd
! pip install xmljson
import xmljson
from lxml import etree
数据导入
由于它在 Colaboratory 上运行,因此将 xml 文件放在 GoogleDrive 上,挂载并读取它。
xml_tree = etree.parse('/content/drive/MyDrive/works/gg_hatano220206.xml')
# すべてのタグの取得
xml_root = xml_tree.getroot()
# xmlデータをdict型に変換
xml_dict = xmljson.yahoo.data(xml_root)
数据整形
xml > tweets > tweet > time 包含发布时间,所以得到它。
如果您在开头添加“20”,它看起来像 YYYYmmdd,因此此时将其格式化。
from datetime import datetime as dt
tweet_time_list = []
for d in xml_dict['tweets']['tweet']:
tmp = '20' + d['time']
tmp = dt.strptime(tmp, '%Y%m%d %H%M%S')
tweet_time_list.append(tmp)
通过按时间顺序排列它们并分配数字,您可以看到推文数量的变化。
dat = pd.DataFrame({'time' : tweet_time_list})
dat = dat.sort_values('time', ascending=True).reset_index(drop = True)
dat = dat.assign(tweet_num=range(len(dat)))
dat['tweet_num'] = dat['tweet_num'] + 1
dat.head(5)
| 时间 | 推文编号 | |
|---|---|---|
| 0 | 2011-11-12 21:35:08 | 1 |
| 1 | 2011-11-12 21:43:03 | 2 |
| 2 | 2011-11-13 10:04:13 | 3 |
| 3 | 2011-11-13 11:09:01 | 4 |
| 4 | 2011-11-13 11:33:26 | 5 |
39393行×2列
我做到了。
帖子数量变化的可视化
现在,让我们想象一下帖子数量的增加。
import pandas as pd
import matplotlib.pyplot as plt
x = dat["time"]
y = dat["tweet_num"]
plt.plot(x,y)
似乎斜率已经改变了好几次。
生活似乎在这里发生了变化。
准备库 - 使用 Prophet 进行时间序列数据分析
对于趋势分析和变化点检测,预言家我会尝试使用
! pip install fbprophet
from fbprophet import Prophet
学习
Prophet的模型公式如下:趋势$g_t$,季节$s_t$,事件$h_t$,误差$\epsilon_t$
$$
y_t = g_t + s_t + h_t + \epsilon_t
$$
它看起来像这样。参考
让我们暂时学习。这个model.fit需要时间。 (在 Colab 上花了大约 5 分钟)
change_point_range 似乎是用于学习的数据的百分比(最旧的 XX% 用于学习)。
我们不需要预测这个时间,所以我们以 100% 的速度学习。 n_changepoints 是预期的变更点数量吗?是。我将其适当地设置为 10。
dat = dat.rename(columns={'time':'ds', 'tweet_num':'y'})
model = Prophet(n_changepoints = 10, changepoint_range=1.0, growth='linear')
model.add_seasonality(name='monthly', period=30.5, fourier_order=5)
model.fit(dat)
趋势可视化
让我们可视化这些变化。它似乎给了它一些周期性。方便,不是吗?
future = model.make_future_dataframe(periods=90)
forecast = model.predict(future)
model.plot_components(forecast)
plt.show()
看着每个...
- 趋势
- 2013 年 4 月左右的减速被分配到硕士实验室。
- 我认为2015年10月左右的放缓是由于新员工培训后的分配。
- 2018年伊始……不知是不是该被甩了……
- 每周
- 我觉得周一晚上发帖数少可能是因为没有棒球比赛
- 每年
- 三月、五月和八月安静(假期?)
- 十一月的元气(CS 和日本系列?)
- 每日
- 25:00 左右似乎有一个高峰
- 通宵日本假名
- 25:00 左右似乎有一个高峰
- 每月
- 20 日沉默……发薪日?
将我的学生日(-2015/03)和我的工作日(2015/04-)分开可能会更好。
我有不同的休假方式。
变化点检测
现在,我将保持原样。
import seaborn as sns
df_input = dat
# add change rates to changepoints
df_changepoints = df_input.loc[model.changepoints.index]
df_changepoints['delta'] = model.params['delta'].ravel()
# get changepoints
df_changepoints['ds'] = df_changepoints['ds'].astype(str)
df_changepoints['delta'] = df_changepoints['delta'].round(2)
df_selection = df_changepoints[df_changepoints['delta'] != 0]
date_changepoints = df_selection['ds'].astype('datetime64[ns]').reset_index(drop=True)
# plot
sns.set(style='whitegrid')
ax = sns.factorplot(x='ds', y='delta', data=df_changepoints, kind='bar', color='royalblue', size=4, aspect=2)
ax.set_xticklabels(rotation=90)
唔...?
- (增加) 2012-06-17:你在准备研究生考试吗?
- (增加)2013-05-15:我想知道M1 GW结束时发生了什么->我一个人伤心
- (增加) 2015-09-18 : 新员工培训尚未结束
Bocchi饭不辣#颤抖的声音
— 哈塔姆 (@gg_hatano)2013 年 5 月 15 日国和形冷大 HG#Bocchi餐
— 哈塔姆 (@gg_hatano)2013 年 5 月 15 日当我观察趋势时,我觉得我能够获得更多与我的直觉相匹配的洞察力。
入社后回看推文
我不记得过去,所以我会尽量关注我在社会黑暗时期的数据。它是从 2015 年 4 月开始的。
dat_work = dat[dat['ds'] > dt.strptime("20150401 000000", '%Y%m%d %H%M%S')] dat_work = dat_work.reset_index(drop=True) dat_work.head()
ds 是的 0 2015-04-01 12:14:37 25999 1 2015-04-01 12:17:12 26000 2 2015-04-01 12:22:15 26001 3 2015-04-01 14:12:59 26002 4 2015-04-01 17:12:07 26003 学习
这需要时间
model_work = Prophet(changepoint_range=1.0, growth='linear') model_work.add_seasonality(name='monthly', period=30.5, fourier_order=5) model_work.fit(dat_work)是的
趋势可视化
让我们来看看
future_work = model_work.make_future_dataframe(periods=90) forecast_work = model_work.predict(future_work) model_work.plot_components(forecast_work) plt.show()
气氛和以前不一样了。
- 趋势
- 2016 年 6 月左右放缓……那个项目。
- 2017 年 3 月左右放缓……那个项目。
- 2018 年 6 月左右上升...是
- 2019 年 4 月左右减速……那个案例
- 2020 年 5 月左右放慢速度……那个情况
- 每周
- 周一晚上有更多帖子。
- 似乎棒球的影响力已经减弱,因为我看到的巨人越来越少。
- 每年
- 5、6月见底,11月见顶
- 每年10月底,帖子数量都会增加。
- 每日
- 25:00 左右似乎有一个高峰 All Night Nippon
- 每月
- 20 号左右保持沉默...发薪日?为什么
概括
- 一个人吃饭后变了
- 项目启动前后推文数量变化
- 发薪日附近一片寂静
原创声明:本文系作者授权爱码网发表,未经许可,不得转载;
原文地址:https://www.likecs.com/show-308623725.html