此小項目參考《微信好友數據分析 》——余本國
一、功能介紹:
三、運行環境及相關庫的安裝
- Python 3.x(使用Anaconda的spyder編輯器)
- 使用到的Python庫安裝:
- 在Anaconda的Anaconda Prompt下運行下列命令,安裝前先升級pip,代碼如下:
Python -m pip install --upgrade pip
- 安裝 wxpy: pip install wxpy
-
安裝 PIL: pip install pillow
-
安裝 pyecharts:pip install pyecharts
-
安裝 Itchat: pip install itchat
-
安裝 Jieba: pip install jieba
-
安裝 Pandas:pip install Pandas
- 安裝 Numpy:pip install Numpy
- 安裝 wordcloud:pip install wordcloud
- 安裝地圖數據包:pip install echarts-china-provinces-pypkg
- pip install echarts-countries-pypkg
四、如何運行?(初次運行可以使用spyder的IPython console進行交互式輸入)
以上庫安裝好了以后就可進行以下步驟coding
1.登錄——獲取用戶信息:
打開spyder的IPython console 進行交互式編寫
In [3]: from wxpy import * #導入模塊 In [4]: bot=Bot(cache_path=True)#初始化機器人,選擇緩存模式(掃碼)登錄 Getting uuid of QR code. Downloading QR code. Please scan the QR code to log in. Please press confirm on your phone. Loading the contact, this may take a little while. Login successfully as 舒心陳 In [5]: friend_all=bot.friends() In [6]: print(friend_all[0].raw)#friend_all[0]是你的微信昵稱,.raw則是獲取你的全部信息 {'UserName': '@616bbbd522bbfce0dcad9082de7100b2548b9d8c54f466933fe26ce46f4eb80c', 'City': '', 'DisplayName': '', 'PYQuanPin': '', 'RemarkPYInitial': '', 'Province': '', 'KeyWord': '', 'RemarkName': '', 'PYInitial': '', 'EncryChatRoomId': '', 'Alias': '', 'Signature': '好開心啊~', 'NickName': '舒心陳', 'RemarkPYQuanPin': '', 'HeadImgUrl': '/cgi-bin/mmwebwx-bin/webwxgeticon?seq=879163398&username=@616bbbd522bbfce0dcad9082de7100b2548b9d8c54f466933fe26ce46f4eb80c&skey=@crypt_6e5fb2f2_41b8311b5e5bb5ea58c12688ff48ccf9', 'UniFriend': 0, 'Sex': 1, 'AppAccountFlag': 0, 'VerifyFlag': 0, 'ChatRoomId': 0, 'HideInputBarFlag': 0, 'AttrStatus': 0, 'SnsFlag': 1, 'MemberCount': 0, 'OwnerUin': 0, 'ContactFlag': 0, 'Uin': 3129189532, 'StarFriend': 0, 'Statues': 0, 'MemberList': [], 'WebWxPluginSwitch': 0, 'HeadImgFlag': 1}
2、統計用戶信息
In [7]: len(friend_all) #統計查閱了多少好友 Out[7]: 173
lis=[] for a_friend in friend_all: NickName = a_friend.raw.get('NickName',None) #Sex = a_friend.raw.get('Sex',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=[ ]在一下存儲數據如Excel時會使得表格缺少列標題行,在此我建議將lis=[ ]改為如下:
lis=[['NickName','Sex','City','Province','Signature','HeadImgUrl',\ 'HeadImgFlag']]
def lis2e19(filename,lis): ''' 將列表寫入 07 版 excel 中,其中列表中的元素是列表. filename:保存的文件名(含路徑) lis:元素為列表的列表,如下: lis = [["名稱", "價格", "出版社", "語言"], ["暗時間", "32.4", "人民郵電出版社", "中文"], ["拆掉思維里的牆", "26.7", "機械工業出版社", "中文"]] ''' import openpyxl wb = openpyxl.Workbook() sheet = wb.active sheet.title = 'list2excel19' file_name = filename for i in range(0, len(lis)): for j in range(0, len(lis[i])): sheet.cell(row=i+1, column=j+1, value=str(lis[i][j])) wb.save(file_name) print("寫入數據成功!") lis2e19(r'C:\Users\Benny\Desktop\Python\Python練習\wechat_02.xlsx',lis)
lis2e19(r'C:\Users\Benny\Desktop\Python\Python練習\wechat_02.xlsx',lis)
打開文件(部分截圖):
4. 對數據進行初略的認知分析。
#對數據進行初步探索 #方法一 #粗略獲取好友的統計信息 data = friend_all.stats_text(total=True, sex=True,top_provinces=10, top_cities=100) from pandas import read_excel df=read_excel(r'C:\Users\Benny\Desktop\Python\Python練習\wechat_02.xlsx',sheetname='list2excel19')
print(data)
部分數據截圖如下:
5. 現在手動為上述表格插入一個列標題行:如:
6. 然后我們可以方便的進行如下編寫:(注意,此部分由於需要手動插入列標題行,所以一下程序應與上述程序分開執行,或者上述代碼中使得 lis=['nickname','sex','city','province','headImgUrl','headImgFlag']
]is
In[10]from pandas import read_excel df = read_excel('yubg1.xlsx',sheetname='list2excel19') df.tail(5) #輸出表格最后5行 Out[11]: 舒心陳 ... 1 169 鹿森丶 ... None 170 琳達大大 ... None 171 Coy lin ... None 172 A ... None 173 孟小傲 ... None
print(df.city.count()) print(df.city.describe())
結果:
nickname ... Unnamed: 6 170 鹿森丶 ... None 171 琳達大大 ... None 172 Coy lin ... None 173 A ... None 174 孟小傲 ... None [5 rows x 7 columns] 114 count 114 unique 39 top 中山 freq 32 Name: city, dtype: object
6. 對 city 列數據做成詞雲
from wordcloud import WordCloud import matplotlib.pyplot as plt import pandas as pd from pandas import DataFrame word_list= df['city'].fillna('0').tolist()#將 dataframe 的列轉化為 list,其中的 nan 用“0”替換 new_text = ' '.join(word_list) wordcloud = WordCloud(font_path='simhei.ttf', background_color="black").generate(new_text) plt.imshow(wordcloud) plt.axis("off") plt.show()
圖片:
pip install wheel
pip install pyecharts==0.1.9.4
運行完成上述代碼后:
#利用 pyecharm 做詞雲 import pandas as pd #count = df.city.value_counts() #對 dataframe 進行全頻率統計,排除了 nan city_list = df['city'].fillna('NAN').tolist() #將 dataframe 的列轉化為 list,其中的 nan 用“NAN”替換 count_city = pd.value_counts(city_list)#對 list 進行全頻率統計 from pyecharts import WordCloud 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'C:\Users\Benny\Desktop\Python\map1.html')
圖片如下:(已經過水印處理)
#將這些個好友在全國地圖上做分布 province_list = df['province'].fillna('NAN').tolist() #將 dataframe 的列轉化為 list,其中的 nan 用“NAN”替換 count_province = pd.value_counts(province_list)#對 list 進行全頻率統計 from pyecharts import Map value =count_province.tolist() attr =count_province.index.tolist() map=Map("各省微信好友分布", width=1200, height=600) map.add("", attr, value, maptype='china', is_visualmap=True, visual_text_color='#000', is_label_show = True) #顯示地圖上的省份 map.show_config() map.render(r'C:\Users\Benny\Desktop\Python\map3.html')
圖片如下:(已經過水印處理)
五、全部代碼:
一、環境與庫准備:
Anaconda Prompt下運行:
Python -m pip install --upgrade pip pip install wxpy pip install pillow pip install pyecharts pip install itchat pip install jieba pip install Pandas install Numpy pip install wordcloud pip install echarts-china-provinces-pypkg pip install echarts-countries-pypkg pip install wheel pip install pyecharts==0.1.9.4
完整代碼:
# -*- coding: utf-8 -*- """ Created on Tue Jun 4 22:21:18 2019 @author: Benny """ from wxpy import * import openpyxl import pandas as pd from wordcloud import WordCloud import matplotlib.pyplot as plt from pyecharts import Map #from pyecharts import WordCloud def alldata_connect_in(): ''' 連接網頁版微信並返回所有朋友信息 bot:初始化機器人並選擇緩存模式(掃碼)登錄 friend_all:獲取我所有微信好友信息 ''' bot=Bot(cache_path=True) friend_all=bot.friends() return friend_all def analyse_friends(friend_all,top_provinces=10,top_cities=100): Friends = friend_all data = Friends.stats_text(total=True, sex=True,top_provinces=30, top_cities=500) print(data) def insert_column_title(lis=[]): '''輸入並列標題行 ls=[] 默認為無 ''' column_titles=[] column_titles.append(lis) return colomn_titles def data_dict_to_list(friend_all): ''' data_ls:初值:設列表初值為包含列標題行列表的列表\ 遍歷所有好友信息字典提取數據加入到數據列表,並返回此數據列表 list_0:一個微信好友的數據列表,包括'NickName','Sex','City','Province',\ 'Signature','HeadImgUrl','HeadImgFlag'. ''' data_lis=[['NickName','Sex','City','Province','Signature','HeadImgUrl',\ 'HeadImgFlag']] for a_friend in friend_all: NickName = a_friend.raw.get('NickName',None) #Sex = a_friend.raw.get('Sex',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] data_lis.append(list_0) return data_lis def data_lis_savein_excel(data_lis=[],filename='wechat_data',\ sheet_title='wechat1'): ''' 將列表寫入 07 版 excel 中,其中列表中的元素是列表. filename:保存的文件名(含路徑) lis:元素為列表的列表,如下: lis = [["名稱", "價格", "出版社", "語言"], ["暗時間", "32.4", "人民郵電出版社", "中文"], ["拆掉思維里的牆", "26.7", "機械工業出版社", "中文"]] ''' wb = openpyxl.Workbook() sheet = wb.active sheet.title =sheet_title file_name = filename +'.xlsx' for i in range(0, len(data_lis)): for j in range(0, len(data_lis[i])): sheet.cell(row=i+1, column=j+1, value=str(data_lis[i][j])) wb.save(file_name) return file_name print("寫入數據成功!") def count_sing(file_name,sheet_name='wechat1',column_name='NickName'): '''輸出單個列的統計數據''' f=open(file_name,'rb') data=pd.read_excel(f,sheetname=sheet_name) print(column_name+'\t'+str(data[column_name].count())) print(data[column_name].describe()) f.close() def wordcloud_show(file_name,sheet_name='wechat1',column_name='City'): '''用 plt+wordcloud 方法得到詞雲圖''' f=open(file_name,'rb') data=pd.read_excel(f,sheetname=sheet_name) word_list= data[column_name].fillna('0').tolist() #將 dataframe 的列轉化為 list,其中的 nan 用“0”替換 new_text = ' '.join(word_list) wordcloud = WordCloud(font_path='simhei.ttf', \ background_color="black").generate(new_text) plt.imshow(wordcloud) plt.axis("off") plt.show() f.close() def save_wordcloud_to_html(save_road,file_name,sheet_name='wechat1',\ column_name='City'): '''利用 pyecharm 做詞雲並存為html文件''' f=open(file_name,'rb') data=pd.read_excel(f,sheetname=sheet_name) #count = df.city.value_counts() #對 dataframe 進行全頻率統計,排除了 nan city_list = data[column_name].fillna('NAN').tolist() #將 dataframe 的列轉化為 list,其中的 nan 用“NAN”替換 count_city = pd.value_counts(city_list)#對 list 進行全頻率統計 name = count_city.index.tolist() value = count_city.tolist() from pyecharts import WordCloud wordcloud = WordCloud(width=1300, height=620) wordcloud.add("", name, value, word_size_range=[20, 100]) wordcloud.show_config() wordcloud.render(save_road+'.html') f.close() def show_data_in_countrymap(save_road,file_name,sheet_name='wechat1',\ column_name='Province'): '''將這些個好友在全國地圖上做分布''' f=open(file_name,'rb') data=pd.read_excel(f,sheetname=sheet_name) province_list = data[column_name].fillna('NAN').tolist() #將 dataframe 的列轉化為 list,其中的 nan 用“NAN”替換 count_province = pd.value_counts(province_list)#對 list 進行全頻率統計 value =count_province.tolist() attr =count_province.index.tolist() map=Map("各省微信好友分布", width=1200, height=600) map.add("", attr, value, maptype='china', is_visualmap=True, visual_text_color='#000', is_label_show=True) #顯示地圖上的省份 map.show_config() map.render(save_road+'map2'+'.html') f.close() def main(): friends_data=alldata_connect_in() data_ls=data_dict_to_list(friends_data) file_name=data_lis_savein_excel(data_ls) analyse_friends(friends_data) count_sing(file_name) wordcloud_show(file_name) save_road=r'C:\Users\Benny\Desktop\Python\wechat_01_statlist\picture' save_wordcloud_to_html(save_road,file_name) show_data_in_countrymap(save_road,file_name) main()
對於學習過程中的的出現地錯誤與解決辦法和疑問:
問題1:
不能從pyecharts庫中導入模塊,如WordCloud Bar等
解決辦法:
在運行環境的命令行運行(Anaconda Prompt):
pip install wheel
pip install pyecharts==0.1.9.4
注意!:運行上述命令后要將spyder的console重啟!!否則依舊會出現同樣的問題!!
問題2:
在完全代碼中我將lis列表賦初值為列標題行,這使得在對Excel表格進行詞雲分析時可用列標題行進行索引,如果不加,會由於Excel表格首行某列中為空而無法索引!!
問題3:
完全代碼中我在某個函數中進行模塊的引入,但當我將此模塊放到完全代碼前引用時,出現了如下錯誤:(而在函數內引用卻沒有報錯)
super(WordCloud, self).__init__(title, subtitle, **kwargs) TypeError: __init__() got an unexpected keyword argument 'font_path'
解決辦法:還么有。