整体功能概述
这段 Python 代码主要用于对微信好友数据进行多维度的分析和可视化展示。它通过读取 CSV 和 Excel 文件中的数据,对微信好友的省份分布、性别比例、房间关系、签名情感强度等方面进行统计分析,并使用 pyecharts
库将分析结果以柱状图、饼图、关系图和地图等可视化形式呈现出来。
模块导入
import csv
from pyecharts.charts import Bar, Pie, Map, Graph
from pyecharts import options as opts
from collections import Counter
import xlrd
from snownlp import SnowNLP
import re
import jieba
import operator
import matplotlib.pyplot as plt
from PIL import Image
from wordcloud import WordCloud
csv
:用于读取 CSV 文件。pyecharts
:用于创建各种可视化图表,如柱状图(Bar
)、饼图(Pie
)、地图(Map
)和关系图(Graph
)。collections.Counter
:用于统计元素出现的次数。xlrd
:用于读取 Excel 文件。snownlp
:用于进行中文文本的情感分析。re
、jieba
、operator
、matplotlib.pyplot
、PIL
和wordcloud
虽然被导入,但在当前代码中部分未被使用。
函数分析
1. getPro(filename)
def getPro(filename):
lst1 = []
lst2 = []
with open(filename, 'r') as fr:
reader = csv.reader(fr)
for i in reader:
lst1.append(i[3])
lst2.append(i[1])
return lst1, lst2
- 功能:从指定的 CSV 文件中读取数据,将每行的第 4 列(索引为 3)数据存入
lst1
,第 2 列(索引为 1)数据存入lst2
,并返回这两个列表。 - 参数:
filename
为 CSV 文件的文件名
2. Visualpropyechart(lstprovince, lstcity)
def Visualpropyechart(lstprovince, lstcity):
lstprovinceNew = []
lst1 = []
lst2 = []
# 去掉空白的项,统计省份数据
for i in lstprovince:
if i == '' or i == 'City':
pass
else:
lstprovinceNew.append(i)
# 统计每个省份出现的次数
data = Counter(lstprovinceNew).most_common(10)
for j in data:
lst1.append(j[0])
lst2.append(j[1])
# 初始化配置项,内部可设置颜色
bar = (
Bar()
.add_xaxis(lst1)
.add_yaxis("amount", lst2, color='teal')
.set_global_opts(
title_opts=opts.TitleOpts(title='微信好友省份分布数据分析'),
yaxis_opts=opts.AxisOpts(name="省份数量"),
xaxis_opts=opts.AxisOpts(name="省份名字")
)
).render('好友省份比例柱状图.html')
- 功能:对省份数据进行处理和可视化,绘制微信好友省份分布的柱状图。
- 步骤:
- 过滤掉空白项和值为
'City'
的项,得到有效的省份数据。 - 使用
Counter
统计每个省份出现的次数,并选取出现次数最多的前 10 个省份。 - 使用
pyecharts
的Bar
类创建柱状图,设置 X 轴为省份名称,Y 轴为省份数量,并设置图表的标题和坐标轴名称。 - 将图表保存为
好友省份比例柱状图.html
文件。
- 过滤掉空白项和值为
3. getSex(filename)
def getSex(filename):
lstsex = []
with open(filename, 'r') as fr:
reader = csv.reader(fr)
for i in reader:
lstsex.append(i[4])
return lstsex
- 功能:从指定的 CSV 文件中读取每行的第 5 列(索引为 4)数据,即微信好友的性别信息,并返回一个包含所有性别信息的列表。
- 参数:
filename
为 CSV 文件的文件名。
4. VisualSexpyechart(lstsex)
def VisualSexpyechart(lstsex):
sex = dict()
# 提取好友性别信息,从1开始
for f in lstsex[1:]:
if f == '1': # 男
sex["man"] = sex.get("man", 0) + 1
elif f == '2': # 女
sex["women"] = sex.get("women", 0) + 1
else: # 未知
sex["unknown"] = sex.get("unknown", 0) + 1
# 打印性别比例
total = len(lstsex[1:])
print("男性好友: %.2f%%" % (float(sex["man"]) / total * 100))
print("女性好友: %.2f%%" % (float(sex["women"]) / total * 100))
print("不明性别好友:%.2f%%" % (float(sex["unknown"]) / total * 100))
# 使用echarts饼状图
attr = ['男性好友', '女性好友', '不明性别好友']
value = [sex['man'], sex['women'], sex['unknown']]
# 初始化配置项
bar = (
Bar()
.add_xaxis(attr)
.add_yaxis("amount", value, color='teal')
.set_global_opts(
title_opts=opts.TitleOpts(title='微信数据分析'),
yaxis_opts=opts.AxisOpts(name="人数"),
xaxis_opts=opts.AxisOpts(name="性别")
)
).render('好友性别比例柱状图.html')
- 功能:对微信好友的性别信息进行统计和可视化,绘制性别比例的柱状图。
- 步骤:
- 统计男性、女性和不明性别好友的数量。
- 计算并打印出每种性别的好友占比。
- 使用
pyecharts
的Bar
类创建柱状图,设置 X 轴为性别类别,Y 轴为人数,并设置图表的标题和坐标轴名称。 - 将图表保存为
好友性别比例柱状图.html
文件。
5. getRoom(filename)
def getRoom(filename):
Room = {}
data = xlrd.open_workbook(filename)
table = data.sheets()[0]
rows = table.nrows
for i in range(rows):
if i == 0:
continue
Room[table.row_values(i)[3]] = table.row_values(i)[9]
return Room
- 功能:从指定的 Excel 文件中读取数据,将每行的第 4 列(索引为 3)作为键,第 10 列(索引为 9)作为值,存储在字典
Room
中,并返回该字典。 - 参数:
filename
为 Excel 文件的文件名。
6. RoomSee(Room)
def RoomSee(Room):
nodes = []
for i in Room:
nodes.append({"name": i, "symbolSize": 5})
links = []
for i in Room:
for j in Room:
if Room[i] == Room[j]:
links.append({"source": i, "target": j})
# 初始化图表
graph = Graph(init_opts=opts.InitOpts())
graph.set_global_opts(title_opts=opts.TitleOpts(title="关系图示例"))
graph.add(
"",
nodes,
links,
categories=None,
is_focusnode=True,
is_roam=True,
label_opts=opts.LabelOpts(is_show=True, rotate=45),
layout="force",
edge_length=220,
gravity=0.5,
repulsion=100,
linestyle_opts=opts.LineStyleOpts(curve=0.2)
)
graph.render("1.html")
- 功能:根据房间信息绘制关系图。
- 步骤:
- 创建节点列表
nodes
,每个节点包含名称和大小信息。 - 创建边列表
links
,如果两个节点对应的房间信息相同,则添加一条边。 - 使用
pyecharts
的Graph
类创建关系图,设置图表的标题和相关配置项。 - 将图表保存为
1.html
文件。
- 创建节点列表
7. getcvsData(filename, index)
def getcvsData(filename, index):
lstdata = []
with open(filename, 'r') as fr:
reader = csv.reader(fr)
for i in reader:
if len(i) > index:
lstdata.append(i[index])
return lstdata
- 功能:从指定的 CSV 文件中读取指定列(索引为
index
)的数据,并返回一个包含该列所有数据的列表。 - 参数:
filename
为 CSV 文件的文件名,index
为要读取的列的索引。
8. analysemood(elist)
def analysemood(elist):
del elist[0]
listgood = 0
listbad = 0
for i in elist:
if i == '':
pass
else:
s = SnowNLP(i)
if s.sentiments < 0.5:
listbad += 1
else:
listgood += 1
listEmotional = ['积极', '消极']
listValue = [listgood, listbad]
c = (
Pie()
.add(
"",
[list(z) for z in zip(listEmotional, listValue)],
radius=["40%", "60%"],
rosetype="radius",
)
.set_colors(["plum", "lightsteelblue"])
.set_global_opts(
title_opts=opts.TitleOpts(title="饼图"),
legend_opts=opts.LegendOpts(orient="vertical", pos_top="15%", pos_left="2%"),
)
.set_series_opts(
label_opts=opts.LabelOpts(formatter="{b}:{c}")
)
)
return c
- 功能:对微信好友的签名信息进行情感分析,并绘制情感强度的饼图。
- 步骤:
- 去除列表中的第一个元素。
- 使用
SnowNLP
对每个签名进行情感分析,统计积极和消极情感的数量。 - 使用
pyecharts
的Pie
类创建饼图,设置饼图的半径、颜色、标题和标签格式。 - 返回创建好的饼图对象。
9. VisualPropyecharts(lstprovince)
def VisualPropyecharts(lstprovince):
lstprovinceNew = []
lst1 = []
lst2 = []
# 去掉空白的项
for i in lstprovince:
if i == '' or i == 'Province':
pass
else:
lstprovinceNew.append(i)
# 统计每个省份出现的次数
data = Counter(lstprovinceNew).most_common(2)
for j in data:
# 处理直辖市和特别行政区
if j[0] in ['北京', '上海', '天津', '重庆', '香港', '澳门']:
lst1.append(j[0] + "市")
else:
lst1.append(j[0] + "省")
lst2.append(j[1])
# 根据省份数据生成地图
c = (
Map()
.add(
"例子",
[list(z) for z in zip(lst1, lst2)],
"china"
)
.set_global_opts(
title_opts=opts.TitleOpts(title="微信好友省份分布图", subtitle="数据来源:微信好友", pos_right="center"),
visualmap_opts=opts.VisualMapOpts(max_=95),
legend_opts=opts.LegendOpts(
pos_right="right",
pos_bottom="bottom"
)
)
.set_series_opts(label_opts=opts.LabelOpts(is_show=True))
)
return c
- 功能:对省份数据进行处理和可视化,绘制微信好友省份分布的地图。
- 步骤:
- 过滤掉空白项和值为
'Province'
的项,得到有效的省份数据。 - 使用
Counter
统计每个省份出现的次数,并选取出现次数最多的前 2 个省份。 - 处理直辖市和特别行政区的名称。
- 使用
pyecharts
的Map
类创建地图,设置地图的标题、视觉映射和图例,并设置显示省份名称。 - 返回创建好的地图对象。
- 过滤掉空白项和值为
主程序
if __name__ == "__main__":
# 省份分布分析
a, b = getPro('WudiFriendsAllData.csv')
Visualpropyechart(a, b)
# 性别分布分析
VisualSexpyechart(getSex("WudiFriendsAllData.csv"))
# 房间关系分析
RoomSee(getRoom("软件223学生详细名单.xls"))
# 签名情感强度分析
analysemood(getcvsData('WudiFriendsAllData.csv', 5)).render(path='签名情感强度.html')
# 好友所在省份分布地图
alist = getcvsData('WudiFriendsAllData.csv', 3)
VisualPropyecharts(alist).render(path="好友所在城市及省份分布.html")
- 功能:依次调用上述各个函数,完成微信好友数据的多维度分析和可视化,生成相应的 HTML 文件。