数据分析之微信好友

640?wx_fmt=png

从0入坑微信好友分析

周六了,各位周末快乐,今日我们来一文数据分析,从0说起,一起来看pyecharts的作用以及其他相关库的使用!

1.itchat安装及使用2.pandas安装及使用    2.1DataFrame使用    2.2Series使用3.PIL使用4.功能实现5.相关问题6.作者的话

1.itchat安装及使用

# 安装
pip install itchat
# 通过如下命令登陆,即使程序关闭,一定时间内重新开启也可以不用重新扫码。该方法会生成一个静态文件 itchat.pkl ,用于存储登陆的状态
itchat.auto_login(hotReload=True)
# 导出设置
itchat.dump_login_status()

2.pandas安装及使用

# 安装
pip install pandas

2.1DataFrame使用

# DataFrame使用
DataFrame 是一个表格型的数据结构。它提供有序的列和不同类型的列值。
input:
import pandas as pd
a=pd.DataFrame()
output:
Empty DataFrame
Columns: []
Index: []
# key为列,value为值
input:
data=[{'name':'a','id':1},{'name':'b','id':2}]
da=pd.DataFrame(data)
da
output:
   id name
0   1    a
1   2    b
# columns可以指定列顺序,如果加入的列没有,则数据显示为NaN
input:
da=pd.DataFrame(data,columns=['id','name','test'])
da
output:
   id name  test
0   1    a   NaN
1   2    b   NaN
# DataFrame支持以字典索引的方式获取数据,还可以以属性的方法获取
input:
da['id']
output:
0    1
1    2
Name: id, dtype: int64
input:
da.name
output:
0    a
1    b
Name: name, dtype: object
# 取多列
input:
da[['id','name']]
output:
   id name
0   1    a
1   2    b
# 修改列的值:
input:
da.name='c'
da
output:
   id name  test
0   1    c   NaN
1   2    c   NaN
# 修改行的值:
input:
da[:1]=5
da
output:
   id name  test
0   5    5   5.0
1   2    c   NaN
# 修改某一具体数据
input:
da['name'][1]=8
output:
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
input:
da
output:
id name  test
0   5    5   5.0
1   2    8   NaN
# 虽然上述报错了,会发现结果正如我们想要的修改了相应的值,针对报错问题解决办法采用了loc
input:
da.loc[1,'name']=10
output:
id  name  test
0   5     5   5.0
1   2    10   NaN
# 删除某一列:
input:
del da['test']
da
output:
   id  name
0   5     5
1   2    10

2.2Series使用

# Series是一个一维数组对象,类似与Numpy,但又不同,Series为一个带索引的一维数组对象,将 Python 数组转换成 Series 对象
# numpy的array操作
import numpy as np
input:
np.array([1,2,3])
output:
array([1, 2, 3])
# Series操作
input:
pd.Series(['12','as'])
output:
0    12
1    as
dtype: object
# Series,先来熟悉一下DataFrame
input:
pd.DataFrame([1,2,3],index=['a','b','c'],columns=['number'])
output:
   number
a       1
b       2
c       3
# 而Series操作同上,默认index从0计数,但没有columns,不能指定列名
input:
pd.Series([121,22,32],index=[1,2,3])
output:
1    121
2     22
3     32
dtype: int64
# 取值
input:
sr[1]
output:
121
# 取多个值
input:
sr[[1,2]]
output:
1    121
2     22
dtype: int64
# 修改
input:
sr[1]=86
sr
output:
1    86
2    22
3    32
dtype: int64
# 单独获取 Series 对象的索引或者数组内容的时候,可以使用 index 和 values 属性
input:
sr.index
output:
Int64Index([1, 2, 3], dtype='int64')
input:
sr.values
output:
array([86, 22, 32], dtype=int64)
# 对Series对象运算---只改变值,不改变索引,并且sr整体也不变,只是获得一个临时对象来存储sr*2
input:
sr*2
output:
1    172
2     44
3     64
dtype: int64
input:
sr
output:
1    86
2    22
3    32
# 索引出小于60的数据
input:
sr[sr<=60]
output:
2    22
3    32
dtype: int64

3.PIL使用

# Python Imaging Library,图像处理标准库,打开一个jpg图像文件
# 打开图片
import PIL.Image as Image
coloring=Image.open("D:/pachong/weixin/qqq.jpg")



# PIL:Python Imaging Library,图像处理标准库,打开一个jpg图像文件
# numpy创建数组,临时存储打开的图片
coloring = np.array(Image.open("D:/pachong/weixin/qqq.jpg"))
my_wordcloud = WordCloud(background_color="white", max_words=2000,
                        mask=coloring, max_font_size=100, random_state=42, scale=2,
                        font_path="C:/Windows/Fonts/simkai.ttf").generate(word_space_split)
image_colors = ImageColorGenerator(coloring)
plt.imshow(my_wordcloud.recolor(color_func=image_colors))
plt.imshow(my_wordcloud)
plt.axis("off")
plt.show()

4.功能实现

导包

import itchat
from pyecharts import Pie
import re,jieba
import matplotlib.pyplot as plt
import pandas as pd
from wordcloud import WordCloud,ImageColorGenerator
import numpy as np
import PIL.Image as Image

封装前操作

# 通过如下命令登陆,即使程序关闭,一定时间内重新开启也可以不用重新扫码。该方法会生成一个静态文件 itchat.pkl ,用于存储登陆的状态
itchat.auto_login(hotReload=True)
# 导出设置
itchat.dump_login_status()
data=pd.DataFrame()
columns=['NickName', 'Sex', 'Province', 'City', 'Signature']
friends=itchat.get_friends(update=True)[:]
print(friends)
my=friends[0]

绘制男女比例饼图

# 绘制男女比例饼图
def echart_pie(friends):
    total = len(friends) - 1
    male = female = other = 0
    for friend in friends[1:]:
        sex=friend["Sex"]
        if sex==1:
            male+=1
        elif sex==2:
            female+=1
        else:
            other+=1
        attr = ["男性","女性","其他"]
        v1=[float(male) / total * 100,float(female) / total * 100,float(other) / total * 100]
        pie=Pie(my["NickName"]+"的微信好友性别比例",title_pos="center")
        pie.add("性别",attr,v1,center=[50,50],is_random=True, radius=[30, 75], rosetype='area',
                is_legend_show=False, is_label_show=True)
        # render()方法会生成一个render.html,然后在浏览器运行就出现图形
        pie.render()
echart_pie(friends)

绘制词云

def plot_cloud(columns):
    # 通过循环得到第一列索引,后面列名分别为columns的各个元素,类似于数据库表
    for col in columns:
        val = []
        for i in friends[1:]:  # friends[0]是自己的信息,因此我们要从[1:]开始
            val.append(i[col])
        data[col] = pd.Series(val)

    siglist = []
    for i in data['Signature']:
        # 正则替换---strip()去除空格,replace替换特殊字符
        signature = i.strip().replace('emoji','').replace('span','').replace('class','')
        rep = re.compile('1f\d+\w*|[<>/=]')
        signature = rep.sub('', signature)
        siglist.append(signature)
    text = ''.join(siglist)
    word_list = jieba.cut(text, cut_all=True)
    word_space_split = ' '.join(word_list)
    # PIL:Python Imaging Library,图像处理标准库,打开一个jpg图像文件
    # numpy创建数组,临时存储打开的图片
    coloring = np.array(Image.open("D:/pachong/weixin/qqq.jpg"))
    my_wordcloud = WordCloud(background_color="white", max_words=2000,
                             mask=coloring, max_font_size=100, random_state=42, scale=2,
                             font_path="C:/Windows/Fonts/simkai.ttf").generate(word_space_split)
    image_colors = ImageColorGenerator(coloring)
    plt.imshow(my_wordcloud.recolor(color_func=image_colors))
    plt.imshow(my_wordcloud)
    plt.axis("off")
    plt.show()

plot_cloud(columns)

绘制省份地图

# 绘制省份地图
# [{},{}]
# total_list=[]
# person_dict={}
from pyecharts import Map
map_province=[]
map_prodic={}
map_attr=[]
map_val=[]
def plot_location(friends):
    ## 通过循环实现将所有好友所在省份加到列表中,并且去除空字符
    for friend in friends[1:]:
        map_province.append(friend['Province'])
        while '' in map_province:
            map_province.remove('')  # 删除空字符
    # 将上述列表通过set变为字典,去重
    map_dict=set(map_province)
    # 生成一个key为省份,value为省份出现总数的字典
    for mdi in map_dict:
        map_prodic[mdi]=map_province.count(mdi)
    print(map_prodic)
    # 通过循环将上述的字典拆分为两个列表,分别围殴map_attr,map_val,用于下面pyecharts绘制图形
    for province_key in map_prodic:
        map_attr.append(province_key)
        map_val.append(map_prodic[province_key])
    print(map_attr)
    print(map_val)
    # 开始绘制
    map = Map(my["NickName"]+"的微信好友位置分布图", width=1200, height=600,title_pos='center')
    map.add("", map_attr, map_val, is_visualmap=True,visual_range=[0,120],visual_text_color='#000', is_map_symbol_show=False, is_label_show=True)
    map.render()

plot_location(friends)

数据存储

# 好友核心数据存储至Mysql
import pymysql.cursors
def save_mysql(friends):
    # 数据库链接,记得更换XXXX处为你的
    connection=pymysql.connect(host='localhost',user='XXXX',password='XXXX',db='myWeinxinData',charset='utf8mb4')
    try:
        for friend in friends[1:]:
            with connection.cursor() as cursor:
                sql = "insert into `key_Info`(`UserName`,`NickName`,`Sex`,`HeadImgUrl`,`Province`,`City`,`Signature`)values(%s,%s,%s,%s,%s,%s,%s)"
                cursor.execute(sql, (
                friend['UserName'], friend['Sex'], friend['NickName'], friend['HeadImgUrl'], friend['Province'], friend['City'],
                friend['Signature']))
                connection.commit()
    finally:
        connection.close()

# 使用就取消注释
# save_mysql(friends)

结果展示

这里只放一个结果图,其余的自己来动手~~~

640?wx_fmt=png

5.相关问题

pyecharts绘图中地图无法显示问题

缺少地图,安装即可!

# echarts-countries-pypkg 是全球国家地图
pip install echarts-countries-pypkg
# echarts-china-provinces-pypkg是中国省级地图
pip install echarts-china-provinces-pypkg
# echarts-china-cities-pypkg是中国城市地图
pip install echarts-china-cities-pypkg

6.作者的话

最后,您如果觉得本公众号对您有帮助,欢迎您多多支持,转发,谢谢!

640?wx_fmt=jpeg

我今天才知道,我之所以漂泊就是在向你靠近。

--《廊桥遗梦》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值