SiriBlog

siriyang的个人博客


  • 首页

  • 排行榜

  • 标签115

  • 分类37

  • 归档320

  • 关于

  • 搜索

X-Data数据工程基础实践(四)

发表于 2020-01-11 更新于 2021-10-29 分类于 考研 , 复试 阅读次数: Valine:
本文字数: 4.7k 阅读时长 ≈ 4 分钟

前言

  本章要使用到Pyecharts 1.X版本,先提前装好。echarts本是一个js下用于绘制图表的库,pyecharts顾名思义就是一个python版的接口,最终将python代码渲染成html。

正文

  今天来完成任务一的实验五、六:对测试集ccf_offline_stage1_test_revised做分析与数据观察和数据预处理。(其实应该先做实验六的预处理再做实验五的观察,或者说先观察再处理再观察)

观察数据概况

  先初步观察数据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 读取数据集
off_test=pd.read_csv("ccf_offline_stage1_test_revised.csv")
# 共有多少条记录
record_count=off_test.shape[0]
# 共有多少条优惠券的领取记录
received_count = off_test['Date_received'].count()
# 共有多少种不同的优惠券
coupon_count = len(off_test['Coupon_id'].value_counts())
# 共有多少个用户
user_count = len(off_test['User_id'].value_counts())
# 共有多少个商家
merchant_count = len(off_test['Merchant_id'].value_counts())
# 最早领券时间
min_received = str(int(off_test['Date_received'].min()))
# 最晚领券时间
max_received = str(int(off_test['Date_received'].max()))

print('record_count', record_count)
print('received_count', received_count)
print('coupon_count', coupon_count)
print('user_count', user_count)
print('merchant_count', merchant_count)
print('min_received', min_received)
print('max_received', max_received)

  输出结果:

1
2
3
4
5
6
7
record_count 113640
received_count 113640
coupon_count 2050
user_count 76309
merchant_count 1559
min_received 20160701
max_received 20160731

数据预处理

  首先进行数据予处理,由于是要要求的数据表是测试集,没有消费日期的数据,所以实验指导书中很多数据图没发画出来。不过前两个还是可以的,然后我再添加了一个新的图表,用于统计一周内用户在周一至周日每一天的领卷数量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import os
import pandas as pd
from pyecharts.charts import Bar,Pie
from pyecharts import options as opts
import collections

if __name__ == "__main__":

# 源数据
data = pd.read_csv('ccf_offline_stage1_test_revised.csv')

# 复制data数据集为其做一下预处理方便绘图
offline = data.copy()

# 将Distance的空值填充为-1
# offline['Distance'].fillna(-1, inplace=True) # 原表中的null无法使用fillna函数填充,所以直接替换
offline.ix[offline['Distance'] == 'null', 'Distance'] = -1

# 将领券时间转为时间类型
offline['date_received'] = pd.to_datetime(offline['Date_received'], format='%Y%m%d')
# 将折扣券转为折扣率
offline['discount_rate'] = offline['Discount_rate'].map(lambda x: float(x) if ':' not in str(x) else
(float(str(x).split(':')[0]) - float(str(x).split(':')[1])) / float(str(x).split(':')[0]))
# 领券时间为周几
offline['weekday_received'] = offline['date_received'].apply(lambda x: x.isoweekday())
# 添加优惠券是否为满减类型
offline['is_manjian'] = offline['Discount_rate'].map(lambda x: 1 if ':' in str(x) else 0)

每天被领券的数量柱状图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 选取领券日期不为空的数据
df_1 = offline[offline['Date_received'].notnull()]
# 以Date_received为分组目标并统计优惠券的数量
tmp = df_1.groupby('Date_received', as_index=False)['Coupon_id'].count()

x=list(tmp['Date_received'])
y=list(tmp['Coupon_id'])

# 建立柱状图
bar_1 = (
Bar(
init_opts=opts.InitOpts(width='1500px', height='600px')
)
.add_xaxis(x)
.add_yaxis('', y)
.set_global_opts(
title_opts=opts.TitleOpts(title='每天被领券的数量'), # title
legend_opts=opts.LegendOpts(is_show=True), # 显示ToolBox
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=60), interval=1), # 旋转60度
)
.set_series_opts(
opts.LabelOpts(is_show=False), # 显示值大小
markline_opts=opts.MarkLineOpts(
data=[
opts.MarkLineItem(type_='max', name='最大值') # 标注最大值
]
)
)
)

用户消费距离统计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 消费距离柱状图
# 统计各类距离的消费次数
dis = offline[offline['Distance'] != -1]['Distance'].values
dis = dict(collections.Counter(dis))

x = list(dis.keys())
y = list(dis.values())

# 建立柱状图
bar_2 = (
Bar()
.add_xaxis(x)
.add_yaxis('', y)
.set_global_opts(
title_opts=opts.TitleOpts(title='用户消费距离统计'), # title
)
)

用户一周内各天领卷数量累计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 用户一周内各天领卷数量累计

x=["周一","周二","周三","周四","周五","周六","周日"]
y=[]

for i in range(1,8):
y.append(offline[offline['weekday_received'] == i]['weekday_received'].count())

# 建立柱状图
bar_3 = (
Bar()
.add_xaxis(x)
.add_yaxis('', y)
.set_global_opts(
title_opts=opts.TitleOpts(title='用户一周内各天领卷数量累计'), # title
)
)

优惠卷类型数量占比

1
2
3
4
5
6
7
8
9
10
# 优惠卷类型比例
v1=['折扣','满减']
v2=list(offline[offline['Date_received'].notnull()]['is_manjian'].value_counts(True))

pie_1=(
Pie()
.add("",[list(v) for v in zip(v1,v2)])
.set_global_opts(title_opts={"text":"各类优惠卷数量占比饼图"})
.set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
)

渲染保存

  最后将会以html文件保存。

1
2
3
4
5
6
7
8
path = './tmp/task2_output'
if not os.path.exists(path):
os.makedirs(path)
# render会生成本地HTML文件,默认在当前目录生成render.html文件
bar_1.render(path + '/bar_1.html')
bar_2.render(path + '/bar_2.html')
bar_3.render(path + '/bar_3.html')
pie_1.render(path + '/pie_1.html')

结语

  也不知道是这个包有问题还是我的python环境有问题,第一个和第三个图表我使用运算出来的list变量传进去就是画不出来,但直接把数据字面值写成list传进去就没问题,但是第二张图和官方的demo都运行正常,我一开始还以为是我语法有问题,调试了两天都没解决。哎,看后期版本更新以后能不能解决吧,如果不是为了完成任务,matplotlib其实就够用了。
  这个库虽然在网上有很多教程,但是语法现在的新版本都不支持了,在虚拟环境的安装路径下会有官方的演示代码可以参考学习,内容非常齐全。比如我的路径是“D:\Anaconda3\envs\BigData\Lib\site-packages\example”

-------- 本文结束 感谢阅读 --------
相关文章
  • X-Data数据工程基础实践(十)
  • X-Data数据工程基础实践(九)
  • X-Data数据工程基础实践(八)
  • X-Data数据工程基础实践(七)
  • X-Data数据工程基础实践过程中遇到的问题
觉得文章写的不错的话,请我喝瓶怡宝吧!😀
SiriYang 微信支付

微信支付

SiriYang 支付宝

支付宝

  • 本文标题: X-Data数据工程基础实践(四)
  • 本文作者: SiriYang
  • 创建时间: 2020年01月11日 - 16时01分
  • 修改时间: 2021年10月29日 - 18时10分
  • 本文链接: https://blog.siriyang.cn/posts/20200111162813id.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
学习笔记 考研 复试 Python 机器学习 数据挖掘
C/CPP参考文档:C++ String
C/CPP参考文档:关键字
  • 文章目录
  • 站点概览
SiriYang

SiriYang

努力搬砖攒钱买镜头的摄影迷
320 日志
33 分类
88 标签
RSS
GitHub E-Mail
Creative Commons
Links
  • 友情链接
  • 作品商铺

  1. 前言
  2. 正文
    1. 观察数据概况
    2. 数据预处理
    3. 每天被领券的数量柱状图
    4. 用户消费距离统计
    5. 用户一周内各天领卷数量累计
    6. 优惠卷类型数量占比
    7. 渲染保存
  3. 结语
蜀ICP备19008337号 © 2019 – 2025 SiriYang | 1.7m | 25:41
0%