点 前言 之前已经多篇文章关于使用 pandas 处理数据,那仅仅是工作的开端,只是把数据整理完毕而不继续探索数据,那么就白白浪费了 Python 这样的好工具。
之后会陆续分享一系列的案例,敬请关注!!!
今天要探索的数据来自于微软的 power bi 关于 TV Game 的销量相关案例,我们开始吧。
本文概要 通过本文你将会学到以下知识点:
pandas 连接多表数据 如何高效编写代码,以方便多维度汇总数据 直接在 DataFrame 中可视化输出,如下: 案例介绍 案例数据有5个表的数据,以5个 csv 文件保存。以下是每个表的概要信息:
sales :记录每个游戏的销售情况(销量、用户评分如何?) games :记录每个游戏的基本信息(游戏名字、开发商、分级、发布日期) consoles : 每个游戏终端信息(电视游戏主机、厂商有哪些?) ratings : 每个分级信息 genres : 游戏类型信息(动作游戏还是解密游戏?) 最多的记录就是销量表 sales ,以他为中心关联其他的表即可得到以下信息数据:
游戏xxx是微软的主机 xbox360 的 销量是10.5 百万 用户评分7.5分 是一款动作类游戏 各个表关系图如下:
sales 表对 games 表的关系是多对一关系 实际上 sales 表的每行的游戏都是唯一的,也就是 GameID 列没有重复的 加载数据
我们现在需要从5个 csv 文件加载数据,然后把5个表连接成一个 DataFrame。 首先定义一个方法,负责加载、连接数据。方法名字就叫 get_df ,如下图:
上图是加载 sales 表的代码,就两句代码。 中间省略了其他4个表的加载代码。 定义 sales_cols 列表,表示加载所需的列,我们不要加载所有的列。 pd.read_csv ,读取 csv 文件,其中参数 usecols 指定需要的列。 在加载游戏信息表时,特别指定 pd.read_csv 方法中的参数 parse_dates ,让其把 Release 列(游戏发布日期)作为日期处理 然后同样是在 方法 get_df 中,把5个表连接起来。如下:
这里有个技巧,从核心表 sales 表开始,按照关系图一直"左连接"到所有的表。 左连接的左边一般是一对多关系中的"多方"。 merge ,用于连接2个 DataFrame 。参数 how='left' 指定为左连接, on=xxx 表示用 xxx 字段做 key。 我们来看看表关系图和连接代码之间的关系。
关联好数据了,现在看看数据的情况。
调用之前定义的 get_df 方法,加载数据 df.info() ,查看数据的基本元信息 可以清楚看到,数据有20621笔数据 Total_Sales 销量列,有一半数据是缺失的 User_Score 用户评分,只有6000多笔数据而已
定义核心问题 我们先制定一些探索目标,否则整个过程没有方向,很容易迷失。 我们希望通过数据,回答以下一些问题:
整体游戏市场的销量如何? 各个主机的游戏销量如何? 什么类型的游戏比较好卖或受欢迎? 不要重复写汇总代码
假设我们希望看看每个品牌主机的游戏销量,那么可能会编写如下代码:
虽然此代码编写也算容易,但是我们需要经常变换汇总维度,每次重复编写这样的代码会很不方便。
因此,我们希望每次调用时,只需要告诉 pandas 以下信息即可:
用哪些维度字段做汇总 使用哪个字段做统计,统计方法是什么(平均、求和还是计数),统计后的列名字是什么 首先定义一个方法 cal ,每次只需要调用他即可得到汇总结果:
参数 labels ,就是"需要的维度字段列表" 参数 cal_funcs ,是统计方法列表,这里特意定义为无限个数的参数,那么就可以一次统计多个不同的方法 接下来,我们就要根据数据定义统计方法。 比如:销量求总,用来分析销量情况
CalFunc 只是一个 namedtuple,用于记录3个信息(统计列名、统计方法、统计后的新列名字) 如上图,对 Total_Sales 列进行求和计算(sum) ,结果列名字为 total_revenue 我们试试,统计每个品牌每年的销量,如下:
接着,根据我们之前定义的核心问题,可以编写以下2个方法:
cal_total_games ,用于分析游戏数量 cal_avg_user_score ,用于分析用户对游戏的喜欢程度 看图说话 Python 上做图表有许多库可以选择,不过这次我们来试试直接在 DataFrame 中添加格式来可视化数据。
首先定义一个通用的方法用于输出带格式的 DataFrame。
通过 DataFrame.style.bar ,即可输出带 css 格式的文本 参数 subset ,用于表示哪些列需要带格式 参数 color ,格式的颜色 看看整体市场每年的游戏数量与销量走势。
由于年份太多,因此只保留2000年以后的数据 可以看到2008年游戏数量和销售量都是最好的 而2017年虽然游戏数量与2008年接近,但销量却是差很多 为什么2019年这么少(这可能是数据出问题)? 看看不同厂商品牌的销量情况。
sony 大热胜出 微软则不管游戏数量和销量都是垫底 哪类型游戏比较受欢迎?
策略类和角色扮演类游戏的用户评分最高 动作类游戏用户评分虽然只是第4,但游戏数量和销量高出其他类型很多。是动作游戏比较容易取材和制作? 最后 篇幅有限,本文先把此案例解析到这里。可以看到,即使在不制作图表的情况,可以做一些简单的格式化输出,同样可以达到探索数据的效果。