最近看了一篇文章,利用Python分析好友的性别比例和位置构成,蛮有意思,思路非常简单,通过itchat包将微信里friends的数据导出来,从中选出性别信息,利用matplotlib画成饼状图。同样,从中选出位置的省份信息,生成csv文件,就可以利用现成的一些数据可视化的网站帮你展示。
需要用到的第三方库有:matplotlib、itchat、 collections 、csv
登录微信,取出friends的数据
itchat.auto_login(hotReload=True)
friends = itchat.get_friends(update=True)
分析性别比例
由于friends第一个数据(0)为当前用户,因此从1开始记录数据,用map将friends中sex数据导出,其中使用了lambda匿名函数器将sex选择出来。导出sex函数后,要统计性别的个数,使用collections.Counter计数,再使用item转化为可遍历的元组。最后就可以使用matplotlib画图了。
代码如下:
def analyseSex(friends):
# 将friends中的Sex信息抽取出来,map返回的是迭代器,转化为list格式
sexs = list(map(lambda x:x['Sex'],friends[1:]))
# item返回(键,值)元组,第一维为键,第二维为值,即个数
# 取性别个数变为列表
counts = list(map(lambda x:x[1],c.Counter(sexs).items()))
# 设置标签
labels = ['未知','男性','女性']
# 设置标签颜色
colors = ['red','yellowgreen','lightskyblue']
plt.figure(figsize=(8,5), dpi=80)
# 设置为仅显示一个分区,不设置的话,图可能是椭圆的
plt.axes(aspect=1)
plt.pie(counts, #性别统计结果
labels=labels, #性别展示标签
colors=colors, #饼图区域配色
labeldistance = 1.1, #标签距离圆点距离
autopct = '%3.1f%%', #饼图区域文本格式
shadow = False, #饼图是否显示阴影
startangle = 90, #饼图起始角度
pctdistance = 0.6 #饼图区域文本距离圆点距离
)
# 图例显示
plt.legend(loc='upper right',)
plt.title(u'%s的微信好友性别组成' %(friends[0]['NickName']))
plt.show()
分析好友位置
这里将friends的姓名、省份写入csv文件,然后使用BDP进行分析
使用DictWriter以字典的形式将每个微信好友的姓名和省份信息写进csv的每行,注意:写入每行之前要先定义数据头,就是数据属性名
代码:
def analyseLocation(friends):
# 定义数据头
headers = ['NickName','Province']
with open('location.csv','w',encoding='utf-8',newline='',) as csvFile:
# DictWriter以字典的形式写入内容
# 设置写入格式
writer = csv.DictWriter(csvFile, headers)
# writeheader()实现添加文件头(数据名)
writer.writeheader()
for friend in friends[1:]:
# 定义一个字典
row = {}
# 按属性写入
row['NickName'] = friend['NickName']
row['Province'] = friend['Province']
# 将每个字典写入为一行
writer.writerow(row)
在BDP网站的将生成的csv文件上传
按照提示,不停点击下一步,直至上传成功。
选择新建图片,格式选择为“微信运营分析”
维度添加省份,数值添加名字
在“筛选器”筛选省份,去掉国外的和空白的
设置格式
最后生成位置图像
最后就大功告成了,赶紧分析一波自己的微信好友吧。
附上完整的代码框架
import matplotlib.pyplot as plt
import itchat
import collections as c
import csv
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
def analyseSex(friends)
def analyseLocation(friends)
if __name__ == '__main__':
itchat.auto_login(hotReload=True)
friends = itchat.get_friends(update=True)
analyseSex(friends)
analyseLocation(friends)
参考:
https://zhuanlan.zhihu.com/p/34378997?utm_source=wechat_session&utm_medium=social&from=singlemessage