我正在寻找一种类似的各种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之间的行,然后第三个窗口窗口包含RollBasis
3到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,然后再执行以下解决