V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
keroppi
V2EX  ›  Python

pandas 怎么对比当前行的前面 7 天的所有某列的数字?

  •  
  •   keroppi · 2021-11-10 23:29:26 +08:00 · 2405 次点击
    这是一个创建于 1087 天前的主题,其中的信息可能已经有所发展或是发生改变。
    商场每天销售额都有记录(按天统计),其中有一列是总销售额(total),现需求是:用总销售额计算每一天与过去 N 天(例如一周 7 天)进行对比,找出两个结果:
    1 当天是不是过去一周( 7 )销售额最低的
    2 如果不是,过去一周哪天最低的销售额是多少?


    我尝试过用遍历 range(1, 8),然后 shift(1), shift(2) 这样总感觉不太科学,不知道有各位大佬有更加方便的办法?
    8 条回复    2021-11-21 18:20:47 +08:00
    keroppi
        1
    keroppi  
    OP
       2021-11-10 23:33:41 +08:00
    我目前自己写的代码(第 2 个要求还没搞)
    ```
    for i in range(1, end_num):

    df['prev_row'] = df['total'].shift(i)

    df['range_compare_result'] = df['total'].lt(df['prev_row'])

    del df['prev_row']
    # end for
    ```
    necomancer
        2
    necomancer  
       2021-11-11 00:38:01 +08:00
    In [2]: ret = []

    In [2]: for i in range(7, a.shape[0]+1):
    ...: m = np.argmin(a[i-7:i]) +i -7
    ...: ret.append((m, a[m], m==i-1))
    ...:

    In [3]: ret
    Out[3]:
    [(4, 0.1070058697941636, False), # (绝对索引,值,当日是否为当周(前 7 日)最低)
    (4, 0.1070058697941636, False),
    (4, 0.1070058697941636, False),
    (4, 0.1070058697941636, False),
    (4, 0.1070058697941636, False),
    (7, 0.38082268305528855, False),
    (7, 0.38082268305528855, False),
    (13, 0.3198102115371413, True),
    (13, 0.3198102115371413, False),
    (15, 0.26007158139013975, True),
    (15, 0.26007158139013975, False),
    (15, 0.26007158139013975, False),
    (18, 0.1774755070886418, True),
    (18, 0.1774755070886418, False)]

    In [4]: a
    Out[4]:
    array([0.59171944, 0.95287085, 0.56036765, 0.91771266, 0.10700587,
    0.67920182, 0.40034268, 0.38082268, 0.81140219, 0.78271362,
    0.43178875, 0.7328393 , 0.93324926, 0.31981021, 0.74938937,
    0.26007158, 0.33768583, 0.78881252, 0.17747551, 0.27862649])
    ThirdFlame
        3
    ThirdFlame  
       2021-11-11 08:53:46 +08:00
    用 query
    dongxiao
        4
    dongxiao  
       2021-11-11 09:58:45 +08:00   ❤️ 1
    pandas 先 rolling 后 聚合,比如以每一天与过去 7 天做比较:
    1. dataframe.rolling("7d").min() == dataframe
    2. dataframe.rolling("7d").min()
    princelai
        5
    princelai  
       2021-11-11 10:07:40 +08:00
    ```
    df = pd.DataFrame(np.random.randint(10,50,30),index=pd.date_range(start='2021-01-01',periods=30),columns=["sales"])
    df['pass_min'] = df.rolling(window=7, min_periods=1)['sales'].min()
    df['is_min'] = df.sales==df.pass_min
    ```

    这样吗?
    Nehcknarf
        6
    Nehcknarf  
       2021-11-12 09:23:58 +08:00   ❤️ 1
    滑动窗口 rolling().min()
    和 query 判等应该可以解决
    UN2758
        7
    UN2758  
       2021-11-12 16:57:32 +08:00
    4 ,6 说得对
    shm7
        8
    shm7  
       2021-11-21 18:20:47 +08:00
    学习了,还有 rooling 这个方法
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2770 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 14:37 · PVG 22:37 · LAX 07:37 · JFK 10:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.