先过滤主表在 left join_对join的数据集进行过滤

9cbdfe3ed78fbf9266cbc2924fe5c754.png

(最近几篇文章和业务逻辑绑定,未必具有普适性,仅供参考)。

2019-08-14补充:https://campus.datacamp.com/courses/merging-dataframes-with-pandas/merging-data?ex=9 -- pandas.merge的用法,可以参考这篇文章

比如说,多个字段怎么设置on的条件:

Use how='left', left_on=['city', 'state'], and right_on=['branch', 'state']

一、测试数据

简化过滤条件的处理,用维度模型(参见《The Data Warehouse Toolkit》),过滤前端传过来的过滤条件只作用在主表(事实表)上,两个数据集的关联方法在定义数据集时设定。比如,Fact表和产品维度表之间,用产品代码关联,Fact表和商店维度表之间,用店铺代码关联。

在测试用例中,仅限于用日期做过滤条件。

  • 基础数据集

销售事实表:

字段,日期(DataTime类型)、产品代码、店铺代码、商品数量(整型)、销售金额(Real类型)。(为简化处理,不考虑退回)。

产品维度表:

产品代码、品牌、商品、单价

位置维度表:

位置代码、所属销售区域、店铺名称

盘点事实表:

日期,产品代码、店铺代码、商品数量。

库存表(某一天的库存快照,可以从店面盘点结果+库存数量计算得到)

日期、产品代码、店铺代码、商品数量。

  • 虚拟数据集

目标:统计商品损耗率,用价格做过滤条件(业务:如果高于某个价格的商品损耗率上升,需要加强巡视)

损耗数量怎么计算

预期商品数量 =库库 - 当期销售数量

损耗数量 = 预期商品数量 - 盘点数量

虚拟数据集

当期销量数据集(查询数据时,给定一个时间范围和group_by的KPI和聚合函数名称)

--定义数据集时,以产品维度表做左表,销售数量表做右表。产品代码做关联字段。

--查询数据集时,要传递where 和 group_by条件过来。

损耗数据集

损耗 = 库存数量 - 销量 - 盘点数量

--过滤条件要分别传,对库存表,用一个日期确切的日期,对销量表,用一个时间范围

二、代码改动

前端传来的过滤条件用KPI+symbol+value。

group用KPI表示。聚合函数在定义时提供。

前端传来的KPI属于哪个数据集,就把过滤条件作用在哪个数据集上。

自己写的拼SQL语句函数需要修改,把where条件、group_by字段以及聚合函数加进去。


构造测试数据,计划生成一万条销售记录。

先用pandas.date_range生成一万个时间记录:

today = datetime.datetime.now()
index = pd.date_range(today - datetime.timedelta(100), periods=10000, freq='14min')
print(index)

输出:
DatetimeIndex(['2019-05-01 14:28:13.488039', '2019-05-01 14:42:13.488039',
               '2019-05-01 14:56:13.488039', '2019-05-01 15:10:13.488039',
               '2019-05-01 15:24:13.488039', '2019-05-01 15:38:13.488039',
               '2019-05-01 15:52:13.488039', '2019-05-01 16:06:13.488039',
               '2019-05-01 16:20:13.488039', '2019-05-01 16:34:13.488039',
               ...
               '2019-08-06 17:28:13.488039', '2019-08-06 17:42:13.488039',
               '2019-08-06 17:56:13.488039', '2019-08-06 18:10:13.488039',
               '2019-08-06 18:24:13.488039', '2019-08-06 18:38:13.488039',
               '2019-08-06 18:52:13.488039', '2019-08-06 19:06:13.488039',
               '2019-08-06 19:20:13.488039', '2019-08-06 19:34:13.488039'],
              dtype='datetime64[ns]', length=10000, freq='14T')

从五月一号到八月六号,间隔14分钟一条。

假设有5种商品,产品代码随机生成,取值1~5。

用numpy的random.randint函数生成,取值范围应该是前闭后开,所以high要写6。

production = np.random.randint(1, 6, size=10000)
print(production)
输出:
[5 1 2 ... 1 2 3]

店铺代码同上。

商品数量同上。

金额,在生成DataFrame之后,用数量*(单价+10%)。先不处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值