代码说明:
- 导入模块:导入所需的所有模块,包含用于文件操作、数据处理、可视化的模块。
- 定义函数:对每个功能分别定义函数,涵盖读取文件、数据处理、可视化等操作。
- 主程序:在
if __name__ == "__main__":
块中依次调用各个功能函数,开展全面的微信好友数据分析。
注意事项:
- 要保证
WudiFriendsAllData.csv
和软件223学生详细名单.xls
文件存在,并且文件格式和列索引与代码中的假设相符。 - 运行代码前,要确保已经安装了所有必要的库,可使用
pip install pyecharts xlrd snownlp jieba wordcloud
进行安装。
import csv
import xlrd
from pyecharts.charts import Bar, Pie, Graph, Map
from pyecharts import options as opts
from collections import Counter
from snownlp import SnowNLP
import re
import jieba
import operator
import matplotlib.pyplot as plt
from PIL import Image
from wordcloud import WordCloud
# 1. 读取 csv 文件,把省份信息读取出来,用 lst1 返回,城市数据读取出来,用 lst2 返回
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
# 2. 省份 pyechart 可视化
def Visualpropyechart(lstprovince, lstcity):
lstprovinceNew = []
lst1 = []
lst2 = []
# 2.1 去掉空白的项,统计省份数据
for i in lstprovince:
if i == '' or i == 'City':
pass
else:
lstprovinceNew.append(i)
# 2.2 统计每个省份出现的次数
data = Counter(lstprovinceNew).most_common(10) # 使用 Counter 类统计出现的次数,并转换为元组列表
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')
# 3. 读取 csv 文件获取性别信息
def getSex(filename):
lstsex = []
with open(filename, 'r') as fr:
reader = csv.reader(fr)
for i in reader:
lstsex.append(i[4])
return lstsex
# 4. 性别 pyechart 可视化
def VisualSexpyechart(lstsex):
sex = dict()
# 4.1 提取好友性别信息,从 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:])
# 4.2 打印性别比例
print("男性好友: %.2f%%" % (float(sex["man"]) / total * 100))
print("女性好友: %.2f%%" % (float(sex["women"]) / total * 100))
print("不明性别好友:%.2f%%" % (float(sex["unknown"]) / total * 100))
# 4.3 使用 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')
# 5. 从 Excel 文件获取群聊信息
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
# 6. 群聊关系图可视化
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")
# 7. 从 csv 文件获取指定列数据
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
# 8. 分析微信好友签名的情感强度值
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
# 9. 好友所在省份地图可视化
def VisualPropyecharts(lstprovince):
lstprovinceNew = []
lst1 = []
lst2 = []
# 9.1 去掉空白的项
for i in lstprovince:
if i == '' or i == 'Province':
pass
else:
lstprovinceNew.append(i)
# 9.2 统计每个省份出现的次数
data = Counter(lstprovinceNew).most_common(2) # 使用 Counter 类统计出现的次数,并转换为元组列表
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" # 显示省份
# "china-cities", # 显示城市
)
.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
# 主程序
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")