【python】微信朋友圈分析

朋友圈分析

一直就认为python很酷,所以就看到网友使用python来分析一个朋友圈所以博主也就来学习一下下

说明

如果需要没有的包,通常可以在命令窗口下pip install 包名下载

重点奥!!!

此次学习过程中代码中要了解的甚多具体如下
1:python之lambda表达式了解
2:itchat了解_01
3:itchat了解_02
4:pandas.DataFrame
5:zip()函数
6:pop()
7:pyecharts的使用
8:python调用echart交互式可视化
9:绘图
10:Python中安装腾讯优图(TencentYoutuyun)获取
11:snownlp和jieba对比
12:使用Python的SnowNLP模块实现情感分析
13: 迭代器(Iterator)和生成器(Generate)
14:python bar函数
15:Python解决使用 plt.savefig 保存图片时一片空白
16:wordcloud的基本使用
以上16个链接大体是博主在了解代码的过程中遇到的不懂或者不明确!!!


好嘛开始进入代码人生,了解其产生的美妙的结果奥!!!

01 微信个性签名分析

1:代码

# coding=utf-8
"""
@author: jiajiknag
程序功能: 微信个性签名分析
"""
# 导包
# itchat实现微信个人号接口,itchat是一个开源的微信个人号接口。
import itchat
import numpy as np
import os
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']#绘图时可以显示中文
plt.rcParams['axes.unicode_minus']=False#绘图时可以显示中文
# 词云
from wordcloud import WordCloud,STOPWORDS,ImageColorGenerator
# PTL图像处理的库
from PIL import Image
import time
# 正则表达式库
import re
# 文本分析库
import snownlp
# 结巴分词
import jieba
import jieba.analyse

def fun_analyse_Signature(friends):
    # 个性签名分析
    signatures = ''
    # 定义一个空列表
    emotions = []
    # 遍历freinds
    for friend in friends:
        signature = friend['Signature']
        # 如果不为空
        if signature != None:
            # 去除无关数据:空格,表情等等
            signature = signature.strip().replace("span","").replace("class","").replace("emoji","")
            signature = re.sub(r'1f(\d.+)',"",signature)
        # 如果存在个性签名
        if len(signature) > 0:
            # SnowNLP是一个python写的类库,可以方便的处理中文文本内容:这里就是处理个性签名
            nlp = snownlp.SnowNLP(signature)
            # 添加权值
            emotions.append(nlp.sentiments)#nlp.sentiments:权值
            # 关键字提取
            signatures += " ".join(jieba.analyse.extract_tags(signature,5))
    back_coloring = np.array(Image.open("jjk.jpg"))#图片可替换
    # 设置词云样式
    word_cloud2 = WordCloud(font_path = 'simkai.ttf',# 为中文设置的字体
                         background_color = 'white',# 设置背景颜色
                         max_words = 1200,# 设置最大实现的字数
                         mask = back_coloring,# 设置背景颜色
                         margin = 15)
    # 生成器generate()执行signatures
    word_cloud2.generate(signatures)
    # 开始加载文本
    # 改变字体颜色
    image_colors = ImageColorGenerator(back_coloring)
    # 创建图
    plt.figure(figsize=(8,5),dpi=160)
    # 显示词云图
    plt.imshow(word_cloud2.recolor(color_func=image_colors))
    # 是否显示x轴、y轴下标
    plt.axis("off")
    plt.show()
    # 保存
    word_cloud2.to_file("signatures.jpg")
    print("个性签名生成词云成功")

    # lambda表达式
    count_positive = len(list(filter(lambda x:x>0.66,emotions)))#大于0.66为积极
    count_negative = len(list(filter(lambda x:x<0.33,emotions)))#小于0.33为消极
    count_neutral = len(list(filter(lambda x:x>=0.33 and x <= 0.66,emotions)))
    # 创建一个列表
    labels = [u'积极',u'中性',u'消极']
    values =(count_positive,count_neutral,count_negative)
    # #绘图时可以显示中文
    plt.rcParams['font.sans-serif'] = ['simHei']
    plt.rcParams['axes.unicode_minus'] = False
    # X轴
    plt.xlabel("情感判断")
    # y轴
    plt.ylabel("频数")
    # 设置x轴的值域
    plt.xticks(range(3),labels)
    # 添加图例
    plt.legend(loc='upper right')
    #绘制柱形图
    plt.bar(range(3),values,color='rgb')
    # 标题
    plt.title(u'%s的微信好友签名信息情感分析情况' % friends[0]['NickName'])
    plt.savefig("情感分析柱状图.jpg")
    plt.show()
    print("情感分析柱状图分析完成!!!")


if __name__=="__main__":
    # 在登陆的时候使用命令行显示二维码,也就是运行程序会生成一个微信二维码奥
    # 且即使程序关闭,一定时间内重新开启也可以不用重新扫码。
    itchat.auto_login(hotReload=True)
    # 好友搜索
    friends = itchat.get_friends(update=True)
    # 调用函数
    fun_analyse_Signature(friends)

2:结果

这里写图片描述
这里写图片描述

02 微信好友性别分析

1:代码

# coding=utf-8
"""
@author: jiajiknag
程序功能: 性别分析
"""
import itchat
import numpy as np
import os
from collections import Counter
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']#绘图时可以显示中文
plt.rcParams['axes.unicode_minus']=False#绘图时可以显示中文
import TencentYoutuyun
from wordcloud import WordCloud,STOPWORDS,ImageColorGenerator
from PIL import Image
import time
import re
import snownlp
import jieba
import jieba.analyse
import pandas as pd


def fun_analyse_sex(friends):
    sexs = list(map(lambda x:x['Sex'],friends[1:]))#收集性别数据
    counts = list(map(lambda x:x[1],Counter(sexs).items()))#统计不同性别的数量
    counts = sorted(counts)
    labels = ['保密','男','女']#2:女,1:男,0:保密
    colors = ['red','yellow','blue']
    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 left')#标签位置
    plt.title(u'%s的微信好友性别比例' % friends[0]['NickName'])
    plt.show()
print("性别分析完成!!!")

if __name__=="__main__":
    # 在登陆的时候使用命令行显示二维码,也就是运行程序会生成一个微信二维码奥
    # 且即使程序关闭,一定时间内重新开启也可以不用重新扫码。
    itchat.auto_login(hotReload=True)
    # 好友搜索
    friends = itchat.get_friends(update=True)
    # 调用函数
    fun_analyse_sex(friends)

2:结果
这里写图片描述

03 杂记(好友分布,性别比例,具体城市分布)

1:代码

# coding=utf-8
"""
@author: jiajiknag
程序功能:   Python分析微信朋友圈脚本
"""
# 导包
# itchat实现微信个人号接口,itchat是一个开源的微信个人号接口。
import itchat
# pandas是进行数据分析
import pandas as pd
# 从pyecharts包到导入Pie, Map, Style, Page, Bar函数,而pyecharts是绘制数据地图的。
# Pie(饼图),Map(地图) ,Bar(柱状图/条形图),Page类(同一网页按顺序展示多图)
from pyecharts import Pie, Map, Style, Page, Bar
import snownlp
import re
import jieba
import jieba.analyse
from wordcloud import WordCloud,STOPWORDS,ImageColorGenerator
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt


# 01
# 根据key值得到对应的信息
def get_key_info(friends_info, key):
    # map()返回的是一个列表
    # lambda是一个表达式,简单的来说friend_info赋值,friend_info.get(key)执行,friends_info显示结果。具体参考:
    return list(map(lambda friend_info: friend_info.get(key), friends_info))

# 02
# 获得所需的微信好友信息
def get_friends_info():
    # 在登陆的时候使用命令行显示二维码,也就是运行程序会生成一个微信二维码奥
    # 且即使程序关闭,一定时间内重新开启也可以不用重新扫码。
    itchat.auto_login(hotReload=True)
    # 好友搜索
    friends = itchat.get_friends()
    # 字典
    # 字典中然后调用函数get_key_info()获取相应信息
    friends_info = dict(
        # 省份
        province = get_key_info(friends, "Province"),
        # 城市
        city = get_key_info(friends, "City"),
        # 昵称
        nickname = get_key_info(friends, "Nickname"),
        # 性别
        sex = get_key_info(friends, "Sex"),
        # 签名
        signature = get_key_info(friends, "Signature"),
        # 备注
        remarkname = get_key_info(friends, "RemarkName"),
        # 用户名拼音全拼
        pyquanpin = get_key_info(friends, "PYQuanPin")
    )
    # 以变量friend_info返回字典获取的值。
    return friends_info

# 03
# 性别分析
def analysisSex():
    #调用函数get_friens_info()--03
    friends_info = get_friends_info()
    # 二维大小可变,具有标记轴(行和列)的潜在异构表格数据结构。算术运算在行和列标签上对齐。
    # 可以认为是Series对象的一个​​类似字典的容器。主要熊猫数据结构。
    df = pd.DataFrame(friends_info)
    # groupby([by,axis,level,as_index,sort,...])
    # 使用映射器的组系列(dict或key函数,将给定函数应用于组,将结果作为系列返回)或由一系列列组成。
    # count()用于统计某个字符出现的次数
    sex_count = df.groupby(['sex'], as_index=True)['sex'].count()
    # 一个zip对象,其内部元素为元组;可以转化为列表或元组;
    # list(sex_count.index), list(sex_count))分别对应的行和列
    temp = dict(zip(list(sex_count.index), list(sex_count)))
    # 创建一个空字典
    data = {}
    # 给字典data添加数据
    # pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值。
    data['保密'] = temp.pop(0)
    data['男'] = temp.pop(1)
    data['女'] = temp.pop(2)
    # 画图
    # Page:同一网页按顺序展示多图
    page = Page()
    attr, value = data.keys(), data.values()
    chart = Pie('Jjk微信好友性别比')
    chart.add('', attr, value, center=[50, 50],
              redius=[30, 70], is_label_show=True, legend_orient='horizontal', legend_pos='center',
              legend_top='bottom', is_area_show=True)
    # 添加图表
    page.add(chart)
    # 使用render()渲染生成html文件
    page.render('性别分析.html')

# 04
# 省份分析
def analysisProvince():
    # 调用函数get_friens_info() - -03
    friends_info = get_friends_info()
    # 二维大小可变,具有标记轴(行和列)的潜在异构表格数据结构。算术运算在行和列标签上对齐。
    # 可以认为是Series对象的一个​​类似字典的容器。主要熊猫数据结构。
    df = pd.DataFrame(friends_info)
    # groupby([by,axis,level,as_index,sort,...])
    # 使用映射器的组系列(dict或key函数,将给定函数应用于组,将结果作为系列返回)或由一系列列组成。
    # count()用于统计某个字符出现的次数
    # sort_values()按任一轴的值排序
    province_count = df.groupby('province', as_index=True)['province'].count().sort_values()
    temp = list(map(lambda x: x if x != '' else '未知', list(province_count.index)))
    # 画图
    page = Page()
    # 设置宽度和高度
    style = Style(width=1100, height=600)
    style_middle = Style(width=600, height=500)
    attr, value = temp, list(province_count)
    chart1 = Map('Jjk好友分布(中国地图)', title_pos="center",width=1000,height=500)
    chart1.add('', attr, value, is_label_show=True, is_visualmap=True, visual_text_color='#000',visual_range=[0,120])

    page.add(chart1)
    chart2 = Bar('Jjk好友分布柱状图', **style_middle.init_style)
    chart2.add('', attr, value, is_stack=True, is_convert=True,label_pos='inside', is_legend_show=True, is_label_show=True)
    page.add(chart2)
    page.render('省份分析.html')

# 05
# 具体省份(城市)分析
def analysisCity(province):
    friends_info = get_friends_info()
    df = pd.DataFrame(friends_info)
    temp1 = df.query('province == "%s"' % province)
    city_count = temp1.groupby('city', as_index=True)['city'].count().sort_values()
    attr = list(map(lambda x: '%s市' % x if x != '' else '未知', list(city_count.index)))
    value = list(city_count)
    # 画图
    # 图形的宽度和高度
    page = Page()
    style = Style(width=1000, height=600)
    style_middle = Style(width=700, height=500)
    # 调用Map()函数
    chart1 = Map('%s好友分布' % province, **style.init_style)
    chart1.add('', attr, value, maptype='%s' % province, is_label_show=True,
               is_visualmap=True, visual_text_color='#000')
    # 添加好友分布图表chart1
    page.add(chart1)
    chart2 = Bar('%s好友分布柱状图' % province, **style_middle.init_style)
    chart2.add('', attr, value, is_stack=True, is_convert=True, label_pos='inside', is_label_show=True)
    page.add(chart2)
    page.render('具体省份(城市)分析.html')

# 06
# 好友签名分析

if __name__ == '__main__':
    """调用函数执行代码"""
    # 性别分析函数
    analysisSex()
    # 省份分析函数
    analysisProvince()
    # 具体城市分析
    analysisCity("甘肃")
    # 好友个性签名

2:结果
这里写图片描述

猜你喜欢

转载自blog.csdn.net/jiajikang_jjk/article/details/80567962