相信很多做爬虫的同学都会每天爬一次电商网站,然后监控商品是否降价。如果只监控一个商品,判断是否降价是很容易的,但是如果要查找本网站所有降价的商品,就很麻烦了。如下图,是美国电商沃尔玛的商品总数据:每个商品每天爬取一次,一共61w+条数据。有N个产品降价了,现在我们要找出这几个降价的。有数十万种产品。如果分别找到每个商品的ID,然后每天用这个ID去查找这个商品的数据,最后查看是否降价了,工作量会很大,速度也会很慢。Pandas内部使用SIMB技术来优化并行计算。我们需要尽量在不使用for循环的情况下完成这个任务。为了简单起见,我们假设降价是指今天的价格低于昨天的价格,不管是先提后降的情况。为了解决这个问题,我们需要使用DataFrame的pct_change()方法。就像reduce,给定一系列数据,它会计算数据变化的百分比——第二条数据相对于第一条数据的变化,第三条数据相对于第二条数据的变化data,第四条数据第一条数据相对于第三条数据的变化。首先,我们使用日期字段对数据进行排序,以确保价格按时间排序。然后对商品的id进行分组,这样就可以得到每个商品的每日价格。然后在price字段上使用pct_change():df2['pct']=df2.sort_values(['date','id']).groupby(['id']).price.pct_change()效果如图在下图中显示:图中最右边的pct字段为NaN,因为这是这些商品的第一条数据,所以一直为NaN。我们今天(2022-05-16)过滤掉pct小于0的商品:这些是商品的降价。我们可以随机筛选一个产品来查看:使用pct_change()速度非常快,几乎秒级就输出了60w条数据。比for循环快得多。
