python数据分析实践(二)

来源:互联网 发布:软件演示平台 编辑:程序博客网 时间:2024/05/21 17:46

在上一次对于实践一的修改的基础上,进行了第二次数据处理实践,这次的数据跟第一次的数据差不多,同样也是游戏数据,json文件,但是只是游戏不同,所以对应的数据打点也有不同,这次数据处理完并没有画图,而是导出到excel当中。

import jsonimport pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport time# 模仿matlab tic, tocdef tic():    globals()['bt'] = time.clock()def toc():    print ('所用时间为: %.2f seconds' % (time.clock()-globals()['bt']))# 添加中文字体from pylab import *mpl.rcParams['font.sans-serif'] = ['SimHei']def is_json(data):    # 判断是否为 json 格式    try:        json.loads(data)    except ValueError:        return False    return Truetic()# 数据导入path = 'cos1.json'aa = open(path).readlines()records = [json.loads(line) for line in aa if is_json(line)]# 建立数据框frame = pd.DataFrame(records)# 提出所用数据'm2','channType','server','createTime'的来源frame_temp = frame[['header','player','terminate']]# 数据清洗,对新数据框进行缺失值去除并重置indexclean_data = frame_temp.dropna(how = 'any').reset_index(drop = True)# 数据重建,从'header'里提出'm2'和'channType',从'player'里提出'server',从'terminate'里提出'createTime'new_data = []for i in range(len(clean_data)):    m2 = clean_data['header'][i]['m2']     channType = clean_data['header'][i]['channType']    # 有些数据里可能没有server这个key,所以加个判断    if 'server' in clean_data['player'][i].keys():            server = clean_data['player'][i]['server']    else:        server = float('nan')    # 由于用户可能在同一天的不同时间段登录游戏,所以'createTime'可能有多个,需要用一个for循环    new_data.append([dict(m2=m2,channType=channType,server=server,createTime=time.strftime("%Y%m%d" ,time.localtime(rec['createTime'])))                       for rec in clean_data['terminate'][i]])# 数据平铺data = [item for record in new_data for item in record]# 由于'server'可能存在的缺失,所以再次进行数据清洗,重置indexdf = pd.DataFrame(data).dropna(how='any').reset_index(drop=True)# 由于'createTime'列中存在'19700101'的错误数据需要清除,# 我们将'createTime'数据列设置为index,然后利用dataframe.drop进行清除,再重置indexdf = df.set_index(df.createTime).drop(['19700101']).reset_index(drop=True)# 计算活跃用户量,设置Series的名字为'count'(Series没有columns,只有name)# 先按'createTime','m2'进行去重,然后重置index,取出'createTime'列进行value_counts(),最后对index进行排序active_counts = df.drop_duplicates(['createTime','m2']).reset_index(drop = True)['createTime'].value_counts().sort_index()active_counts.name = 'counts'# 计算新增用户量new_users_counts = df.drop_duplicates('m2').reset_index(drop = True)['createTime'].value_counts().sort_index()new_users_counts.name = 'counts'# 计算活跃用户(分渠道),# 先按'createTime','m2','server'进行去重,重置index,以'channType','createTime'进行groupby,然后计数(size)active_counts_by_chan = df.drop_duplicates(['m2','createTime','server']).reset_index(drop = True).groupby(['channType','createTime']).size().rename('counts')# 计算新增用户(分渠道)new_users_counts_by_chan = df.drop_duplicates(['m2','server']).reset_index(drop = True).groupby(['channType','createTime']).size().rename('counts')# 计算活跃用户(分服务器)active_counts_by_server = df.drop_duplicates(['m2','createTime','channType']).reset_index(drop = True).groupby(['server','createTime']).size().rename('counts')# 计算新增用户(分服务器)new_users_counts_by_server = df.drop_duplicates(['m2','channType']).reset_index(drop = True).groupby(['server','createTime']).size().rename('counts')# 把数据写进excelwriter = pd.ExcelWriter('cos1.xlsx')active_counts.to_excel(writer,'活跃用户')new_users_counts.to_excel(writer,'新增用户')active_counts_by_chan.to_excel(writer,'活跃用户(分渠道)')new_users_counts_by_chan.to_excel(writer,'新增用户(分渠道)')active_counts_by_server.to_excel(writer,'活跃用户(分服务器')new_users_counts_by_server.to_excel(writer,'新增用户(分服务器)')writer.save()toc()
原创粉丝点击