Python處理日志文件

背景

公司視頻應(yīng)用,需要針對用戶的操作數(shù)據(jù)分析,得出應(yīng)用內(nèi)所有的視頻的權(quán)重分析,方便以后更好的進(jìn)行推薦視頻操作.目前已有的log格式主要有:

    action             vid           uid
    view video      video_001        NaN
    play video      video_001       user_00x

用戶分為注冊用戶與游客兩種,操作主要有view,like,comment,upload,download幾種.為了方便處理,第一階段只考慮針對游客訪問的視頻進(jìn)行處理.這樣形成一個只有actionuid的字典形式.處理數(shù)據(jù)主要使用pythonpandas庫.

清洗數(shù)據(jù)

日志初期action包括view,like,comment,upload,uid包括用戶id以及代表游客的NaN空值.第一步需要把這些action具體量化,為了簡單量化初期:view = 1 , like = 2 , comment = 3 , upload = 3 , download = 3.日志文件以csv格式存儲.導(dǎo)入數(shù)據(jù)后進(jìn)行處理:

import pandas as pd
# pandas讀取csv
data = pd.read_csv('data.csv')
# action為playvideo的設(shè)置為1,即打分為1
data.loc[data['action']=='playvideo','action']=1
# 把NaN(即游客)值重置為0
data=data.fillna(value = '0')
# 過濾出uid值為0的數(shù)據(jù)
tourist_data = data.loc[data['uid']=='0']
del tourist_data['uid']
# tourist_data為action與uic的矩陣

DataFrame如下

   action                               vid
0       1  2c9f91345c3ed855015c5ee9cb904681
1       1  2c9f91345c3ed855015c52649f962d4f
2      -1  2c9f91345c2007f8015c2deee14c18cb
3       1  2c9f91345c3ed855015c5ee9cb904681
4       3  2c9f91345c2007f8015c2deee14c18cb

針對這個數(shù)據(jù),需要進(jìn)行清洗.找出重復(fù)的vid,并相加對應(yīng)的action.得出的矩陣就是需要的vid的score排列.
首先DataFrame生成vid的list
vid_list=tourist_data['vid'].values.tolist()
問題分解為尋找list中重復(fù)的數(shù)值,并把數(shù)值對應(yīng)的index記錄下來.需要用到兩個庫enumeratedefaultdict
enumerate可以把list生成帶有index的dict
defaultdict可以對list形成的dict進(jìn)行統(tǒng)計處理

# 生成帶有index的列表
In [189]: [(v,i) for i,v in enumerate(vid_list)]
Out[189]:
[('2c9f91345c3ed855015c5ee9cb904681', 0),
 ('2c9f91345c3ed855015c52649f962d4f', 1),
 ('2c9f91345c2007f8015c2deee14c18cb', 2),
 ('2c9f91345c3ed855015c5ee9cb904681', 3),
 ('2c9f91345c2007f8015c2deee14c18cb', 4),
 ('2c9f91345c3ed855015c52649f962d4f', 5),
 ('2c9f91345c2007f8015c2deee14c18cb', 6),
 ('2c9f91345bf13cac015bfce28ef31002', 7),
 ('2c9f91345c3ed855015c5ee9cb904681', 8),
 ('2c9f91345c3ed855015c52649f962d4f', 9)]

# 利用defaultdict生成對重復(fù)vid處理后的dict
In [190]: vid_dict = defaultdict(list)

In [191]: for key, value in [(v, i) for i, v in enumerate(vid_list)]:
     ...:   vid_dict[key].append(value)
     ...:

In [192]: vid_dict
Out[192]:
defaultdict(list,
            {'2c9f91345bf13cac015bfce28ef31002': [7],
             '2c9f91345c2007f8015c2deee14c18cb': [2, 4, 6],
             '2c9f91345c3ed855015c52649f962d4f': [1, 5, 9],
             '2c9f91345c3ed855015c5ee9cb904681': [0, 3, 8]})

vid對應(yīng)的list即為對應(yīng)的index位置,利用index位置就可以為score_list進(jìn)行處理累加

# 生成score list
score_list = tourist_data['action'].values.tolist()
In [222]: vid_dict = defaultdict(list)

In [223]: for key, value in [(v, i) for i, v in enumerate(vid_list)]:
     ...:     vid_dict[key].append(value)

In [224]: vid_dict
Out[224]:
defaultdict(list,
            {'2c9f91345bf13cac015bfce28ef31002': [7],
             '2c9f91345c2007f8015c2deee14c18cb': [2, 4, 6],
             '2c9f91345c3ed855015c52649f962d4f': [1, 5, 9],
             '2c9f91345c3ed855015c5ee9cb904681': [0, 3, 8]})
In [227]: rank_list=[]
     ...: for i in vid_dict:
     ...:     score = 0
     ...:     for index in vid_dict[i]:
     ...:         score += int(score_list[index])
     ...:     rank_list.append(score)

In [231]: vid_list = []

In [232]: for i in vid_dict:
     ...:     vid_list.append(i)
In [233]: vid_list
Out[233]:
['2c9f91345bf13cac015bfce28ef31002',
 '2c9f91345c2007f8015c2deee14c18cb',
 '2c9f91345c3ed855015c5ee9cb904681',
 '2c9f91345c3ed855015c52649f962d4f']

In [234]: rank_list
Out[234]: [1, 4, 5, 3]
In [237]: vid_score = pd.DataFrame({'score':rank_list,'vid':vid_list})

生成scorevid的矩陣

針對生成的數(shù)據(jù)進(jìn)行分析

使用altair對數(shù)據(jù)進(jìn)行畫圖分析

# 導(dǎo)入csv文件
import pandas as pd
from altair import Chart, load_dataset
%matplotlib inline
vids_score = pd.read_csv('./res/vid_score.csv')
bins = [0, 10, 20, 30, 40, 50,60,70,80,90, 100,150,200,300,400,500,1000,1500]
scores = pd.cut(vids_score['score'], bins)
def get_stats(group):
    return {'count': group.count()}
grouped = vids_score['score'].groupby(scores)
bin_counts = grouped.apply(get_stats).unstack()
bin_counts
bin_counts.index = ['0~10', '10~20', '20~30', '30~40', '40~50', '50~60', '60~70',
                    '70~80', '80~90', '90~100','100-150','150-200','200-300','300-400','400-500','500-1000','1000-1500']
bin_counts.index.name = 'score'
plt=bin_counts.plot(kind='bar', alpha=0.5, rot=1,width = 0.8,align='center',figsize=(15,4))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末点额,一起剝皮案震驚了整個濱河市搔课,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌澡谭,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡吗坚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門呆万,熙熙樓的掌柜王于貴愁眉苦臉地迎上來商源,“玉大人,你說我怎么就攤上這事谋减∧党梗” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵出爹,是天一觀的道長庄吼。 經(jīng)常有香客問我,道長严就,這世上最難降的妖魔是什么总寻? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮梢为,結(jié)果婚禮上渐行,老公的妹妹穿的比我還像新娘。我一直安慰自己铸董,他們只是感情好祟印,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著袒炉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪樊零。 梳的紋絲不亂的頭發(fā)上我磁,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機(jī)與錄音驻襟,去河邊找鬼夺艰。 笑死,一個胖子當(dāng)著我的面吹牛沉衣,可吹牛的內(nèi)容都是我干的郁副。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼豌习,長吁一口氣:“原來是場噩夢啊……” “哼存谎!你這毒婦竟也來了拔疚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤既荚,失蹤者是張志新(化名)和其女友劉穎稚失,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恰聘,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡句各,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了晴叨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凿宾。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖兼蕊,靈堂內(nèi)的尸體忽然破棺而出初厚,到底是詐尸還是另有隱情,我是刑警寧澤遍略,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布惧所,位于F島的核電站,受9級特大地震影響绪杏,放射性物質(zhì)發(fā)生泄漏下愈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一蕾久、第九天 我趴在偏房一處隱蔽的房頂上張望势似。 院中可真熱鬧,春花似錦僧著、人聲如沸履因。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽栅迄。三九已至,卻和暖如春皆怕,著一層夾襖步出監(jiān)牢的瞬間毅舆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工愈腾, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留憋活,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓虱黄,卻偏偏與公主長得像悦即,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法辜梳,類相關(guān)的語法粱甫,內(nèi)部類的語法,繼承相關(guān)的語法冗美,異常的語法魔种,線程的語...
    子非魚_t_閱讀 31,581評論 18 399
  • ¥開啟¥ 【iAPP實現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,358評論 0 17
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理粉洼,服務(wù)發(fā)現(xiàn)节预,斷路器,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,790評論 0 11
  • 我想帶你去海邊 看海浪拍打你的腳踝 我想帶你去山頂 看朝陽驅(qū)散清晨濃霧 我想帶你去草原 看奔馬追逐風(fēng)的腳步 我想帶...
    jianshuxuhan閱讀 238評論 1 5