【问题标题】:Pandas Timeseries: Keep only one value peer week and idPandas 时间序列:每周只保留一个值和 id
【发布时间】:2024-01-19 23:20:01
【问题描述】:

问题

我有一个保存时间序列的 mysql 数据库(对于每个客户和客户帐户余额的日期)。每周可能有多个值。可以假定日期列是一个有效且完整的日期时间对象。每个客户和每周可能有多个条目,但我想每周只保留一个值。 我查询数据库并从中构造相应的 pandas 数据框。

约束:

  • 大多数情况下,每周的星期二都会有值
  • 有时星期二可能没有值,然后取该周的下一个可能值
+-------------+------------+---------+
| customer_id |    date    | balance |
+-------------+------------+---------+
|          01 | 01.01.2020 | 50$     |
|          02 | 01.01.2020 | 40$     |
|          01 | 02.01.2020 | 40$     |
|          01 | 08.01.2020 | 60$     |
+-------------+------------+---------+

解决方案

一个解决方案包含:

  • 每周为每位客户提供一个值(同行周/天没有重​​复值)
  • 该值是最早的可能值

在示例中,这将是这样的:

+-------------+------------+---------+
| customer_id |    date    | balance |
+-------------+------------+---------+
|          01 | 01.01.2020 | 50$     |  
|          02 | 01.01.2020 | 40$     |
|          01 | 08.01.2020 | 60$     | 
+-------------+------------+---------+

如何解决/问题

我可以迭代数据框,并为每个 id 和周选择一周内的第一个值并将其保存到新的 df / 删除所有其他条目。 这似乎相当低效。是否有更适合熊猫的解决方案,或者我什至可以改进 mysql 查询以根据需要过滤掉数据?

【问题讨论】:

    标签: python pandas time-series


    【解决方案1】:

    您可以将date 更改为句号和分组:

    df.groupby([df.date.dt.to_period('W-TUE'), 
                df['customer_id']]).head(1)
    

    输出:

      customer_id       date  balance
    0          01 2020-01-01       50
    1          02 2020-01-01       40
    3          01 2020-01-08       60
    

    【讨论】:

    • 'W-TUE' 表示每周二,这是否意味着它每周二只选择值?如果一个客户在给定的星期二有两个值,而在星期三只有一个值怎么办?会涵盖这些情况吗?
    • 这意味着你的星期从星期二开始。 Pandas 默认是从星期一开始的一周。
    • 好的,我刚刚检查了数据,它的工作原理非常酷。我假设头部为每个组选择第一个值,对吗?为什么它不只返回完整数据帧的头部(所以总共只有一行)。
    • 还有一个更重要的问题:是否存在这样的情况会导致余额汇总?比如说,我必须在同一日期为客户(50、50)输入条目,我可以在那个日期结束 100 吗?
    • head(1) 替换为sum(),您将获得每周总和。