1、特征词
表示一篇文本,矩阵数据,聚类、分类、预测
2、情绪、情感分析
情感值、舆论文本、文本数据,来源管,新闻、情感倾向;存在误差,不准确
3、基于股评文本的情绪分析
#网络舆情,判断指数走向
3、安装SnowNLP
pip install snownlp
4、导入包
import pandas as pd
from snownlp import SnowNLP
import matplotlib.pyplot as plt
import seaborn as sns
5、中文显示
#处理中文显示问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
sns.set_style('whitegrid',{'font.sans-serif':['simhei','Arial']})
6、读取数据
该数据是从新浪财经频道获取的股票评论标题信息,时间跨度为2018-9-3--2018-12-7,共计1000条股评。
# 读取文本数据,读取每行的评论标题
# 读取
# 读取
orig_comments=pd.read_csv('C:/Users/86186/Desktop/大二 下/数据挖掘/第7章/第3节 案例:基于股评文本的情绪分析/stocktextming.csv')
orig_comments.drop("日期时间",axis=1,inplace=True) #删除"日期时间"列
print('原始数据:',1)
# 输出前五行
print(orig_comments.head())
print()
【out】:
原始数据: 1
标题 日期
0 十大博客看后市:2600点下方将现低吸机会 12月07日
1 杨德龙:跨年度行情能否出现 12月07日
2 午后名博看市:2600点得失至关重要 12月07日
3 李大霄:2449点成为A股历史第五个底部正变为事实 12月07日
4 杨德龙:2019年可能会出现“美股向下、A股向上” 12月07日
7、计算情绪得分
# 使用SnowNLP计算对每条标题的文字评估情绪得分
# 新建“情绪”一列
orig_comments['情绪']=None
# 所有文本长度
lenOrig=len(orig_comments)
i=0
# 计算情绪得分SnowNLP(数据二维表.iloc[行,列]).sentiments
while(i<lenOrig):
s=SnowNLP(orig_comments.iloc[i,0]).sentiments
orig_comments.iloc[i,2]=s
i=i+1
# 输出每行的情绪得分
print('情绪得分:')
# 前五行
print(orig_comments.head())
print()
【out】:
情绪得分:
标题 日期 情绪
0 十大博客看后市:2600点下方将现低吸机会 12月07日 0.108485
1 杨德龙:跨年度行情能否出现 12月07日 0.901201
2 午后名博看市:2600点得失至关重要 12月07日 0.523612
3 李大霄:2449点成为A股历史第五个底部正变为事实 12月07日 0.308116
4 杨德龙:2019年可能会出现“美股向下、A股向上” 12月07日 0.667355
8、计算每日平均分
每日的评论平均分 = 当日评论总得分/当日评论条数
# 当日评论条数
numberByDay=orig_comments['情绪'].groupby(orig_comments['日期']).count()
# 当日评论总得分
emotionByDay=orig_comments['情绪'].groupby(orig_comments['日期']).sum()
# 新建二维表
markByDay=pd.DataFrame()
markByDay['情绪']=emotionByDay
markByDay['计数']=numberByDay
# 乘以5放大波动变化,便于观察
markByDay['情绪平均']=markByDay['情绪']/markByDay['计数']*5
print('每日评论平均情绪得分:')
print(markByDay.head())
print()
【out】:
每日评论平均情绪得分:
情绪 计数 情绪平均
日期
09月03日 0.397172 2 0.992931
09月04日 7.164106 11 3.256412
09月05日 5.696181 8 3.560113
09月06日 4.476095 7 3.197211
09月07日 4.904907 8 3.065567
9、日期转化
# 将索引转换为日期
markByDay['order']=markByDay.index
markByDay['日期']=None
# 将规格化为后面的shMarket上证指数DataFrame中的日期形式化用于数据对比
lenMBD=len(markByDay)
i=0
while(i<lenMBD):
str1=markByDay.iloc[i,3]
str2='2018-'+str1[0:2]+'-'+str1[3:5]
markByDay.iloc[i,4]=str2
i=i+1
print(markByDay.head())
【out】:
情绪 计数 情绪平均 order 日期
日期
09月03日 0.397172 2 0.992931 09月03日 2018-09-03
09月04日 7.164106 11 3.256412 09月04日 2018-09-04
09月05日 5.696181 8 3.560113 09月05日 2018-09-05
09月06日 4.476095 7 3.197211 09月06日 2018-09-06
09月07日 4.904907 8 3.065567 09月07日 2018-09-07
10、读取大盘涨跌
# 读取当日大盘涨跌幅
shMarket=pd.read_csv('C:/Users/86186/Desktop/大二 下/数据挖掘/第7章/第3节 案例:基于股评文本的情绪分析/sh.csv',encoding='utf-8')
print('上证指数:')
print(shMarket.head())
szMarket=pd.read_csv('C:/Users/86186/Desktop/大二 下/数据挖掘/第7章/第3节 案例:基于股评文本的情绪分析/sz.csv',encoding='utf-8')
print('深证指数:')
print(szMarket.head())
print()
# 建立新表
Market=pd.DataFrame()
Market['日期']=shMarket['date']
【out】:
上证指数:
date open high ... v_ma5 v_ma10 v_ma20
0 2018-12-07 2609.34 2614.58 ... 1561316.40 1481092.41 1782418.64
1 2018-12-06 2629.82 2633.68 ... 1621824.47 1563491.98 1804104.31
2 2018-12-05 2629.83 2660.39 ... 1652838.65 1571139.39 1813091.23
3 2018-12-04 2651.56 2666.08 ... 1635761.50 1599233.79 1822441.19
4 2018-12-03 2647.13 2665.30 ... 1547197.25 1647184.53 1820305.65[5 rows x 14 columns]
深证指数:
date open high ... v_ma5 v_ma10 v_ma20
0 2018-12-07 7741.73 7765.14 ... 217849587.2 207090702.4 244942354.4
1 2018-12-06 7854.59 7872.45 ... 221873430.4 216734310.4 246287288.8
2 2018-12-05 7825.12 7972.98 ... 223762076.8 218373801.6 246326602.4
3 2018-12-04 7916.55 7954.31 ... 222382438.4 220044332.8 246439476.0
4 2018-12-03 7901.83 7968.09 ... 213738608.0 226191689.6 245773236.8[5 rows x 14 columns]
11、读取波动百分比
#按日期读取每日股价变动百分比price_change
Market['上证波动']=shMarket['p_change']
Market['深证波动']=szMarket['p_change']
print('New:')
print(Market.head())
markByDay.set_index('日期',inplace=True)
Market.set_index('日期',inplace=True)
# 左连接
result=Market.join(markByDay)
【out】:
New:
日期 上证波动 深证波动
0 2018-12-07 0.03 -0.01
1 2018-12-06 -1.68 -2.44
2 2018-12-05 -0.61 -0.32
3 2018-12-04 0.42 0.19
4 2018-12-03 2.57 3.34
股市波动与评论情绪变化对比:
12、画图
plt.plot(result['上证波动'],'r-',label='上证波动',linewidth=3)
plt.plot(result['深证波动'],'k:',label='深证波动',linewidth=3)
plt.plot(result['情绪平均'],'b-',label='情绪平均',linewidth=3)
plt.title('三种波动对比',fontsize=20)
plt.xlabel('交易日期',fontsize=15)
plt.ylabel('波动率',fontsize=15)
plt.legend()
plt.savefig('stockTextMing.png',dpi=300,bbox_inches='tight')
plt.show()