当前位置: 首页 > 面试题库 >

基于值而不是计数的带有窗口的pandas滚动计算

谭嘉歆
2023-03-14
问题内容

我正在寻找一种类似的各种rolling_*功能的方法pandas,但我希望滚动计算的窗口由一个值范围(例如,DataFrame列的值范围)定义,而不是由窗口中的行数。

例如,假设我有以下数据:

>>> print d
   RollBasis  ToRoll
0          1       1
1          1       4
2          1      -5
3          2       2
4          3      -4
5          5      -2
6          8       0
7         10     -13
8         12      -2
9         13      -5

如果执行类似的操作rolling_sum(d, 5),则会得到一个滚动总和,其中每个窗口包含5行。但是我想要的是一个滚动总和,其中每个窗口都包含的一定范围的值RollBasis。也就是说,我希望能够执行类似的操作d.roll_by(sum, 'RollBasis', 5),并得到一个结果,其中第一个窗口包含所有RollBasis介于1和5之间的行,然后第二个窗口包含所有RollBasis介于2和6之间的行,然后第三个窗口窗口包含RollBasis3到7之间的所有行,以此类推。窗口的行数不相等,但是RollBasis在每个窗口中选择的值范围将相同。所以输出应该像这样:

>>> d.roll_by(sum, 'RollBasis', 5)
    1    -4    # sum of elements with 1 <= Rollbasis <= 5
    2    -4    # sum of elements with 2 <= Rollbasis <= 6
    3    -6    # sum of elements with 3 <= Rollbasis <= 7
    4    -2    # sum of elements with 4 <= Rollbasis <= 8
    # etc.

我无法使用进行此操作groupby,因为groupby始终会产生不相交的组。我不能通过滚动功能来做到这一点,因为它们的窗口总是按行数而不是值滚动。那我该怎么办呢?


问题答案:

我认为这可以满足您的需求:

In [1]: df
Out[1]:
   RollBasis  ToRoll
0          1       1
1          1       4
2          1      -5
3          2       2
4          3      -4
5          5      -2
6          8       0
7         10     -13
8         12      -2
9         13      -5

In [2]: def f(x):
   ...:     ser = df.ToRoll[(df.RollBasis >= x) & (df.RollBasis < x+5)]
   ...:     return ser.sum()

上面的函数采用一个值(在这种情况下为RollBasis),然后根据该值对数据框列ToRoll进行索引。返回的系列由满足RollBasis +
5标准的ToRoll值组成。最后,对该系列求和并返回。

In [3]: df['Rolled'] = df.RollBasis.apply(f)

In [4]: df
Out[4]:
   RollBasis  ToRoll  Rolled
0          1       1      -4
1          1       4      -4
2          1      -5      -4
3          2       2      -4
4          3      -4      -6
5          5      -2      -2
6          8       0     -15
7         10     -13     -20
8         12      -2      -7
9         13      -5      -5

玩具示例DataFrame的代码,以防其他人尝试:

In [1]: from pandas import *

In [2]: import io

In [3]: text = """\
   ...:    RollBasis  ToRoll
   ...: 0          1       1
   ...: 1          1       4
   ...: 2          1      -5
   ...: 3          2       2
   ...: 4          3      -4
   ...: 5          5      -2
   ...: 6          8       0
   ...: 7         10     -13
   ...: 8         12      -2
   ...: 9         13      -5
   ...: """

In [4]: df = read_csv(io.BytesIO(text), header=0, index_col=0, sep='\s+')


 类似资料:
  • 问题内容: 样本数据可能会有助于解释我想做的事情,而不是解释它,因此,我将从此开始。 这是我目前正在使用的数据: 我正在尝试在15分钟的时间内滚动显示此数据中的出现次数。该数据的预期结果如下: 样本数据: 我可以通过以下方式 使它 起作用: 但是,我想避免使用子查询,而建议使用(或其他任何可能的解决方案)解决方案。 这可能吗?还是子查询是正确的解决方案? 问题答案: 一种方法-如果表很大,可能比嵌

  • 问题内容: 考虑一下您有一些不均匀的时间序列数据: 假设我想在1ms的时间内进行滚动求和: 目前,我将所有内容都放回多头,并在cython中进行,但是在纯熊猫中有可能吗?我知道您可以执行.asfreq(’U’)之类的操作,然后填充并使用传统函数,但是一旦行数超过玩具数量,就无法缩放。 作为参考,这是一个骇人的,不是快速的Cython版本: 在更大的系列上对此进行演示: 问题答案: 您可以使用求和和

  • 我是Flink Streaming API的新手,我想完成以下简单(IMO)任务。我有两个流,我想使用基于计数的窗口加入它们。到目前为止,我拥有的代码如下: 我的代码可以正常工作,但不会产生任何结果。实际上,从未调用方法(通过在调试模式下添加断点进行验证)。我认为,前面的主要原因是我的数据没有时间属性。因此,窗口化(通过实现)没有正确完成。因此,我的问题是如何表示我希望根据计数窗口进行加入。例如,

  • 问题内容: 我有一个ExpandableListView项目,在清单项目上有TextView,它带有两个按钮来增加或减少点击时TextView中的值。每当我尝试滚动列表时,都会出现此问题。如果我增加一项,然后滚动列表,则值会混合(因为ListView不断回收其视图),而且我不知道如何解决它。 我已经尝试了许多在这里找到的失灵,所以是的,这可能是重复的,但是我无法用发现的任何方法解决我的问题。 我的

  • 问题内容: 如何获得pandas系列值的某个长度n的滚动值? 例如,如果我有以下内容: 我如何获得长度为n的移动值,即类似,如果n = 3: [NaN,NaN,0],[NaN,0,1],…,[4,8.8,7.12] 编辑:如果我使用熊猫滚动,如: 然后滚动是该系列的移动平均线。在这里,我不希望每个移动的3个值集合的平均值,而是这些3个值的集合。 问题答案: 我认为您需要先添加s,然后再执行以下解决