目录
- 1. 报告摘要
- 2. 报告正文
- 3. 研究结论
1. 报告摘要
摘要:本文研究的数据来源于2008-2020中国上市公司股吧评论数据库,其中包括有帖子总量、帖子情感属性、阅读量、评论量等字段。基于此数据库,本文利用pandas、matplotlib、pyecharts等常见数据分析python库对这部分数据进行深入分析、挖掘,并对挖掘到得规则进行可视化分析,以期从中挖掘出上市公司股吧评论数据库中有价值的规则。
本文以时间跨度和公司跨度两个维度上进行分析,从2008-2020年所有数据分析再到个别年份数据分析、从整个股吧数据分析再到个别公司股吧数据分析等,这过程中本文挖掘出众多规则,并将其进行可视化处理,建立了并列直方图、箱型图、饼图、3D直方图、3D散点图、漏斗图、水滴图等多达15种图表,28张图表。分析这些图标,本文发现股吧每年变化情况较大,股吧中正向情绪占据主导地位,股吧的种种现象与我们的生活联系紧密。
关键词:股吧评论,帖子情感倾向,可视化分析
2. 报告正文
2.1 2008-2020年股吧总体分析
(1) 2008-2020年股吧综合参数(折线图)
1. def get_line(file_path):
2. filelist = os.listdir(file_path)
3. x_data, Readnum, Tpostnum, Commentnum, Pospostnum, Negpostnum,
4. Neupostnum = []
5. for file in filelist: # 遍历所有数据文件
6. olddir = os.path.join(file_path, file) # 文件相对路径
7. print(olddir)
8. filename = os.path.splitext(file)[0]
9. filetype = os.path.splitext(file)[1]
10. if filetype == '.csv':
11. df = pd.read_csv(olddir)
12. x_data.append(filename)
13. Readnum.append(df.Readnum.sum())
14. Tpostnum.append(int(df.Tpostnum.sum()))
15. Commentnum.append(int(df.Commentnum.sum()))
16. Pospostnum.append(int(df.Pospostnum.sum()))
17. Negpostnum.append(int(df.Negpostnum.sum()))
18. Neupostnum.append(int(df.Neupostnum.sum()))
19. line = Line()
20. line.add_xaxis(list(x_data))
21. line.add_yaxis('Readnum', Readnum)
22. line.add_yaxis('Tpostnum', Tpostnum)
23. line.add_yaxis('Commentnum', Commentnum)
24. line.add_yaxis('Pospostnum', Pospostnum)
25. line.add_yaxis('Neupostnum', Neupostnum)
26. line.set_global_opts(title_opts=opts.TitleOpts(title='2008-2020年年度数据折线图', pos_top='-10%'))
27. Return line
按年份将阅读量、帖子总量、正面帖子、负面帖子、中性帖子、评论数等参数进行求和,绘制出多条折线复合图。
通过上图可以看出,股吧各项指标有着一定的相关性,总体呈正相关,同时通过正面评论总数线总处在负面评论总数的折线之上,可以见得股吧的整体舆情还是呈正面的,特别在2016年正面帖子总数总体远高于负面帖子总数,可以推测2016年股市整体走势较为良好;此外,股吧的帖子总量从2015年开始剧减,直至2018年才开始回升,可以推测股市在这段时间出现了一些较大的变动,导致股民对于股市的讨论热情减退。
(2) 2008-2020年股吧用户参与度(折线图)
1. # 帖子参与度计算,由阅读量/评论数体现
2. def participateline(data_path):
3. # 用data_path获取csv文件
4. filelist = os.listdir(data_path)
5. Participate, Readnum, Commentnum, x_data = []
6. for file in filelist: # 遍历所有数据文件
7. olddir = os.path.join(data_path, file) # 文件相对路径
8. filename = os.path.splitext(file)[0]
9. filetype = os.path.splitext(file)[1]
10. if filetype == '.csv':
11. x_data.append(filename)
12. df = pd.read_csv(olddir)
13. particpate.append(int(int(df.Readnum.sum())/int(df.Commentnum.sum())))
14. Readnum.append(int(df.Readnum.sum()))
15. Commentnum.append(int(df.Commentnum.sum()))
16. line = Line()
17. line.add_xaxis(list(x_data))
18. line.add_yaxis('参与度(阅读数/评论数)', particpate)
19. line.add_yaxis('Readnum', Readnum)
20. line.add_yaxis('Commentnum', Commentnum)
21. line.set_global_opts(title_opts=opts.TitleOpts(title='2008-2020年年度数据折线图', pos_top='-10%'))
22. return line
本图以(阅读数/评论数)作为股吧用户对当前信息讨论得参与度以年为时间刻度进行绘制,希望得出股吧用户在不同年份参与股市情况讨论的热情程度。
由上图可以看出2016年以前,尤其在2012年—2016年,股吧每年阅读量与评论数之比在高速增长,结合之前的总体阅读量走势,可以看出股吧在2016年以前的讨论热度是在上升的,股民对于股市的变化较为上心。但在2018年后,讨论参与度急剧下降,可能出现某种情况致使股民对于股市的热情减退。
(3) 2008-2020年股吧热度排行榜(以阅读量为指标)
1. # 递归文件夹
2. for rank_by in attr:
3. for year_dir in os.listdir(zrr_dir_path):
4. if re.match(r'^\d*$', year_dir):
5. df = pd.read_csv(zrr_dir_path + os.sep + year_dir + os.sep + year_dir + '-hot.csv')
6. df.groupby('Coname')[rank_by].sum().sort_values(ascending=False).head(10).plot(kind= 'bar', y='发帖数', x = '公司名称')
7. plt.xticks(rotation=20)
8. if not os.path.exists('每年排名前十的公司-柱状图'+os.sep+rank_by):
9. os.makedirs('每年排名前十的公司-柱状图'+os.sep+rank_by)
10. plt.xlabel("公司名称")
11. plt.ylabel(attr_map[rank_by])
12. plt.title("%s年%s排名前十公司"%(year_dir, attr_map[rank_by]))
13. plt.savefig('每年排名前十的公司-柱状图'+os.sep+rank_by+os.sep+year_dir+'.jpg', dpi = 600, bbox_inches = 'tight')
以阅读数的高低为公司热度评判标准,可以得到每一年热度排名前十的公司排行榜。分析上图,可以得到以下结论:
对比不同年份的排行榜,可发现不同年份上榜公司变化较大;
对比不同年份的排行榜,可发现2010年前传统行业(如:金融业、重工业、房地产业)的公司比较热度较高,而2011年后科技公司等信息行业上榜数量逐渐增多,科技公司的热度逐渐攀升;
除了2009年外,每年股吧热度排行榜前三与其他公司热度差距较大;
综上分析可得,每年热度排行榜变化大,2010年前主要是传统行业的公司热度较高,2011年后新型行业公司上榜数量增加,可以看出新兴行业公司股票在2011年后股民得关注度上升,可预见未来新兴行业公司的热度将持续上升,而传统行业股票仍然是股民心中的中流砥柱。
(4) 2008-2020年上榜次数频率统计(横向柱状图&饼图)
1. rank_company = [] # 每年上榜公司
2. for year_dir in os.listdir(zrr_dir_path):
3. if re.match(r'^\d*$', year_dir):
4. df = pd.read_csv(zrr_dir_path + os.sep + year_dir + os.sep + year_dir + '-hot.csv')
5. rank_company.extend(list(df.groupby('Coname')["Readnum"].sum().sort_values(ascending=False).head(10).index))
6. count_series = pd.Series(rank_company).value_counts() # 统计上榜次数
7. count_series[count_series > 1].plot(kind='barh', title='近十年上榜公司次数统计(大于一次)') # 统计上榜大于一次数
8. tmp = count_series.value_counts()
9. pie = Pie(init_opts = opts.InitOpts(theme = ThemeType.LIGHT))
10. items = ['上榜' + str(i) + '次公司数量' for i in count_series.value_counts().index]
11. c = ( Pie()
12. .add("", [list(z) for z in zip(items, [int(i) for i in tmp.values])])
13. .set_global_opts(title_opts=opts.TitleOpts(title="2008-2020年热度前十排行榜公司上榜次数占比图",pos_left='center',pos_top='4%'))
14. .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}")) )
15. c.render_notebook()
图一是公司上榜次数频率统计图,经分析可以得出以下结论:京东方A,苏宁易购,中信证券三个公司热度较高,曾上榜年热度前十排行榜5次。
图二是上榜n次的公司数量分布图,大部分公司的上榜次数为一次,说明股吧每年热门公司变化较大。
(5) 阅读热度榜上公司每年的排名变化情况(折线图)
1. df_rank_line = pd.DataFrame(index=count_series[count_series > 2].index)
2. for year_dir in os.listdir(zrr_dir_path):
3. if re.match(r'^\d*$', year_dir):
4. df = pd.read_csv(zrr_dir_path+os.sep+year_dir+os.sep+year_dir+'-hot.csv').groupby('Coname')["Readnum"].sum().sort_values(ascending=False)
5. df_index = list(df.index)
6. print('%s...'%(year_dir), end='\t')
7. for company in list(df_rank_line.index):
8. if company in df_index:
9. df_rank_line.loc[company, str(year_dir)] = df_index.index(company)+1
10. for col in df_rank_line.columns:
11. df_rank_line[col][df_rank_line[col] > 20] = np.nan
12. # plt.figure(figsize=(7,7))
13. cmap=plt.get_cmap('tab20')
14. for index in range(0, len(df_rank_line.index)):
15. plt.scatter(list(df_rank_line.columns), df_rank_line.iloc[index], label=df_rank_line.iloc[index].name, color=cmap(index))
16. plt.plot(list(df_rank_line.columns), df_rank_line.iloc[index], color=cmap(index))
17. plt.xlabel("年份")
18. plt.ylabel("排名")
19. plt.title("近十年来上榜次数大于1次公司排名变化图")
20. plt.legend(bbox_to_anchor=(1.02, 1.00))
21. plt.grid()
22. plt.yticks([x for x in range(0 , 21)])
23. plt.gca().invert_yaxis()
24. plt.show()
上图仅包括上榜次数大于1次的公司,经分析可以得出以下结论:
北方稀土公司在2009年-2012年内热度逐渐攀升,但2012年后热度骤减;
中信证券公司在2011年-2014年内热度逐渐下滑,2014-2015年曾掀起热度,但2015年后热度下跌;
京东方A公司在2010年-2011年曾掀起热度,但在2011年-2015年内热度骤减,而在2015年后热度攀升,并稳定在排名前十的位置上;
苏宁易购在2011年-2014年热度递增,并在2013年、2014年连续两年处于热度第一的位置,但2014年后苏宁易购热度开始下滑;
2016年-2020格力电器、罗牛山的热度组件下跌;
东方财富除2017年外,热度排名稳定在前20名;
综上分析可得,股吧热度排行榜波动十分大,少数公司如京东方、苏宁易购、乐视退、格力电器等连续几年上榜。除苏宁易购曾在2012年-2015年连续两年热度排名前十外,没有公司能够连续3年以上排名波动在2名以内。
2.2 2008-2020年帖子总量前10公司的股吧数据分析
(1) 股吧数据的预处理(合并、排序、列间计算)
1. df = guba.groupby(['股票代码','公司简称'],as_index = False).sum()
2. df1 = df.sort_values(['帖子总量'],ascending = False).head(10)
1. df1["帖子平均阅读数"]=df1[["阅读数","帖子总量"]].apply(lambda x:x["阅读数"]/x["帖子总量"],axis=1)
2. df1["帖子平均评论数"]=df1[["评论数","帖子总量"]].apply(lambda x:x["评论数"]/x["帖子总量"],axis=1)
3. df1["阅读评论比"]=df1[["阅读数","评论数"]].apply(lambda x:x["阅读数"]/x["评论数"],axis=1)
将2008年-2020年股吧(自然日)数据汇总,整合成一个csv文件,并利用pandas读取。根据groupby以“股票代码”和“公司简称”进行其余项的加和,归并。再根据sort_values方法以“帖子总量”大小进行降序排序,得到2008年-2020年股吧帖子总量排名前10的公司,如上图所示。
通过列间计算,得到帖子的平均阅读数、平均评论数、阅读评论比等新的数据,便于我们后面做更多的可视化分析。
(2) 2008-2020年帖子总量排名前10的公司(直方图)
1. from pyecharts.charts import Bar
2. from pyecharts import options as opts
3. from pyecharts.globals import ThemeType
4. bar = Bar(init_opts = opts.InitOpts(theme = ThemeType.LIGHT))
5. items = ["京东方A","中信证券","乐视退","中国中车","万科A","罗牛山","苏宁易购","中兴通讯","TCL科技","中国石油"]
6. sum_app = [[846770],[834837],[711850],[706665],[702682],[649788],[598995],[582359],[579095],[536491]]
7. bar.add_xaxis(["帖子总量"])
8. for item in items:
9. bar.add_yaxis(item,sum_app[items.index(item)])
10. bar.set_global_opts(title_opts=opts.TitleOpts(title="2008-2020年帖子总量排名前10的公司",pos_left='center',pos_top='5%'))
11. bar.render("2008-2020年帖子总量前10的公司.html")
12. bar.render_notebook()
根据上面的表格,我们可以进行更加直观的大数据可视化呈现,绘制2008-2020年帖子总量排名前10的公司(直方图)。
由图表可知,帖子总量TOP 10榜单总体呈现三梯队形态。
在帖子总数TOP10榜单中,京东方A与中信证券排在第一梯队,帖子总量数目达到了800000+;乐视退、中国中车、万科A处于第二梯队,帖子总量在【700000-800000】之间;随后的罗牛山、苏宁易购、中兴通讯、TCL科技、中国石油则呈递减态势,呈阶梯状下降,处于【500000-650000】之间。
(3) 帖子总量排名前10公司帖子情感倾向分析(并列直方图)
1. bar = Bar(init_opts = opts.InitOpts(theme = ThemeType.LIGHT))
2. bar.add_xaxis(["京东方A","中信证券","乐视退","中国中车","万科A","罗牛山","苏宁易购","中兴通讯","TCL科技","中国石油"])
3. bar.add_yaxis("正面帖子量",[235646,249392,182593,201769,210235,202855,189392,153943,168239,159264])
4. bar.add_yaxis("负面帖子量",[195483,211012,171527,173672,159494,125666,133469,138699,135887,132149])
5. bar.add_yaxis("中性帖子量",[415641,374433,357730,331224,332953,321267,276134,289717,274969,245078])
6. bar.set_global_opts(title_opts=opts.TitleOpts(title="2008-2020年帖子总量前10公司的帖子情感直方图",pos_left='center',pos_top='5%'))
7. bar.render("2008-2020年帖子总量前10公司的帖子情感直方图.html")
8. bar.render_notebook()
进而地,我们对2008-2020年帖子总量前10公司的帖子进行情感倾向划分,绘制2008-2020年帖子总量前10公司的帖子情感分布图。
由图像可发现,中性帖子数整体也是呈现着梯形下降态势,跟帖子总量的变化态势相近,说明中性帖子数目变化趋势能够较好地反映总体帖子总量的变化趋势。而正面帖子量和负面帖子量则没有呈现递增或递减的态势,分布排名不规律。说明了样本数据中,每个公司的股吧帖子情感倾向不同,从总体上来看,帖子总量前10公司的数量:中性帖子量>正面帖子量>负面帖子量。
(4) 帖子总量排名前10公司帖子情感均值比例(饼图)
1. from pyecharts.charts import Pie
2. pie = Pie(init_opts = opts.InitOpts(theme = ThemeType.LIGHT))
3. items = ["正面帖子量","负面帖子量","中性帖子量"]
4. sum_app = [[df1["正面帖子量"].mean()],[df1["负面帖子量"].mean()],[df1["中性帖子量"].mean()]]
5. pie.add("",data_pair = [(item,sum_app[items.index(item)]) for item in items,
6. radius = ["30 %","75 %"],
7. center = ["50 %","50 %"],
8. rosetype = "radius",
9. label_opts = opts.LabelOpts(is_show = False))
10. pie.set_global_opts(title_opts = opts.TitleOpts(title="2008-2020年帖子总量前10公司帖子情感均值比例\n",pos_left='center',pos_top='5%'))
11. pie.set_series_opts(label_opts=opts.LabelOpts(formatter='{b}:{c}\n{d}%'))
12. pie.render("2008-2020年帖子总量前10公司帖子情感均值比例.html")
13. pie.render_notebook()
通过饼图分析2008-2020年帖子总量前10公司的帖子情感均值占比。
从图中可以看出,中性帖子量均值为321914.6,占比为47.69%,正面帖子量均值为195332.8,占比为28.94%,负面帖子量为157705.8,占比为23.37%。这很好地印证了前面得到的结论(中性帖子量>正面帖子量>负面帖子量),也得到了更为清晰的三种情感倾向帖子所占帖子总量的比例值(正面:28.94%,中性:47.69%,负面23.37%)。
(5) 帖子总量排名前10公司平均阅评数(散点涟漪图)
1. from pyecharts.charts import EffectScatter
2. items = ["京东方A","中信证券","乐视退","中国中车","万科A","罗牛山","苏宁易购","中兴通讯","TCL科技","中国石油"]
3. sum_app = [[1496.415328],[1503.241833],[1769.997654],[1694.912761],[1349.551390],[1147.850016],[4720.495338],[1301.521007],[1294.517780],[937.984525]]
4. c = EffectScatter()
5. c.add_xaxis(items)
6. c.add_yaxis("",sum_app,color = False)
7. c.set_global_opts(title_opts = opts.TitleOpts(title = "2008-2020年帖子总量前10公司帖子平均阅读数(散点涟漪图)",pos_left='center'))
8. c.render("2008-2020年帖子总量前10公司的帖子平均阅读数散点涟图.html")
9. c.render_notebook()
我们利用阅读数/帖子总量以及评论数/帖子总量,得到新的两列数据[“帖子平均阅读数”]和[“帖子平均评论数”],同样地,样本范围定位于2008-2020年帖子总量前10的公司,绘制平均阅读数与平均评论数的散点涟漪图。
从平均阅读数图来看,整体上十家公司都处在每篇帖子1000-2000的阅读量间,并无明显差异。唯有苏宁易购达到惊人的4720人次,可得知苏宁易购公司的股吧帖子得到了较多的关注度,平均每篇股吧帖子都能得到许多的阅读。
从平均评论数图来看,总体数值处于2到4之间。其中中信证券、乐视退、中国中车、TCL科技的平均评论数较高,在3.4以上,而中兴通讯的平均评论数较低,仅为1.9。
(6) 帖子总量排名前10公司的阅读评论比(漏斗图)
1. from pyecharts.charts import Funnel
2. xld_1=573.786460
3. xld_2=437.254329
4. xld_3=516.583648
5. xld_4=479.222259
6. xld_5=420.669825
7. xld_6=402.530466
8. xld_7=1790.880460
9. xld_8=654.561250
10. xld_9=362.592510
11. xld_10=349.204126
12. xld_all_mean=df['阅读评论比'].mean()
13. xld_10_mean=df1['阅读评论比'].mean()
14. data = [xld_1,xld_2,xld_3,xld_4,xld_5,xld_6,xld_7,xld_8,xld_9,xld_10,xld_all_mean,xld_10_mean]
15. labels = ["京东方A","中信证券","乐视退","中国中车","万科A","罗牛山","苏宁易购","中兴通讯","TCL科技","中国石油","all_mean","10_mean"]
16. wf = Funnel()
17. wf.add('2008-2020年帖子总量前10公司的阅读评论比(漏斗图)',[list(z)for z in zip(labels,data)], is_selected= True)
18. wf.set_series_opts(label_opts=opts.LabelOpts(formatter='{b}:{c}'))
19. wf.set_global_opts(title_opts = opts.TitleOpts(title = "\n\n2008-2020年帖子总量前10公司的阅读评论比(漏斗图)",pos_left='center'))
20. wf.render("2008-2020年帖子总量前10公司的阅读评论比(漏斗图).html")
21. wf.render_notebook()
阅读评论比,该值一定程度上反映着股吧帖子用户参与度的大小。阅读评论比越高,说明了阅读该公司股吧帖子的人中进行评论的几率越小,用户参与讨论的程度越低。
绘制2008-2020年帖子总量前10公司的阅读评论比(漏斗图)。其中加入前十公司的阅读评论比均值以及所有公司的阅读评论比均值。
从该漏斗图中,我们可以发现漏斗形状呈现两极分化,中间阶梯状递减态势。苏宁易购的阅读评论比达到了1790,这与它较高的平均阅读数(4720)以及较低的平均评论数(2.6)有关。说明该公司的股吧帖子用户参与情况偏向于阅读,会进行评论的用户比很小。而中国石油的阅读评论比为349,说明它的阅读股吧帖子用户参与评论的程度最高。
(7) 帖子总量前10公司帖子总量、阅读数、评论数(平行坐标系图)
1. parallel=(
2. Parallel(init_opts=opts.InitOpts(bg_color='white',width='1000px',height='600px'))
3. .add_schema([ opts.ParallelAxisOpts(dim=3,name='公司简称',type_='category',data=data_name,),
4. opts.ParallelAxisOpts(dim=0,name='帖子总量',min_=100000,max_=300000),
5. opts.ParallelAxisOpts(dim=1,name='阅读数',min_=40000000),
6. opts.ParallelAxisOpts(dim=2,name='评论数',min_=150000), ] )
7. .add("2020年",data_list)
8. .set_global_opts(title_opts=opts.TitleOpts(title="2020年帖子总量前十的公司")))
9. parallel.render(u'./平行坐标系图.html')
10. parallel.render_notebook()
使用平行坐标系图展示了、2020年帖子总量排名前十公司的股票的帖子总量、阅读数和评论数的变化情况,直观地反应了每个公司帖子总量、阅读数和评论数的关系。
从图中看出东方财富在帖子总量上虽排在末尾,但阅读数是十家公司中最高的,这说明了东方财富的帖子质量高,比较吸引股民,泰达股份也是类似情况。除了东方财富,其它公司的帖子总量与评论数之间变化趋势基本一致。
2.3 近几年的股票股吧数据分析
(1) 2019年帖子总量前10公司(直方、折线组合图)
1. bar=(Bar()
2. .add_xaxis(x_data)
3. .add_yaxis('2019年帖子总量',y_data_1)
4. .set_global_opts(legend_opts=opts.LegendOpts(is_show=True,pos_right="10%",pos_bottom="95%"),title_opts=opts.TitleOpts(title='2019年帖子总量排名前十的公司')))
5. line=(Line()
6. .add_xaxis(x_data)
7. .add_yaxis("2019年评论总数",y_data_2)
8. .set_global_opts(legend_opts=opts.LegendOpts(is_show=True,pos_right="10%",pos_bottom="92%")))
9. grid=(Grid(init_opts=opts.InitOpts(bg_color='white',width='1100px',height='600px'))
10. .add(bar,grid_opts=opts.GridOpts(pos_bottom="65%",pos_left="30%"))
11. .add(line,grid_opts=opts.GridOpts(pos_left='6%')))
12. grid.render_notebook()
利用平行坐标系图,展示2019年帖子总量排名前十公司的股票帖子总量和评论总数的分布情况。从柱状图可看出帖子总量从左到右平缓下降,从折线图能看出评论总数从左到右先是波动大,后趋于平缓,结合两个图可以的出帖子总量和评论数一致性较弱。也能看出前四个公司的股票受到股民的热烈讨论。
(2) 2018年帖子总量排名前10公司(柱状图)
1. x_data = data2.index.to_numpy().tolist()
2. y_data = data2.帖子总量.to_numpy().tolist()
3. bar = (Bar()
4. .add_xaxis(x_data)
5. .add_yaxis('', y_data)
6. .set_global_opts(title_opts=opts.TitleOpts(title='2019年帖子总量前十股吧',pos_left='center'),
7. yaxis_opts=opts.AxisOpts(name='帖子量/条')) )
8. bar.render_notebook()
总体来说2019年比起2018年前十帖子的数量均有上升,但其中2018年大部分前十股吧在2019年未能进入前十,只有罗牛山和京东方A仍保持前十,可以看出股市在2018到2019的时间里,趋向还是有发生改变的,新兴科技企业的热度逐渐上升,前十之间的差距也在逐渐减小,呈现出百花齐放的局面。
(3) 2018和2019年热度前十股吧帖子情感分析(3D柱状图)
1. log = [data2.正面帖子量.to_numpy().tolist(),data2.负面帖子量.to_numpy().tolist(),data2.中性帖子量.to_numpy().tolist()]
2. data = [[j,i,log[i][j]] for i in range(3) for j in range(10)]
3. type_list = data2.index.to_numpy().tolist()
4. company_list = ['正面帖子量','负面帖子量','中性帖子量']
5. bar3D = (Bar3D()
6. .add("", data,
7. xaxis3d_opts=opts.Axis3DOpts(type_list, type_="category"),
8. yaxis3d_opts=opts.Axis3DOpts(company_list, type_="category"),
9. zaxis3d_opts=opts.Axis3DOpts(type_="value"), )
10. .set_global_opts(
11. visualmap_opts=opts.VisualMapOpts(
12. max_=151000,
13. range_color=[ "#1710c0","#0b9df0","#00fea8","#f5f811","#f09a09",#fe0300",],),
14. title_opts=opts.TitleOpts(title='2019年热度前十股吧帖子情感可视化',pos_left='center'),
15. xaxis_opts=opts.AxisOpts(name_rotate='45')) )
16. bar3D.render_notebook()
若是以之前划分的帖子数量前十的股吧作为热度前十的股吧进行进一步分析的话,可以看出,这两年前十的情感倾向都是有一定程度的共同点的,前十的股吧基本上中性帖子是热度的最大贡献者,其中大部分能进前十的股吧的正面帖子是要比负面帖子多或是持平的。
除了两个第一的特例,18年和19年的第一都是负面帖子量要比正面多的,并且下一年没有出现在前十了,可能是因为股吧骂声太多才进的前十,也一定程度上得反映负面帖子居多的公司,在第二年没有一个再入前十热度。
(4) 2018和2019年热度前十股吧帖子占比(多嵌套饼图)
1. sum1 = data1.帖子总量.sum()
2. other = sum1-data2.帖子总量.sum()
3. inner_x_data = ['前十','其他']
4. inner_y_data = [data2.帖子总量.sum()/10000,other/10000]
5. inner_data_pair = [list(z) for z in zip(inner_x_data, inner_y_data)]
6. outer_x_data = data2.index.to_numpy().tolist()
7. outer_x_data.append('其他')
8. outer_y_data1 = data2.帖子总量.to_numpy().tolist()
9. outer_y_data1.append(other)
10. outer_y_data =[]
11. for i in range(11):
12. outer_y_data.append(outer_y_data1[i]/10000)
13. outer_data_pair = [list(z) for z in zip(outer_x_data, outer_y_data)]
14. pie=(
15. Pie(init_opts=opts.InitOpts(width="1000px", height="800px"))
16. .add(
17. series_name="帖子总数",
18. data_pair=inner_data_pair,
19. radius=[0, "30%"],
20. label_opts=opts.LabelOpts(position="inner"),
21. )
22. .add(
23. series_name="帖子总数",
24. radius=["40%", "55%"],
25. data_pair=outer_data_pair,
26. label_opts=opts.LabelOpts(
27. position="outside",
28. formatter="{a|{a}}{abg|}\n{hr|}\n {b|{b}: }{c} {per|{d}%} ",
29. background_color="#eee",
30. border_color="#aaa",
31. border_width=1,
32. border_radius=4,
33. rich={
34. "a": {"color": "#999", "lineHeight": 22, "align": "center"},
35. "abg": {"backgroundColor": "#e3e3e3", "width": "100%","align": "right","height": 22,"borderRadius": [4, 4, 0, 0],},
36. "hr": {"borderColor": "#aaa","width": "100%","borderWidth": 0.5,"height": 0,},
37. "b": {"fontSize": 14, "lineHeight": 33},
38. "per": {"color": "#eee","backgroundColor": "#334455","padding": [2, 4],"borderRadius": 2,},
39. }, ), )
40. .set_global_opts(legend_opts=opts.LegendOpts(pos_left="left",pos_top='5%',orient="vertical"),
41. title_opts=opts.TitleOpts(title='2019年热度前十股吧帖子占比',subtitle='单位(帖子量/万条)',pos_left='left'))
42. .set_series_opts(
43. tooltip_opts=opts.TooltipOpts(
44. trigger="item", formatter="{a} <br/>{b}: {c} ({d}%)" ) ))
45. pie.render_notebook()
从该图也可以看出帖子总量在呈上升趋势,这可以反映出新进入股票市场的新股民的人数,从不断增加的帖子讨论也可以一定程度上反映出股市总体向好,股票热度呈现出上升状态;
另一方面从前十的占比来说,可以发现前十讨论热度的股票占总体比不多,其他股票占据了大部分帖子,进一步说明股市百花齐放的状况。
(5) 2018和2019年前十评论数股吧(漏斗图)
1. cate = data2.index.to_numpy().tolist()
2. data = data2.评论数.to_numpy().tolist()
3. funnel = (
4. Funnel()
5. .add("商品", [list(z) for z in zip(cate,data)], sort_="descending", label_opts=opts.LabelOpts(position="inside")) .set_global_opts(title_opts=opts.TitleOpts(title="2019年前十评论数股吧", pos_left='center', pos_top='0%'), legend_opts=opts.LegendOpts(pos_top='5%')))
6. funnel.render_notebook()
该图从评论数的角度用能直观反应数量差距的漏斗图进行前十的展示,可以看出每年评论数前十和帖子总数前十格局基本相同,进一步反映股吧的热度排名,漏斗底端曲线也越发平滑,前十后半部分的热度在不断接近。
(6) 2015、2016、2017年阅读量前10公司(箱型图)
1. from pyecharts import options
2. from pyecharts.charts import Boxplot, Timeline, Grid
3. def get_boxplot(data_path):
4. df = pd.read_csv(data_path)
5. Clist = df.groupby(['Scode', 'Coname']).agg('sum').sort_values('Readnum', ascending=False).head(10)
6. df_list = Clist.index.to_numpy()
7. x_data, y_data = get_data(df, df_list)
8. Box = Boxplot()
9. Box.add_xaxis(x_data)
10. Box.add_yaxis("", Box.prepare_data(y_data))
11. print(data_path, "完成")
12. return Box
13. def get_data(df, df_list):
14. x_data = []
15. y_data = []
16. for item in df_list:
17. x_data.append(item[1])
18. y_data.append(df[df.Scode == item[0]].Readnum)
19. return x_data, y_data
这三张箱型图显示的为2015、2016、2017三年中每年总阅读量前十公司的阅读量细节数据,可以看出大部分公司阅读量的中位数、上四分位数都会远小于最大值,同时中位数也很少会非常接近最低值,总体会维持在一个稳定的水平,只有在某些特殊的时间会突然达到最高值,引起用户热议。
2.4 具体案例分析(京东方A)
(1) 京东方A 2008-2020年评论数和帖子总量(3D折线图)
1. line3D = (Line3D(init_opts=opts.InitOpts(bg_color='white',width="1200px",height="800px"))
2. .add("2008年~2020年京东方A", data,
3. xaxis3d_opts=opts.Axis3DOpts(name=config_xAxis3D,type_='value',min_=2008, max_=2020,),
4. yaxis3d_opts=opts.Axis3DOpts(name=config_yAxis3D,type_='value',),
5. zaxis3d_opts=opts.Axis3DOpts(name=config_zAxis3D,type_='value',)
6. .set_global_opts(
7. title_opts=opts.TitleOpts(title='京东方A 2008年~2020年评论总数和帖子总量分布'),
8. visualmap_opts=[
9. opts.VisualMapOpts(type_="color",is_calculable=True,dimension=2,pos_top="50",max_=200000,range_color=["#1710c0","#0b9df0","#00fea8", "#00ff0d","#f5f811","#f09a09", "#fe0300",],),] ))
10. line3D.render(u'./3D折线图.html')
11. line3D.render_notebook()
使用3D折线图的方式来展示京东方A从2008年到2020年这13年里帖子总量和评论总数的变化。从y轴方向上看,整体来说帖子总量在这13年里是逐年上升的,这反映了京东方A的盈利水平的逐年提高,从而使股票越来越受到股民的关注,2015年帖子总量达到13年里的最高峰。
经查阅资料发现,2015年京东方A的股价是倒数第一,可能因为这件事情引起了股民的热烈讨论直接导致帖子总量的飙升。
图中还能看出,帖子总量和评论总数是呈正相关关系的,说明了帖子总量的多少会正向影响评论总数。
(2) 京东方A 2008-2020年阅读数、评论数和帖子总量的关系(3D散点图)
1. config_xAxis3D = "年份"
2. config_yAxis3D = "帖子总量"
3. config_zAxis3D = "评论总数"
4. config_read="阅读总数"
5. scatter3D=(Scatter3D(init_opts=opts.InitOpts(bg_color='white',width="1200px",height="800px"))
6. .add('2008年~2020年京东方A',data=data_read,
7. xaxis3d_opts=opts.Axis3DOpts(name=config_yAxis3D,type_='value',min_=4500,max_=160000),
8. yaxis3d_opts=opts.Axis3DOpts(name=config_zAxis3D,type_='value',),
9. zaxis3d_opts=opts.Axis3DOpts(name=config_read,type_='value',),)
10. .set_global_opts( title_opts=opts.TitleOpts(title='京东方A 2008年~2020年评论总数、帖子总量和阅读数的关系'),
11. visualmap_opts=[
12. opts.VisualMapOpts(type_="color",is_calculable=True,dimension=2,pos_top="50",max_=150000000,
13. range_color=["#1710c0","#0b9df0","#00fea8","#00ff0d","#f5f811","#f09a09","#fe0300",],),
14. ]))
15. scatter3D.render(u'./3D散点图.html')
16. scatter3D.render_notebook()
利用3D散点图的方式展示了2008-2020年京东方A的帖子总量、评论总数和阅读总数的关系,从横纵坐标来看,帖子总量与评论总数是正相关关系,阅读总数是由评论总数和帖子总量共同影响,且这种影响是正向。综合三个变量来看半数以上的点偏绿色及以下颜色,只有三个点是红色,这可能说明了在这三个点所代表的年份京东方A的股票有很多方面值得股民讨论。
(3) 京东方A 2020年股票帖子情感占比(水球图)
1. lq_1 = (
2. Liquid()
3. .add(series_name='正面帖子',data=[post_rate[0]],center=['15%', '50%'],color=['#0041ff'],is_animation=True,is_outline_show=False, )
4. .set_global_opts(title_opts=opts.TitleOpts(title='2020京东方A股票帖子情感占比')))
5. lq_2 = (
6. Liquid()
7. .add(series_name='负面帖子',data=[post_rate[1]],center=['50%', '50%'],color=['#3367ff'],is_outline_show=False,
8. label_opts=opts.LabelOpts(font_size=50,position='inside')))
9. lq_3 = (
10. Liquid()
11. .add(series_name='中性帖子',data=[post_rate[2]],center=['85%', '50%'],color=['#668dff'],is_outline_show=False,
12. label_opts=opts.LabelOpts(font_size=50,position='inside')))
13. grid = Grid(init_opts=opts.InitOpts(bg_color="white")).add(lq_1, grid_opts=opts.GridOpts()).add(lq_2, grid_opts=opts.GridOpts()).add(lq_3, grid_opts=opts.GridOpts())
14. grid.render_notebook()
通过水球图的方式,从左到右分别展示了2020年京东方A正面帖子、负面帖子和中性帖子所占的比例,从图中能够看出中性帖子占得比例超过一半,这可能说明了京东方A在2020年的股票比较稳定或者大多数的股民看待问题的方式比较理性,正面帖子的占比相比负面帖子略高一点,可推测在2020年这个特殊的时期24%的股民对京东方A股票仍然看好。
(4) 京东方A 2020年的变化(复合折线图)
1. import pandas as pd
2. import matplotlib.pyplot as plt
3. df = pd.read_excel("D:\Code\可视化\JDA.csv",parse_dates=True, index_col="Date")
4. number = 725
5. df = df.loc[df['Scode'] == number]
6. # print(df)
7. df.plot(subplots=True,figsize=(10, 12))
8. plt.show()
上图是关于京东方A 2020年各个指标的变化,其中本图是以时间序列作为横轴的折线图。为了方便对比,对将图片弄在同一画布。
从图中可以看出在正负面帖子之间的变化趋势对比还是大体一致的。可以看出京东方A有许多的帖子进行讨论,阅读数还是较高的。评论数当中三月份和六月份是最多的,说明在这个时候京东方A 受到大家的关注和具有争议。
3. 研究结论
纵观2008-2020年股吧的总体分析,可以看出股吧用户在股吧的活跃程度较高,并且在2012-2016年期间迅速上升,但在2018年后下降,2018-2019年间跳水式下降。即使是这么大的变化程度之下,从阅读数图上看,像苏宁易购、京东方A、中信证券等公司的股票帖子仍然是人们关注的热点。
再从情感帖子的方面看,大部分都是中性的帖子,但可以注意到,除去中性的帖子,正面帖子的数量相较于负面帖子的数量是比较多的。这也说明了,在股民积极讨论的时候,股市的正面影响大于负面影响。
在分析京东方A的例子当中,从京东方A的2008-2020年间,从股票帖子的评论数的图当中可以得出,京东方A股票是值得股民讨论的。而且在2020年帖子的情感占比当中,虽然中性的帖子比较多,但正面的帖子还是比负面的帖子多。从京东方A一年的各个指标的变化曲线来看,在三月份到四月期间帖子数量增加,同时负面的帖子的增加上升趋势比正面帖子的上升趋势更快。
即使2020年是特殊的一年,但京东方A的中性帖子占比超过一半,正面帖子的占比比负面帖子的高,而且在2020年京东方A四个季度都实现了营收,因此疫情对京东方A造成的消极影响很低,京东方A的股票比较稳定,疫情并没有影响股民看好京东方A的股票。