數據分析之微信好友

  • 2019 年 10 月 5 日
  • 筆記

從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('1fd+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)  

結果展示

這裡只放一個結果圖,其餘的自己來動手~~~

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