首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Pandas滑动窗口,揪出刷单黄牛党!

Pandas滑动窗口,揪出刷单黄牛党!

作者头像
double
发布2021-12-05 10:53:50
发布2021-12-05 10:53:50
7230
举报
文章被收录于专栏:算法channel算法channel

你好,我是 zhenguo

今天这篇文章是一个关于好玩实用的小案例,使用Pandas的滑动窗口方法确定是否存在刷单行为,给予黄牛党致命一击。

滑动窗口可能是你应用没那么多的方法,但是在处理事件序列的场景中,滑动窗口的价值凸显!

批量随机生成时间戳

实现方法

如下批量生成时间戳,random_timestamp函数中,hour传入小时(24小时制)ymd表示年月日,默认为2021-12-01

代码语言:javascript
复制
import random
import pandas as pd

def random_timestamp(hour, ymd='2021-12-01'):
    """
    生成年月日固定,分秒随机的时间戳
    :param ymd:
    :param hour: 传入小时
    :return:
    """

    def tstr():
        tms = set([random.randrange(1, 59, 2) for _ in range(20)])
        return [f'2020-12-01 {hour}:{ms}:{ms}' for ms in tms]

    return [pd.Timestamp(ws) for ws in tstr()]
调用
代码语言:javascript
复制
series = random_timestamp(9)

结果:

代码语言:javascript
复制
[Timestamp('2020-12-01 09:01:01'), Timestamp('2020-12-01 09:35:35'), Timestamp('2020-12-01 09:05:05'), Timestamp('2020-12-01 09:07:07'), Timestamp('2020-12-01 09:09:09'), Timestamp('2020-12-01 09:11:11'), Timestamp('2020-12-01 09:13:13'), Timestamp('2020-12-01 09:19:19'), Timestamp('2020-12-01 09:53:53'), Timestamp('2020-12-01 09:55:55'), Timestamp('2020-12-01 09:23:23'), Timestamp('2020-12-01 09:21:21'), Timestamp('2020-12-01 09:29:29'), Timestamp('2020-12-01 09:31:31')]

使用滑动窗口找出频繁刷单用户

需求

定义在20分钟连续下单为:刷单

给你一批交易数据,类型为pd.Series,确定这批数据是否存在频繁刷单的行为。

使用滑动窗口

Pandas的rolling方法,求出固定滑动窗口长度的序列。

代码语言:javascript
复制
import pandas as pd

def is_outlier(time_series: pd.Series, outlier_duration=20, outlier_count=5):
    """
    outlier_duration分钟内连续交易outlier_count次认为是异常
    :param time_series:
    :param outlier_duration:
    :param outlier_count:
    :return:
    """
    # 排序
    time_series2 = time_series.sort_values()
    # 基于最早时间的时间跨度
    time_delta = (time_series2 - time_series2.iloc[0]) / np.timedelta64(1, 's') / 60.
    # 求得长度为outlier_count的滑动窗口的时间跨度
    time_cumsum = time_delta.rolling(outlier_count).sum()
     # 若outlier_count次交易的时间小于outlier_duration,就是所定义的刷单,返回True
    if (time_cumsum <= outlier_duration).any():
        return True
    # 不存在刷单
    return False
调用

使用小技巧25,生成随机时间戳序列,调用

代码语言:javascript
复制
series = random_timestamp(9) # hour 等于9点
print(series)

result = is_outlier(pd.Series(series))
print(result)
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员郭震zhenguo 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 批量随机生成时间戳
    • 实现方法
    • 调用
  • 使用滑动窗口找出频繁刷单用户
    • 需求
    • 使用滑动窗口
    • 调用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档