主要工作:
1.對從網上營業廳拿到的用戶數據.xls文件,通過Python的xlrd進行解析,計算用戶的主叫被叫次數,通話時間,通話時段。
2.使用matplotlib畫圖包,將分析的結果直觀的繪制出來。
具體步驟:
1.分析須要的內容
excel文件中包含很多信息,我們分析的時候須要用到的包括,通話起始時間、通話時長、呼叫類型,號碼。
使用xlrd模塊,讀取excel中的數據,用列表的形式保存下來。
1 #coding=utf-8 2 import xlrd 3 4 def readData(url): 5 data=xlrd.open_workbook(url) 6 table=data.sheets()[0] #多張sheet的情況讀取第一張 7 nrows=table.nrows 8 ncols=table.ncols 9 list=[] 10 for rownum in range(0,nrows): 11 row=table.row_values(rownum) 12 for i in range(0,ncols): #轉碼unicode轉utf-8 13 row[i]=row[i].encode('utf-8') 14 if row: 15 list.append(row) 16 return list
2.設計用戶數據分析類
考慮分析用戶的哪些數據,做成一個什么樣的效果
1 #coding=utf-8 2 # 用戶通話信息類記錄 3 class UserDataInfo(object): 4 def __init__(self): 5 self.calling_long = 0 #主叫時長 6 self.called_long = 0 #被叫時長 7 self.call_long = 0 #總時長 8 9 self.calling_times = 0 #主叫次數 10 self.called_times = 0 #被叫次數 11 self.call_times = 0 #總次數 12 13 self.time_intervel=[] #通話時段 14 for i in range(0,12): 15 self.time_intervel.append(0) 16 17 self.day_intervel=[] #每日通話次數 18 for i in range(0,31): 19 self.day_intervel.append(0) 20 21 self.call_freq= None #通話最頻繁
3.對時間日期字符串解碼編碼
實用split函數對字符串分割,將x時x分x秒的格式解碼成 x秒的數據存儲下來
1 #解碼時間 2 def timeDecode(timeStr): 3 hour = min = sec = 0 4 if timeStr.find('小時') != -1: 5 hour = timeStr.split('小時')[0] 6 timeStr = timeStr.split('小時')[1] 7 if timeStr.find('分') != -1: 8 min = timeStr.split('分')[0] 9 timeStr = timeStr.split('分')[1] 10 if timeStr.find('秒') != -1: 11 sec = timeStr.split('秒')[0] 12 13 timelong = int(sec) + int(min) * 60 + int(hour) * 60 * 60 14 return timelong 15 16 #編碼時間 17 def timeEncode(time): 18 strtime=str(time%60)+"秒" 19 time/=60 20 if(time!=0): 21 strtime=str(time%60)+"分"+strtime 22 time/=60 23 if (time != 0): 24 strtime = str(time % 60) + "小時"+strtime 25 return strtime 26 27 #解碼日期 28 def dateDecode(dateStr): 29 dateStrlist=dateStr.split(' ') 30 dayStr=dateStrlist[0] 31 dayStrlist=dayStr.split('-') 32 day=dayStrlist[-1] 33 34 timeStr=dateStrlist[-1] 35 timeStrlist=timeStr.split(':') 36 timeHour=timeStrlist[0] 37 38 dayAndHour=[] 39 dayAndHour.append(day) 40 dayAndHour.append(timeHour) 41 return dayAndHour
4.用戶行為分析
對用戶的數據進行分類處理,計算出行為數據
1 #行為分析 2 def behavior_analysis(datalist): 3 t=1 4 for line in datalist: 5 if(t==1): 6 t=3 7 continue 8 dh=dateDecode(line[2]) 9 day=int(dh[0]) 10 hour=int(dh[-1]) 11 12 user.day_intervel[day]+=1 13 user.time_intervel[hour/2]+=1 14 15 16 timeStr=line[3] 17 timelong = timeDecode(timeStr) 18 19 if line[4]=='主叫': 20 user.calling_times+=1 21 user.calling_long+=timelong 22 if line[4]=='被叫': 23 user.called_times+=1 24 user.called_long+=timelong 25 26 27 user.call_times=user.calling_times+user.called_times #總次數 28 user.call_long=user.calling_long+user.called_long #總時長
5.實用matplotlib進行數據可視化
繪制折線圖,反應用戶的日常通話習慣。這里只畫了一個圖
1 #數據可視化 2 def dataVisualization(userinfo): 3 plt.plot(userinfo.day_intervel, 'k') 4 plt.plot(userinfo.day_intervel, 'bo') 5 plt.xlabel(u'日 期') 6 plt.ylabel(u'通話次數') 7 plt.title(u'每日通話分析') 8 plt.grid(color='#95a5a6', linestyle='--', linewidth=1, axis='y', alpha=0.4) 9 plt.show()
完整代碼:

1 #coding=utf-8 2 import xlrd 3 import matplotlib.pyplot as plt 4 import UserDataInfo 5 6 def readData(url): 7 data=xlrd.open_workbook(url) 8 table=data.sheets()[0] #多張sheet的情況讀取第一張 9 nrows=table.nrows 10 ncols=table.ncols 11 list=[] 12 for rownum in range(0,nrows): 13 row=table.row_values(rownum) 14 for i in range(0,ncols): #轉碼unicode轉utf-8 15 row[i]=row[i].encode('utf-8') 16 if row: 17 list.append(row) 18 return list 19 20 #行為分析 21 def behavior_analysis(datalist): 22 t=1 23 for line in datalist: 24 if(t==1): 25 t=3 26 continue 27 dh=dateDecode(line[2]) 28 day=int(dh[0]) 29 hour=int(dh[-1]) 30 31 user.day_intervel[day]+=1 32 user.time_intervel[hour/2]+=1 33 34 35 timeStr=line[3] 36 timelong = timeDecode(timeStr) 37 38 if line[4]=='主叫': 39 user.calling_times+=1 40 user.calling_long+=timelong 41 if line[4]=='被叫': 42 user.called_times+=1 43 user.called_long+=timelong 44 45 46 user.call_times=user.calling_times+user.called_times #總次數 47 user.call_long=user.calling_long+user.called_long #總時長 48 49 #解碼時間 50 def timeDecode(timeStr): 51 hour = min = sec = 0 52 if timeStr.find('小時') != -1: 53 hour = timeStr.split('小時')[0] 54 timeStr = timeStr.split('小時')[1] 55 if timeStr.find('分') != -1: 56 min = timeStr.split('分')[0] 57 timeStr = timeStr.split('分')[1] 58 if timeStr.find('秒') != -1: 59 sec = timeStr.split('秒')[0] 60 61 timelong = int(sec) + int(min) * 60 + int(hour) * 60 * 60 62 return timelong 63 64 #編碼時間 65 def timeEncode(time): 66 strtime=str(time%60)+"秒" 67 time/=60 68 if(time!=0): 69 strtime=str(time%60)+"分"+strtime 70 time/=60 71 if (time != 0): 72 strtime = str(time % 60) + "小時"+strtime 73 return strtime 74 75 #解碼日期 76 def dateDecode(dateStr): 77 dateStrlist=dateStr.split(' ') 78 dayStr=dateStrlist[0] 79 dayStrlist=dayStr.split('-') 80 day=dayStrlist[-1] 81 82 timeStr=dateStrlist[-1] 83 timeStrlist=timeStr.split(':') 84 timeHour=timeStrlist[0] 85 86 dayAndHour=[] 87 dayAndHour.append(day) 88 dayAndHour.append(timeHour) 89 return dayAndHour 90 91 92 def printout(): 93 print "被叫次數:", user.called_times 94 print "被叫時長:", timeEncode(user.called_long) 95 96 print "主叫次數:", user.calling_times 97 print "主叫時長:", timeEncode(user.calling_long) 98 99 print "總次數:",user.call_times 100 print "總時長:",timeEncode(user.call_long) 101 102 print "日期",user.day_intervel 103 print "時段",user.time_intervel 104 105 #數據可視化 106 def dataVisualization(userinfo): 107 plt.plot(userinfo.day_intervel, 'k') 108 plt.plot(userinfo.day_intervel, 'bo') 109 plt.xlabel(u'日 期') 110 plt.ylabel(u'通話次數') 111 plt.title(u'每日通話分析') 112 plt.grid(color='#95a5a6', linestyle='--', linewidth=1, axis='y', alpha=0.4) 113 plt.show() 114 115 url="/Users/SeeKHit/Downloads/2017年01月語音通信.xls" 116 datalist=readData(url) 117 118 user=UserDataInfo.UserDataInfo() 119 behavior_analysis(datalist) 120 121 printout() 122 dataVisualization(user)
用戶通話信息類

1 #coding=utf-8 2 # 用戶通話信息類記錄 3 class UserDataInfo(object): 4 def __init__(self): 5 self.calling_long = 0 #主叫時長 6 self.called_long = 0 #被叫時長 7 self.call_long = 0 #總時長 8 9 self.calling_times = 0 #主叫次數 10 self.called_times = 0 #被叫次數 11 self.call_times = 0 #總次數 12 13 self.time_intervel=[] #通話時段 14 for i in range(0,12): 15 self.time_intervel.append(0) 16 17 self.day_intervel=[] #每日通話次數 18 for i in range(0,31): 19 self.day_intervel.append(0) 20 21 self.call_freq= None #通話最頻繁