商品点击量and销售量统计

本文分享了作者首次使用Python开发服务的经验教训,强调了明确需求的重要性,并详细对比了几种不同的数据存储策略,包括纯内存存储、数据库存储及混合存储方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一次用python写服务,一边写一边改,跌跌撞撞到现在基本完成。

非常重要的一个经验:在动手写代码前,一定要明确需求的各个细节,通盘考虑,设计实现方案!否则只能在编写代码的过程中改了又改,不断补窟窿,换思路。


以下记录下没有弄清楚需求时,自己以为的情况的思路:

起初我以为是所有的商品点击均要监控到,这样如果点击量很大的话,将数据全部存在内存中数据量过大,是个问题,所以采用的策略是尽量将数据写到数据库中。

我没意识到按时间区间筛选时,需要记录每次点击的时间,而我每次更新的都是此sku最后一次点击的时间。还忘记了加product_link。(⊙﹏⊙)b

方案一

1.数据存储方式采用数据库sqlite3 + 内存存储:

数据库存储的字段为<image_link, skuid, click_rate, sales_volume, date>,以skuid为主键。

内存存储以字典列表的方式存储以上信息,eg:{‘skuid’:[image_link, skuid, click_rate, sales_volume, date]}(注:最好保持数据库和内存数据的顺序一致)

2.定期将内存数据flush到数据库,需要将先前的老数据Delete掉。

3.由点击触发服务,首先查询内存数据DATA,如果存在则直接更新数据;否则,查询数据库,如果查询到,将数据加载到内存DATA中,并更新之;如果数据库中也不存在,则直接记录到内存DATA。

4.sales_volume字段暂时不考虑,最后从销售系统中直接提取;所以“总计销售” 也不考虑

具体流程图如下:


此方案将用户点击行为数据保存在内存中,如果内存中中不存在则读取数据库,如果数据库中也不存在则新建数据。在查询时将内存和数据库中的数据合并后返回。同时分别查询内存与数据库中的数据,逻辑有点复杂,不够简明。

方案二

1.数据存储采用数据库sqlite。

2.每次点击触发服务后都查询数据库,然后写数据库。

此方案对数据库压力过大,属于小白方案。

方案三

记录每次点击的时间,加入product_link。O(∩_∩)O~

1.数据存储方式采用数据库sqlite3 + 内存存储:

数据库存储的字段为<image_link, skuid, click_rate, sales_volume, date, product_link>,以date为主键,date以时间戳的方式记录,为int。

内存存储以字典列表的方式存储以上信息,eg:{‘date’:[image_link, skuid, click_rate, sales_volume, date,product_link], }(注:最好保持数据库和内存数据的顺序一致)

2.定期将内存数据flush到数据库。

3.由点击触发服务,将数据记录在内存DATA中。

4.在需要显示数据时,将数据刷到数据库,然后调用数据库服务group by skuid 输出数据。

5.sales_volume字段暂时不考虑,最后从销售系统中直接提取;所以“总计销售” 也不考虑。


相比上一个方案,清晰简单多了!能用数据库的尽量使用数据库,有很多功能可以使用!


完成一个服务需要注意的问题:

1.异常处理:eg:数据库连接

2.信号量的处理:ctrl + c, kill -9 

3.给服务加日志文件:调试程序的方法有很多:print ,assert,pdb,日志文件。但是最终会发现日志是终极大招,目前我还体会不到,感觉单步调试更方便顺手。

4.给代码加单元测试:这在对代码举行修改更新时,只需要将对应的单元测试再运行一遍即可。

5.在需要存储数据时使用数据库存储数据,最好不要用文件存储。

起初在实现功能时,根本没思考怎么数据,后再肯定了数据必须存储后,思考是用文件存储还是数据库存储。最后服务写完后,认为能用数据库存储数据的都使用数据库存储,万不得已才会采用文件存储,或是文件存储更好,例如 日志。

6.全局变量有被两个进程或是服务同时访问时注意要加Lock。

7. 内存中存储的字段的顺序,数据库存储的字段的顺序最好保持一致;否则在后续将内存数据写入数据库或是将数据库中的数据写入内存时存在顺序对应的问题,比较容易犯错!


销售管理系统第1章 系统登录 系统登录模块主要用于验证用户登录系统时输入的用户名、密码和验证码是否正确,只有合法的用户才可以进入系统,否则将不能进入此系统,系统登录页面如图1.1所示。 图1.1 登录页面 单击“确定”按钮,进入网页首页,如图1.2所示。 图1.2 首页 第2章 基本信息 基本信息主要包括:添加公司信息、添加商品信息、公司信息管理、商品信息管理。 2.1 添加公司信息 在功能导航区中单击“添加公司信息”按钮,在操作区会显示添加页面,如图2.1所示。此页面主要用于添加供应商及客户信息。在“所属类型”下拉列表中选择公司的所属类型,单击“添加”按钮,完成添加操作。 图2.1 添加公司信息 2.2 添加商品信息 在功能导航区中单击“添加公司信息”按钮,在操作区中会显示添加页面。添加商品信息页面的运行效果如图2.2所示。此页面的操作方法请参见2.1节的添加公司信息。 说明:供应商下拉列表中的信息是公司的所属类型为供应商的公司信息。 图2.2 添加商品信息 2.3 公司信息管理 在功能导航区中单击“公司信息管理”按钮,在操作区中会显示公司信息的管理页面。如图2.3所示。此页面主要实现修改及删除公司信息等功能。 图2.3 公司信息管理 公司信息管理的操作方法如下: (1)修改。单击“详细信息”按钮,弹出“修改公司信息”页面,如图2.4所示。可直接在编辑框中修改信息,信息修改完成后单击“修改”按钮,完成修改操作。 图2.4 修改公司信息 (2)删除。直接单击“删除”按钮,即可将该公司数据信息进行删除。 2.4 商品信息管理 在功能导航区中单击“商品信息管理”按钮,在操作区中会显示商品信息的管理页面。如图2.4所示。此页面主要实现修改及删除商品信息等功能。操作方法请参见2.3节的公司信息管理。 图2.4 修改商品信息 第3章 进货管理 进货管理主要包括:添加进货信息、添加进货退货。 3.1 添加进货信息 在功能导航区中单击“添加进货信息”按钮,在操作区中会显示添加进货信息页面。如图3.1所示。在“商品名称”下拉列表中选择进货商品名称,“供应商”自动显示该商品的供应商名称,在其余编辑框中输入完整的进货信息,然后单击“添加”按钮,完成添加操作。 图3.1 添加进货信息 3.2 添加进货退货 在功能导航区中单击“添加进货退货”按钮,在操作区中会显示进货退货页面。如图3.2所示。此页面的操作方法请参见3.1节的添加进货信息。 图3.2 添加进货退货 第4章 销售管理 销售管理主要包括:添加销售信息、添加销售退货。 4.1 添加销售信息 在功能导航区中单击“添加销售信息”按钮,在操作区中会显示添加商品销售信息页面。添加销售信息页面如图4.1所示。此页面主要是用于添加商品销售的详细信息。操作方法请参见3.1节的添加进货信息。 图4.1 添加销售信息 4.2 添加销售退货 在功能导航区中单击“添加销售退货”按钮,在操作区中会显示添加销售退货页面。如图4.2所示。此页面主要是用于添加销售退货的详细信息。操作方法请参见3.2节的添加进货退货。 图4.2 添加销售退货 第5章 查询统计 查询统计主要包括:商品进货查询、进货退货查询、商品销售查询、销售退货查询、商品库存查询、商品销售排行。其中商品进货查询、进货退货查询、商品销售查询、销售退货查询、商品库存查询的操作方法相同,下面以“商品进货查询”为例讲解其操作方法。 5.1 商品进货查询 在功能导航区中单击“商品进货查询”按钮,同时操作区中会显示商品进货查询的页面,如图5.1所示。商品进货查询主要是对商品进货的详细信息进行查询,可根据供应商、商品名称、经手人和起止日期进行复合条件查询。此查询支持模糊查询。 在四个查询条件中任选一个或多个条件,分别勾选其复选框,在编辑框中填写查询条件,单击“查询”按钮,完成查询操作。 单击“详细信息”按钮,可查看该条进货信息。 图5.1 商品进货查询页面 5.2 商品销售排行 在功能导航区中单击“商品销售排行”,在操作区中会显示商品销售排行查询页面,如图5.2所示。商品销售排行主要是根据商品销售量商品按照降序排列。 图5.2 商品销售排行页面 第6章 往来管理 往来管理主要包括:商品进货结账、进货退货结账、商品销售结账、销售退货结账。这个页面的操作方法相同,下面以“商品进货结账”为例讲解其操作方法。 6.1 商品进货结账 在功能导航区中单击“商品进货结账”,在操作区中会显示商品进货结账页面,如图6.1所示。商品进货结账主要是结算没有结算完的帐目。 图6.1 商品进货结账 商品进货结账的操作方法如下: (1)结账。“结账”按钮为不可用状态时,表示该进货信息已结账完毕。为可用状态的表示还有账目没有结算完,只需单击“结账”按钮,进入“结账单”页面,如图6.2所示。在“结款”及“经手人”处输入结款金额和经手人,单击“结账”按钮,完成结账操作。 图6.2 结账单 (2)查看结账记录。单击单据编号处,弹出“详细信息”页面,如图6.3所示。在此页面中单击“查看详细”按钮,即可查看该条记录的结账情况。 图6.3 详细信息 第7章 系统设置 系统设置主要包括:添加用户、修改密码、用户管理、退出登录。 7.1 添加用户 在功能导航区中单击“添加用户”按钮,在操作区中会显示添加用户页面,如图7.1所示。添加用户页面主要是添加管理用户,使系统可以实现多用户管理。在用户名及密码处填写用户名及密码,然后单击“添加”按钮,完成添加操作。 图7.1 添加用户 7.2 修改密码 在功能导航区中单击“修改密码”按钮,在操作区中会显示修改密码页面,如图7.2所示。此页面只可以修改当前操作用户的密码,在密码处添加要修改的密码,然后单击“修改”按钮,完成修改操作。 图7.2 用户修改密码 7.3 用户管理 在功能导航区中单击“用户管理”按钮,在操作区中会显示用户管理页面,如图7.3所示。此页面主要实现修改及删除等功能。 图7.3 用户管理 用户管理页面的操作方法如下: (1)修改。单击“修改”按钮,进入“用户修改密码”页面,如图7.2所示。此修改主要用于修改密码。 (2)删除。单击“删除”按钮,完成删除操作。 7.4 退出登录 在功能导航区中单击“退出登录”按钮,在操作区中会显示退出登录页面,即可退出该系统,进入登录页面。
好的,我已经记录下来了。接下来我将分别回答你的问题: 6. 使用Hive统计性别与购买力的关系,即每类性别群体产生购买行为数量与总购买行为数的比率。 假设hive_test.txt的格式如下: ``` id gender purchase_power 1 male 1000 2 female 800 3 male 1200 4 male 1500 5 female 900 6 male 800 ``` 则可以使用以下Hive SQL语句进行统计: ``` SELECT gender, COUNT(*) AS purchase_count, COUNT(*) / SUM(COUNT(*)) OVER() AS purchase_rate FROM hive_test GROUP BY gender; ``` 其中,COUNT(*)表示每个性别群体的购买行为数量,而COUNT(*) / SUM(COUNT(*)) OVER()表示每类性别群体产生购买行为数量与总购买行为数的比率。 7. 查询当天卖出数量最多的商品品牌和数量。 假设我们有一张表sales,格式如下: ``` id buyer_id brand_id sale_date 1 100101 1 2022-01-01 2 100102 3 2022-01-01 3 100103 1 2022-01-01 4 100104 2 2022-01-02 5 100105 2 2022-01-02 6 100106 3 2022-01-03 ``` 则可以使用以下Hive SQL语句查询当天卖出数量最多的商品品牌和数量: ``` SELECT brand_id, COUNT(*) AS sale_count FROM sales WHERE sale_date = '2022-01-01' GROUP BY brand_id ORDER BY sale_count DESC LIMIT 1; ``` 其中,WHERE子句用于筛选出当天的销售记录,GROUP BY子句用于按照商品品牌分组统计销售数量,ORDER BY子句用于按照销售数量降序排序,LIMIT 1用于限制输出结果只有一行。 8. 查询有点击行为的买家,结果不能有重复。 假设我们有一张表user_click,格式如下: ``` id buyer_id click_time 1 100101 2022-01-01 08:00:00 2 100102 2022-01-01 09:00:00 3 100103 2022-01-01 10:00:00 4 100102 2022-01-01 11:00:00 5 100105 2022-01-01 12:00:00 6 100104 2022-01-01 13:00:00 ``` 则可以使用以下Hive SQL语句查询有点击行为的买家,结果不能有重复: ``` SELECT DISTINCT buyer_id FROM user_click; ``` 其中,DISTINCT关键字用于去重,SELECT子句只选择buyer_id这一列。 9. 统计收货量排名前5的省份。 假设我们有两张表order和address,格式如下: ``` order表: id buyer_id product_id order_date address_id 1 100101 1 2022-01-01 1 2 100102 2 2022-01-01 2 3 100103 3 2022-01-01 3 4 100104 1 2022-01-02 4 5 100105 2 2022-01-02 5 6 100106 3 2022-01-03 1 address表: id province 1 北京 2 上海 3 广东 4 江苏 5 浙江 ``` 则可以使用以下Hive SQL语句统计收货量排名前5的省份: ``` SELECT province, COUNT(*) AS receive_count FROM order JOIN address ON order.address_id = address.id GROUP BY province ORDER BY receive_count DESC LIMIT 5; ``` 其中,JOIN语句用于将order表和address表按照address_id连接起来,GROUP BY子句用于按照省份分组统计收货量,ORDER BY子句用于按照收货量降序排序,LIMIT 5用于限制输出结果只有5行。 10. 查询买家id为100501购买商品商品id)的数量。 假设我们有一张表order,格式如下: ``` id buyer_id product_id order_date address_id 1 100101 1 2022-01-01 1 2 100102 2 2022-01-01 2 3 100103 3 2022-01-01 3 4 100104 1 2022-01-02 4 5 100105 2 2022-01-02 5 6 100106 3 2022-01-03 1 ``` 则可以使用以下Hive SQL语句查询买家id为100501购买商品商品id)的数量: ``` SELECT COUNT(*) AS purchase_count FROM order WHERE buyer_id = 100501 AND product_id = 1; ``` 其中,WHERE子句用于筛选出买家id为100501且购买商品id为1的订单记录,COUNT(*)用于统计符合条件的订单数量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值