
转发本文并私信我"python",即可获得Python资料以及各种心得(持续更新的)
前言
之前已经多篇文章关于使用 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,但游戏数量和销量高出其他类型很多。是动作游戏比较容易取材和制作?

最后
篇幅有限,本文先把此案例解析到这里。可以看到,即使在不制作图表的情况,进行一些简单的格式化输出,同样可以达到探索数据的效果。
不过,图表对于数据可视化是必不可少。之后我会结合 Python 和 Power BI 分享更多案例。
由于本例的数据比较多,需要源码以及数据的小伙伴,请私信我
请关注本号,后续会有更多相关教程。