• 微信好友分析


    一.环境要求

    Windows 10;python 3.7;

    第三方库

    wxpy 0.3.9.8——登录微信
    openpyxl 2.6.2——可对 excel 表格进行操作

    pyecharts 0.5.11——百度的开源可视化库,

    wordcloud 1.5.0——词云制作库

    matplotlib 3.1.0——生成词云图

    pandas 0.24.2——读取 excel 表格的数据

    pyecharts-snapshot 0.2.0——是 pyecharts 的依赖库之一

    echarts-countries-pypkg——pyecharts 的世界地图包

    echarts-china-provinces-pypkg——pyecharts 的中国省份地图包

    第三方库的安装

    (2019年6月10号)除了 pyecharts 其它都可以直接使用 pip 安装,而安装 pycharts 需要特殊些(因为最新版已出为 1.X版,不向下兼容),如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    pip install wxpy
    pip install openpyxl
    pip install PIL
    pip install pandas
    pip install wordcloud
     
    pip install pyecharts==0.5.11
    pip install echarts-countries-pypkg
    pip install echarts-china-provinces-pypkg
    pip install pyecharts-snapshot

      

    二.分析思路

     1.登录微信,获取好友的基本信息

    使用 wxpy 的 Bot() 模块,登录微信

    复制代码
    from wxpy import *
    
    bot = Bot(cache_path = True)
    
    #获取全部好友的信息
    friend_all = bot.friends()
    
    #输出 friend_all 看一下
    print(friend_all)

    #输出好友数量
    #print(len(friend_all))
    复制代码

    输出结果为

    2.把好友信息存为更易处理的二维列表

    复制代码
    #建立一个二维列表,存储基本好友信息
    lis = [['NickName','Sex','City','Province','Signature','HeadImgUrl','HeadImgFlag']]
    #把好有特征数据保存为列表
    for a_friend in friend_all:
        #遍历 friend_all, 并使用 raw.get(' ', None), 来获取每一各朋友的基本信息
        NickName = a_friend.raw.get('NickName', None)
        Sex = {1:"男", 2:"女", 0:"其它"}.get(a_friend.raw.get('Sex', None), None)
        City = a_friend.raw.get('City', None)
        Province = a_friend.raw.get('Province', None)
        Signature = a_friend.raw.get('Signature', None)
        HeadImgUrl = a_friend.raw.get('HeadImgUrl', None)
        HeadImgFlag = a_friend.raw.get('HeadImgFlag', None)
        list_0 = [NickName, Sex, City, Province, Signature, HeadImgUrl, HeadImgFlag]
        lis.append(list_0)
    复制代码

    输出 lis 

    3.把列表存为 excel 表格,方便本地查看

    复制代码
    #把列表转换为 xlsx 表格
    def list_to_xlsx(filename, list):
        
        import openpyxl
      #新建一个表格 wb = openpyxl.Workbook() sheet = wb.active sheet.title = 'Friends' file_name = filename + '.xlsx' for i in range(0, len(list)): for j in range(0, len(list[i])): sheet.cell(row = i+1, column = j+1, value = str(list[i][j])) wb.save(file_name) print("读写数据成功") #把列表生成表格 list_to_xlsx('wechat_friend', lis)
    复制代码

     生成的表格为

    4.对 execl 表格进行处理,利用表格信息生成词云

    复制代码
    from wordcloud import WordCloud
    import matplotlib.pyplot as plt
    import pandas as pd
    from pandas import read_excel
    
    df = read_excel('wechat_friend.xlsx')
    
    #使用 WordCloud 生成词云
    word_list = df['City'].fillna('').tolist()
    new_text = ' '.join(word_list)
    wordcloud = WordCloud(font_path='msyh.ttc', background_color = 'white').generate(new_text)
    plt.imshow(wordcloud)
    plt.axis("off")
    plt.show()
    plt.savefig("WordCloud.png")
    print("保存词云图")
    复制代码

    词云图展示

     

    5.利用表格信息生成网页词云图(即HTML)

    复制代码
    #使用 pyecharts 生成词云
    from pyecharts import WordCloud
    
    city_list = df['City'].fillna('').tolist()
    count_city = pd.value_counts(city_list)
    name = count_city.index.tolist()
    value = count_city.tolist()
    
    wordcloud = WordCloud(width=1300,height=620)
    wordcloud.add("",name,value,word_size_range=[20,100])
    #wordcloud.show_config()
    #wordcloud.render(r'D:wc.html')
    wordcloud.render('wordcloud.html')
    print("网页词云图已生成")
    复制代码

     词云图展示

     

    6.利用表格信息生成好友地图分布图

    复制代码
    #将好友展示在地图上 
    from pyecharts import Map
    
    province_list = df['Province'].fillna('').tolist()
    count_province = pd.value_counts(province_list)
    attr = count_province.index.tolist()
    value1 = count_province.tolist()
    map = Map("各省微信好友分布", width=1200,height=600)
    map.add("",attr, value1, maptype='china',is_visualmap=True,visualmap_text_color='#000',is_label_show=True)
    #map.show_config()
    map.render('map.html')
    print("map已生成")
    复制代码

    微信好友分布图展示

    三.最后代码汇总

     把上面的代码,规范一下,可得——

    复制代码
    # -*- coding: utf-8 -*-
    """
    Created on Mon Jun  3 10:01:35 2019
    
    @author: haiwe
    """
    #获取微信接口 
    from wxpy import *
    
    #把获取的微信好友信息存为列表 
    def wx_friend_information(friend_all):
        
        #先生成一个二维列表,用来储存好友信息 
        lis = [['NickName','Sex','City','Province','Signature','HeadImgUrl','HeadImgFlag']]
        #遍历 friend_all, 并使用 raw.get(' ', None), 来获取每一各朋友的基本信息 
        for a_friend in friend_all:
            NickName = a_friend.raw.get('NickName', None)
            Sex = {1:"男", 2:"女", 0:"其它"}.get(a_friend.raw.get('Sex', None), None)
            City = a_friend.raw.get('City', None)
            Province = a_friend.raw.get('Province', None)
            Signature = a_friend.raw.get('Signature', None)
            HeadImgUrl = a_friend.raw.get('HeadImgUrl', None)
            HeadImgFlag = a_friend.raw.get('HeadImgFlag', None)
            list_0 = [NickName, Sex, City, Province, Signature, HeadImgUrl, HeadImgFlag]
            lis.append(list_0)
            
        return lis
    
    #把列表转换为 xlsx 表格,并保存表格       
    def list_to_xlsx(filename, list):
        
        #使用 openpyxl 创建空表格 
        import openpyxl
        wb = openpyxl.Workbook()
        #获得当前正在显示的 sheet, 或 wb.get_active_sheet()  
        sheet = wb.active
        #表格的 sheet 页命名为 Friends 
        sheet.title = 'Friends'
        # execl 文件命名
        file_name = filename + '.xlsx'
        #遍历 excel 表格,并读入数据 
        for i in range(0, len(list)):
            for j in range(0, len(list[i])):
                #为什么 i+1,j+1 不懂 
                sheet.cell(row = i+1, column = j+1, value = str(list[i][j]))
        #保存表格         
        wb.save(file_name)
        print("读写数据成功")
        
    from wordcloud import WordCloud
    import matplotlib.pyplot as plt
    import pandas as pd
    #使用 pandas 的 read_excel 模块读取execl 表格
    from pandas import read_excel
    #import numpy as np
    
    #生成词云图 
    def create_wordcloud(df):
        
        #把 df(dataframe) 中城市那列中 为空的 替换为 空字符,并把替换后的城市列存在 city_list中
        word_list = df['City'].fillna('').tolist()
        #把 city_list 列表中的 各项 用空格隔开,并变为字符串 
        new_text = ' '.join(word_list)
        #设置词云图的字体为 ‘msyh.ttc', 背景为白色(默认为黑色),并用 generate() 生成词云图 
        wordcloud = WordCloud(font_path='msyh.ttc', background_color = 'white').generate(new_text)
        #展示生成的词云图 
        plt.imshow(wordcloud)
        #plt.axis("off")
        #plt.show()
        plt.savefig("WordCloud.png")
        print("保存词云图")
    
    #使用 pyecharts 生成词云    
    def create_wordcloud_html(df):
        
        #调用 pyecharts 中 wordcloud 模块
        from pyecharts import WordCloud
        
        #把 df(dataframe) 中城市那列中 为空的 替换为 空字符,并把替换后的城市列存在 city_list中 
        city_list = df['City'].fillna('').tolist()
        
        #使用 pandas.value_count() 返回 city_list 中各项和其对应的频数(两者一一对应),并存在 count_city 中  
        count_city = pd.value_counts(city_list)
        #把 count_city 中的项提取出来,并存在 name 中
        name = count_city.index.tolist()
        #把 count_city 中的频数提取出来 
        value = count_city.tolist()
        #生成词云图 
        wordcloud = WordCloud(width=1300,height=620)
        #往词云图中添加信息, 
        wordcloud.add("",name,value,word_size_range=[20,100])
        #输出词云图的配置 
        #wordcloud.show_config()
        #wordcloud.render(r'D:wc.html')
        #保存词云图 
        wordcloud.render('wordcloud.html')
        print("网页词云图已生成")
        
        
    #将好友展示在地图上
    def create_map(df):
        
        #使用 pyechart 的 Map 模块,生成网页词云图
        from pyecharts import Map
    
        #把 df(dataframe) 中省份那列中 为空的 替换为 空字符,并把替换后的城市列存在 province_list中
        province_list = df['Province'].fillna('').tolist()
        #使用 pandas.value_count() 返回 province_list 中各项和其对应的频数(两者一一对应),并存在 count_province 中
        count_province = pd.value_counts(province_list)
        #把 count_province 中的项提取出来,并存在 name 中
        attr = count_province.index.tolist()
        #把 count_province 中的频数提取出来
        value1 = count_province.tolist()
        #生成一个标题为 “ ”的空白 HTML 
        map = Map("各省微信好友分布", width=1200,height=600)
        #向空白 HTML 中添加 信息,设置地图为 中国地图,并显示地图,设置地图上文字颜色,并显示标签
        map.add("",attr, value1, maptype='china',is_visualmap=True,visualmap_text_color='#000',is_label_show=True)
        #map.show_config()
        #保存词云网页 
        map.render('map.html')
        print("map已生成")
        
        
    if __name__ == "__main__":
        
        #获取登录二维码
        bot = Bot(cache_path = True)
        
        #获取微信朋友的基本数据
        friend_all = bot.friends()
        list = wx_friend_information(friend_all)
        list_to_xlsx('wechat_friend', list)
        
        df = read_excel('wechat_friend.xlsx')
        create_wordcloud(df)
        create_wordcloud_html(df)
        create_map(df)
    复制代码
  • 相关阅读:
    洛谷 1339 最短路
    洛谷 1330 封锁阳光大学 图论 二分图染色
    洛谷 1262 间谍网络 Tarjan 图论
    洛谷 1373 dp 小a和uim之大逃离 良心题解
    洛谷 1972 莫队
    洛谷 2158 数论 打表 欧拉函数
    洛谷 1414 数论 分解因数 水题
    蒟蒻的省选复习(不如说是noip普及组复习)————连载中
    关于筛法
    关于整数划分的几类问题
  • 原文地址:https://www.cnblogs.com/hhhkm/p/10982200.html
Copyright © 2020-2023  润新知