用python做数据处理流程大致可以分成以下三个部分:
一、数据的获取:一般可以有公开的数据集、网络爬虫、自己整理等方式。
二、数据的处理:包括数据的预处理、数据的查找/筛选/排序/统计等操作。
三、数据的展示:包括图、表等可视化呈现。
下面用一个电影评论的关键词云图制作为例,来演示这个数据处理的全流程。在这个例子中,我们将用到以下工具包:
import pandas as pd # 数据处理工具pandas
import sqlite3 # sql数据库工具
import jieba # 文本分词工具jieba
import pyecharts as pec # 数据可视化工具pyecharts
from pyecharts.charts import WordCloud # 导入WordCloud词云图模块
from pyecharts.render import make_snapshot # 导入输出图片工具
from snapshot_selenium import snapshot # 使用snapshot-selenium 渲染图片
一、数据的获取。
我们可以下载到豆瓣的数据库,这个douban_comment_data.db数据库中包含三个表:comment、movie、movie_chinese。具体详见博文通过movie_id来查询数据库获取电影名字和平均得分我们
我们使用sql语句来读取所需要的数据表存放在comment_data中。可以参考博文python对sql数据库文件的基本操作。
conn = sqlite3.connect('data/douban_comment_data.db')
comment_data = pd.read_sql_query('select * from comment;',conn)
二、数据的处理
这里我们编写了一个函数get_comment_key_words(movie_id,count)来对数据库中的数据进行处理,参数包括电影的id(movie_id)和需要获得的热门关键的数量count。我们这里采用了pandas技术中的筛选技术(参考博文python中DataFrame数据的筛选)
字符串的拼接技术(参考博文使用“+”完成python中的字符串拼接),jieba分词技术(参考博文:基于jieba模块的数据分析)
等等。
def get_comment_key_words(movie_id,count):
comment_list = comment_data[comment_data['MOVIEID']==movie_id]['CONTENT']
comment_str = ""
for comment in comment_list:
comment_str += comment + '\n'
seg_list = list(jieba.cut(comment_str))
keywords_counts = pd.Series(seg_list)
keywords_counts = keywords_counts[keywords_counts.str.len()>1]#注意这里需要先筛选再value_count()
filtered_index = ~keywords_counts.str.contains(filter_condition)
keywords_counts = keywords_counts[filtered_index]
keywords_counts = keywords_counts.value_counts()
keywords_counts = keywords_counts[:count]
return keywords_counts
注意我们这里在进行过滤处理的时候,用到了FILTER_WORDS的技术,原理是把一些高频的无意义的词过滤掉。我们首先需要建立一个列表,里面存放着一系列的待过滤词组。然后使用字符串的.join()方法把这些过滤词组用或运算符“|”把他们联结起来,成为一个或表达式,然后使用.str.contains()方法获取满足这些条件的数据索引值,对其求反就可以获得过滤后的索引了。
FILTER_WORDS = ['真个','那里','不知','两个','这么','那么','怎么','如果',
'是','的','这个','一个','这种','时候','什么','\n','一部','这部','没有',
'还有','因为','只见','甚么','原来','不敢','如何','不曾','闻言','那怪','一声',
'出来','...','却说','片子','可以','不得','无法','这样','可能','最后','我们','东西',
'现在','那个','所以','一直','也许','电影','它们','不能','这里','今日',"觉得",'is','感觉']
filter_condition = '|'.join(FILTER_WORDS)
filtered_index = ~keywords_counts.str.contains(filter_condition)
keywords_counts = keywords_counts[filtered_index]
要注意的是,我们需要在完成过滤操作之后,再进行value_count操作(参考博文使用data.value_counts()方法对Series数组中的重复元素进行统计),然后通过切片的方法去除前count个热门词汇就完成了我们需要的数据的提取。
三、数据的可视化。
这里我们采用词云图图的方式来进行展示,原理参考博文基于pyechart的词云可视化展示。默认会生成html在浏览器中才能看到,我们采用make_snapshot技术直接生成png图片(参考博文python中使用pyecharts直接绘制png图片)
我们最后运行代码,可以在工程目录下得到png文件,打开之后,就得到了movie_id为"1292052",也就是《肖申克的救赎》这部电影的Top30热门词汇。