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()

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐