python数据分析实践(二)

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

import json
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import time

# 模仿matlab tic, toc
def 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 True

tic()
# 数据导入
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']]
# 数据清洗,对新数据框进行缺失值去除并重置index
clean_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'可能存在的缺失,所以再次进行数据清洗,重置index
df = pd.DataFrame(data).dropna(how='any').reset_index(drop=True)
# 由于'createTime'列中存在'19700101'的错误数据需要清除,
# 我们将'createTime'数据列设置为index,然后利用dataframe.drop进行清除,再重置index
df = 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')

# 把数据写进excel
writer = 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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值