Costco 是全球第一家会员制的仓储批发卖场,中文翻译过来叫「开市客」或「好市多」,始创于 1976 年的美国加州,截止到 2019 年 1 月,有 736 家门店,9270 万会员,年营业额 1310 亿美元,会员续费率 90%,全球拥有 24 万名员工。
2019 年 8 月 27 日,中国大陆第一家 Costco 在上海开业,因为人满为患,Costco 实行限流,将卖场人数控制在 2000 人以内,有人早上 4:30 就去排队。
Costco 把零售效率做到极致,是零售企业学习的标杆。
作为数据分析师,也要学习 Costco 死磕自己、为用户创造价值的精神。
下面,我们从网上读取一些 Costco 的股价数据,学习用 Python 对这些数据进行转换,为将来的数据分析做好准备。
首先,我们从网页中读取Costco 的历史股价数据。
![](https://pic3.zhimg.com/80/v2-20f691e5500f13a2b8c8c9870a860833_720w.webp)
然后,我们对数据进行清洗,得到一个干净整洁的数据表格。
![](https://pic3.zhimg.com/80/v2-f7bd1391d682d8bff2ac5926e7a99e1c_720w.webp)
接下来,我们就可以正式开始对数据进行转换。
1. 如何转换为时间?
使用 transform() 函数,结合 dateutil 模块中的 parse() 函数,我们可以将字符转换为时间。
![](https://pic4.zhimg.com/80/v2-3a8856819dff122523b2d6de18a42d6e_720w.webp)
大部分常见的字符形式,都可以使用 parse() 进行转换,例如:
![](https://pic3.zhimg.com/80/v2-3ec31f063b278d6a9be0ded886126f18_720w.webp)
需要注意的是,要防止出现意外情况,例如:parse('80') 的结果是 1980 年的当前日期,如果这不是你想要的结果,那么在转换之前,建议把相应的字符串写得更具体明确一些。
使用 pd.to_datetime() 函数,不仅能将字符转换为时间,而且能将数值转换为时间,还能指定时间单位和起始日期等参数,例如:
![](https://pic4.zhimg.com/80/v2-536462d859e27d40d58fc1489c2c184b_720w.webp)
2. 如何转换为数值?
使用 pd.to_numeric() 函数,结合自由度比较高的 apply() 函数,我们可以实现将每一列都强制转换为数值,无法转换的元素用 nan 表示。
![](https://pic1.zhimg.com/80/v2-9dd90aab8ca07707185a232f33015471_720w.webp)
其中 errors='coerce' 是 pd.to_numeric() 函数的一个参数,如果把 coerce 替换为 ignore,那么将忽略无法转换的元素,让其保持原样。
![](https://pic1.zhimg.com/80/v2-18744ce673b806b7dc16307189c842ed_720w.webp)
3. 如何转换为字符?
使用 astype() 函数,我们可以实现数据类型的相互转换。比如说,下面的代码实现把数据框全部转换为字符型。
![](https://pic4.zhimg.com/80/v2-3ddf8a470c32c8656555785965194feb_720w.webp)
对于时间型的数据,我们可以使用 strftime() 函数,转换为指定的字符格式,例如:
![](https://pic2.zhimg.com/80/v2-eb9a2cbf99fda59393427d721cae3c05_720w.webp)
4. 如何转换为区间?
使用 pd.cut() 函数,我们可以将数值切割为指定的区间,例如:
![](https://pic4.zhimg.com/80/v2-53d4c534fcd765eb221c74ad1d22195f_720w.webp)
其中 right = True 代表左开右闭,默认为 False,即左闭右开。
我们可以使用 labels 参数,为每个区间指定想要显示的内容,例如:
![](https://pic4.zhimg.com/80/v2-6b3b0e7290f1f36fed5b94522e1ef74f_720w.webp)
如果把 bins 参数定义为一个整数,那么数值将被切割为等分的区间。
![](https://pic3.zhimg.com/80/v2-7200a1218b680837dd7147b804e3a259_720w.webp)
5. 如何做分组转换?
结合使用 groupby() 和 transform() 函数,我们可以在行数保持不变的情况下,对某列进行分组求和,例如:
![](https://pic3.zhimg.com/80/v2-9c60dee592dcf3551a4a7af110e6c793_720w.webp)
这样分组转换数据的好处是,能够方便地计算每个数据对应各自分组的占比。比如说,下面代码的计算结果是:每天成交量占当月总成交量的比例。
![](https://pic4.zhimg.com/80/v2-f48d984a811bd8b7dfcd7e701e2e0d92_720w.webp)
如果使用 apply() 函数,那么返回结果会聚合成 5 行。
![](https://pic3.zhimg.com/80/v2-c3fea1826efd31dd1e52b7f8b0ee08a0_720w.webp)
如何使用 agg() 函数,那么返回的结果也是聚合成 5 行,而且可以同时应用多个函数。
![](https://pic1.zhimg.com/80/v2-d959c72934f5422476c40ab70e3fa834_720w.webp)
Pandas 从 0.25 版本开始,agg() 函数得到增强,可以对多个不同的列,应用不同的函数,并对聚合的结果进行自定义命名。
比如说,类似于 Excel 中经典的数据透视表功能,我们可以使用下面的代码,实现按月份分组,同时对日期进行计数、对开盘价求平均值和最大值、对成交量求和。
![](https://pic1.zhimg.com/80/v2-4a8c0f5a3741f420adac0e37f851a44a_720w.webp)
可以看出,与 Excel 相比,Python 的功能要强大很多,灵活运用相关函数,能够明显提升数据分析的效率。
6. 如何标准化转换?
为了消除单位量纲的影响,让不同变量之间能够进行对比分析,我们可以对数据进行标准化转换,0-1 标准化是一种常用的标准化转换的方法。比如说,下面的代码实现了 Costco 开盘价的 0-1 标准化。
![](https://pic3.zhimg.com/80/v2-08f49e2e6ddb226d96c3141380f4cfcd_720w.webp)
经过 0-1 标准化转换之后,原来的最小值变成 0,原来的最大值变成 1,其他的值都变成了介于 0 到 1 之间的值。
7. 小结
最后,我们还是用一张思维导图,对转换数据的方法做个小结。
![](https://pic4.zhimg.com/80/v2-f6c26d7528eb014f27146e6c9a16d4ec_720w.webp)