5

一日一技:如何从大量商品数据里面找到降价商品?

 2 years ago
source link: https://www.kingname.info/2022/05/22/find-discount/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

一日一技:如何从大量商品数据里面找到降价商品?

2022-05-22

|

Python

|

0

相信很多做爬虫的同学都会爬电商网站,每天爬一次,然后监控商品是否降价。如果你只监控一个商品,那么是否降价这非常容易判断,但如果你要找到这个网站里面所有降价的商品,那就非常麻烦了。

如下图所示,是美国电商沃尔玛的全站商品数据:

20220516193731.png

每个商品每天都会爬一次,一共有61w+条数据。里面有N个商品降价了,现在需要把这些降价的商品找出来。

商品有十几万个,如果你分别找到每个商品的ID,然后用ID再找到这个商品每一天的数据,最后看它是否降价,这个工作量非常大,速度也会非常慢。

Pandas内部使用了SIMB技术来对并行计算进行优化,我们需要尽量在不使用for循环的情况下,完成这个任务。

为了简单起见,我们假设降价就是指今天比昨天的价格低,不考虑先涨价再降价的情况。

要解决这个问题,我们需要使用DataFrame的pct_change()方法。它就像是reduce一样,给出一系列数据,它会计算数据改变量的百分比——第二条相对于第一条数据的改变,第三条数据相对于第二条数据的改变,第四条数据相对于第三条数据的改变。

首先我们使用date字段对数据进行排序,确保价格是按时间排列的。然后对商品的id进行分组,这样就能拿到每一个商品每天的价格了。然后对price字段使用pct_change()

df2['pct'] = df2.sort_values(['date', 'id']).groupby(['id']).price.pct_change()

运行效果如下图所示:

20220516195027.png

图中最右侧pct字段是NaN,是因为这是这些商品的第一条数据,所以始终是NaN.

我们筛选出今天(2022-05-16),pct小于0的商品:

20220516195318.png

这些就是降价的商品了。我们可以随便筛选一个商品来检查一下:

20220516195454.png

使用pct_change()速度非常快,60w数据几乎秒出。比for循环快多了。

谢乾坤 | Kingname wechat
第一时间获取最新文章更新,请订阅我的微信公众号:未闻Code

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK