这几天研究了下python中操作微信的一个有趣的包,itchat,发现该包很有性格,[呲牙],随即,便引出了如下一段故事。。。。
话说,公元2018年,深夏,在华夏魔都郊区的一个小房子里,一位青年,赤裸着上身,指尖铿锵有力的撞击着机械键盘,发出咔咔咔咔的声音,身旁的烟灰缸里一丝丝青烟缭绕。思想摇曳在不知名的远方。。。(实在编不下去了,哈哈哈)
闲言少叙,先上张图。
言归正传。python的itchat这个包,可以获取到自己微信好友的基本信息,包括,微信名称,性别,省市,个性签名,通过这些数据结合pandas便可以分析微信好友的性别占比,省市分部,并用好友的微信名称和个性签名做图云。
第一步,先引入包
import itchat
import csv
import pandas as pd
from do_plot import Itchar_friend #在另一个文件中写了一个类,主要实现了一些作图的函数接口
#在另一个文件中引入
import pandas as pd
import matplotlib.pyplot as plt
from wordcloud import WordCloud
第二步,,获取好友信息,并写入到csv中(其实不用的,只是这样做,可以在调试的过程中不用一次一次登录微信)
friends_items = []
itchat.login()#微信登录
friends = itchat.get_friends()#获取所有微信信息
print(friends)
for frident in friends:#从返回的信息中获取好友NickName,Sex,Province,City,Signature信息
friends_item = get_some_vlaue(frident)
friends_items.append(friends_item)
print(friends_items)
用get_friends()获取的数据信息,很凌乱,包含太多东西,如下:
我们从数据中获取如下有效信息并保存在列表friends_items 中
代码如下:
def get_some_vlaue(friend):
friend_dict = {}
NickName = friend['NickName']
Signature = friend['Signature']
Sex = friend['Sex']
Province = friend['Province']
City = friend['City']
friend_dict['NickName'] = NickName
friend_dict['Signature'] = Signature
friend_dict['Sex'] = Sex
friend_dict['Province'] = Province
friend_dict['City'] = City
return friend_dict
写入csv(此步为调试方便),传入列表,转换为字典,用pandas的方法写入到csv中。
def save_csv(friend_dict):
friend_header = friend_dict[0].keys()
NickName = []
Signature = []
Sex = []
Province = []
City = []
for friend in friend_dict:
NickName.append(friend['NickName'])
Signature.append(friend['Signature'])
Sex.append(friend['Sex'])
Province.append(friend['Province'])
City.append(friend['City'])
data = {'NickName': NickName, 'Sex': Sex, 'Province': Province,
'City': City, 'Signature': Signature}
frame = pd.DataFrame(data)
frame.to_csv('frident.csv',index=True)
return frame
第三部,分析数据,画图,
先利用pandas将数据从csv中读出,一步步画图
def read_csv(self):
frame_dt = pd.read_csv("frident.csv")
print(frame_dt.head())
return frame_dt
读入数据,并返回datefream的格式返回,方便之后的数据处理
第一幅图:性别占比图,从接口获取的数据中性别男,Sex为1,女为2,未设置则为0,计算出男女人数,并画图
def plt_sex_plant(self,frame):
sex = frame['Sex']#获取到所有性别信息
male = famale = other = 0
for i in range(len(sex)):#计算男女人数
if sex[i] == 1:
male += 1
elif sex[i] == 2:
famale += 1
else:
other += 1
label = ['male','famale','other']
#画饼状图,传入包含人数的列表,标签,和显示形式
plt.pie([male,famale,other],labels=label,autopct='%1.1f%%',)
plt.axis('equal')#二位形式显示
plt.legend(loc='upper left', bbox_to_anchor=(-0.1, 1))#设置标签显示位置和格式
plt.show()显示图片
下图为图片显示,哈哈哈,第一幅图出来了。
第二幅图,画两幅柱状图,显示好友省市分部,
def plt_province_plant(self,frame):
Province = frame['Province']#获取省所有分布信息
name_list = set(Province)#获取涉及的省
x_list = list(name_list)
vals = {}
#获取每一个省的好友个数
for i in x_list:
pro_name = frame[frame['Province'] == i]#
vals[i] = len(pro_name)
#定义x,y的数据列表
x_vals = []
y_vals = []
vals_k = sorted(vals.items(), key=lambda vals: vals[1], reverse=True)#将获取到的分部信息排序,以从小到大的顺序排序的
for vals_i in vals_k[:10]:#获取前10位信息,显示就好
x_vals.append(vals_i[0])
y_vals.append(vals_i[1])
#打开一个画布
plt.figure()
plt.bar(x_vals, y_vals, width=0.8)#画一个柱状图
plt.xticks(rotation=60)#x轴的信息旋转60度显示
plt.title("Province")#设置图片的标题
plt.show()#显示图片
上图:
省市分布套路一样,不在重复,文章已经很长了。。。。。直接上图吧!
接下来,就是最后一个了,作图云,这个最神奇了。用好友的个性签名,做一个图片
def plt_Signature_plant(self,frame):
context_list = list(set(frame['Signature']))#获取所有个性签名信息
wordcloud = WordCloud(
width=600,
height=300,
font_path=r'D:\word\simhei.ttf', # 设置字体模式
max_words=400, # 设置最大字数
).generate(str(context_list))
plt.figure()
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")
plt.show()
# 保存图片
wordcloud.to_file('wordcloud_Signature.png')
好友名称和个性签名,作图云是一个的套路啊,不重复了,哈哈哈哈,上图上图。
是不是很神奇呢?
哈哈,作者代码技拙,大家多多指教。[抱拳],多多点赞哦!