(最近几篇文章和业务逻辑绑定,未必具有普适性,仅供参考)。
2019-08-14补充:https://campus.datacamp.com/courses/merging-dataframes-with-pandas/merging-data?ex=9 -- pandas.merge的用法,可以参考这篇文章
比如说,多个字段怎么设置on的条件:
Usehow='left'
,left_on=['city', 'state']
, andright_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%)。先不处理。