简介:
python有个itchat的库,据说是一个非常神奇的python库,可以干很多有意思的事情,今天闲着没事,把自己的微信分析了个遍,包括对微信好友性别、地域、以及签名等的分析。
思路:
有了itchat这个库,一切都不是太难办。先介绍一下,本人微信上目前有340左右的好友,首先是对微信好友性别的分析,我想看一下自己微信上究竟是男生还是女生还是,好吧,其实是想看一下性别的占比。话不多说,上代码:
def getSex(self):
counts = dict()
wc_friends = pd.DataFrame(self.friends)
sex = wc_friends.Sex
sex_list = []
for i in sex:
sex_list.append(i)
sex_item = set(sex)
for s in sex_item:
counts[s] = sex_list.count(s)
return counts
# print(Counter(sex))
def plot_sex(self):
counts = self.getSex()
# x_label = ['ubnknow', 'male', 'female']
x_label = ['0', '1', '2']
y_label = []
for i in counts:
# x_label.append(i)
y_label.append(counts[i])
plt.xticks((0,1,2),("unknow", "male", "female"))
# plt.bar(range(len(y_label)), y_label, width='0.35', tick_label = x_label, color = 'rgb')
plt.bar(range(len(y_label)), y_label, width=0.7, color = 'byg')
plt.xlabel("sex")
plt.ylabel('number')
plt.title('sex analysis')
# plt.xlabel(u"性别", fontproperties=font)
# plt.ylabel(u'数目', fontproperties=font)
# plt.title(u'性别分布', fontproperties=font)
for a,b in zip(x_label, y_label):
plt.text(a, b, '%.0f'%b, ha= 'center', va='bottom',fontsize = 7)
plt.show()
这块是对性别的一个分析,用matplotlib画图得到如下:
我是很想知道那21个是不是可男可女的?好可怕我竟然有这么多奇怪的好友,男生190,女生129,还不错,争取今年结束时女生数可以超过男生数(逃。
接下来是对好友地域的分析,代码如下:
def get_province(self):
provinces_pd = pd.DataFrame(self.friends).Province
provinces_only = set(provinces_pd)
provinces_counts = dict()
provinces_numbers = []
for i in provinces_pd:
provinces_numbers.append(i)
for j in provinces_only:
provinces_counts[j] = provinces_numbers.count(j)
return provinces_counts
def plot_province(self):
counts = self.get_province()
# python3里面object.keys()返回的不是一个可定位的集合,所以要用list转换
keys = list(counts.keys())
# print(type(keys))
counts_split_space = dict()
for k in keys[1:len(counts)]:
counts_split_space[k] = counts[k]
#这里是reverse,不是reversed
counts_sorted = sorted(counts_split_space.items(), key= lambda d: d[1], reverse=True)
provinces_name = []
provinces_number = []
print(type(counts_sorted))
for i in counts_sorted[:10]:
provinces_name.append(i[0])
provinces_number.append(i[1])
# print(provinces_name)
# print(provinces_number)
colors = ['red', 'yellow', 'blue', 'green']
explode = (0.05,0,0,0,0,0,0,0,0,0)
plt.pie(provinces_number, explode = explode, labels= provinces_name, colors= colors, labeldistance=1.1,
autopct='%3.0f%%', shadow=False, startangle=90, pctdistance= 0.8)
plt.axis('equal')
# plt.legend(loc='upper left', bbox_to_anchor=(-0.1, 1))
plt.grid()
plt.show()
解释一下,因为地域中来自“火星”的好友比较一些,有些地域基本上个数就是一个,还有大概50多位好友在地域这一栏是选择空的,基于以上两点,刨去了地域为空以及地域分布人数极少的地域,选取了人数排名前十位的地域,分析如下:
有没有猜出我的家乡在哪,哈哈哈
最后是对签名一个词云分析,代码如下:
def get_whatsup(self):
signatures = pd.DataFrame(self.friends).Signature
regex1 = re.compile('<span.*?</span>')
# 匹配两个以上占位符。
regex2 = re.compile('\s{2,}')
# 用一个空格替换表情和多个空格。
signatures = [regex2.sub(' ', regex1.sub('', signature, re.S)) for signature in signatures]
while '' in signatures:
signatures.remove('')
print(signatures)
text = ''.join(signatures)
wordlist = jieba.cut(text, cut_all=True)
word_space_split = ' '.join(wordlist)
background_Image = plt.imread('test.jpg')
wc = WordCloud(background_color='white', # 设置背景颜色
mask=background_Image, # 设置背景图片
max_words=2000, # 设置最大现实的字数
font_path='STFANGSO.ttf',
# font_path='font2.ttf',
stopwords=STOPWORDS, # 设置停用词
max_font_size=50, # 设置字体最大值
random_state=30, # 设置有多少种随机生成状态,即有多少种配色方案
)
wc.generate(word_space_split)
image_colors = ImageColorGenerator(background_Image)
wc.recolor(color_func=image_colors)
plt.imshow(wc)
plt.axis('off')
plt.show()
通过做出词云图,我发现我的好友好多神经病啊,扑鼻而来的“哈哈哈”,真是猝不及防…
好了,以上就是微信好友的一个大致分析,代码简单,乐趣还是多多。
有交流学习的可以找我噢:1132274748(微信号)。