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

滚动窗口的数据框表示

潘胤
2023-03-14
问题内容

我想要滚动窗口的数据框表示。我想要在滚动窗口上执行一些操作,而不是在另一个窗口中表示该窗口的数据框。这可能是一个pd.Panelnp.arraypd.DataFramepd.MultiIndex

设定

import pandas as pd
import numpy as np

np.random.seed([3,1415])
df = pd.DataFrame(np.random.rand(10, 3).round(2), 
                  columns=['A', 'B', 'C'],
                  index=list('abcdefghij'))

print df

      A     B     C
a  0.44  0.41  0.46
b  0.47  0.46  0.02
c  0.85  0.82  0.78
d  0.76  0.93  0.83
e  0.88  0.93  0.72
f  0.12  0.15  0.20
g  0.44  0.10  0.28
h  0.61  0.09  0.84
i  0.74  0.87  0.69
j  0.38  0.23  0.44

预期产量

对于window = 2我希望结果是。

      0                 1            
      A     B     C     A     B     C
a  0.44  0.41  0.46  0.47  0.46  0.02
b  0.47  0.46  0.02  0.85  0.82  0.78
c  0.85  0.82  0.78  0.76  0.93  0.83
d  0.76  0.93  0.83  0.88  0.93  0.72
e  0.88  0.93  0.72  0.12  0.15  0.20
f  0.12  0.15  0.20  0.44  0.10  0.28
g  0.44  0.10  0.28  0.61  0.09  0.84
h  0.61  0.09  0.84  0.74  0.87  0.69
i  0.74  0.87  0.69  0.38  0.23  0.44

我不确定是否以这种方式显示布局,但这是我想要的信息。我正在寻找实现这一目标的最有效方法。

到目前为止我做了什么

我已经尝试过使用shift各种方式,但是感觉很笨拙。这就是我用来产生以上输出的内容:

print pd.concat([df, df.shift(-1)], axis=1, keys=[0, 1]).dropna()

问题答案:

我们可以使用NumPy使其 深奥地 进入那些滑动窗口中strided tricks。如果您将此新尺寸用于矩阵乘法之类的约简,那将是理想的选择。如果出于某种原因想要2D输出,则需要在最后使用重塑,但这将导致创建副本。

因此,实现看起来像这样-

from numpy.lib.stride_tricks import as_strided as strided

def get_sliding_window(df, W, return2D=0):
    a = df.values                 
    s0,s1 = a.strides
    m,n = a.shape
    out = strided(a,shape=(m-W+1,W,n),strides=(s0,s0,s1))
    if return2D==1:
        return out.reshape(a.shape[0]-W+1,-1)
    else:
        return out

2D / 3D输出的样品运行-

In [68]: df
Out[68]: 
      A     B
0  0.44  0.41
1  0.46  0.47
2  0.46  0.02
3  0.85  0.82
4  0.78  0.76

In [70]: get_sliding_window(df, 3,return2D=1)
Out[70]: 
array([[ 0.44,  0.41,  0.46,  0.47,  0.46,  0.02],
       [ 0.46,  0.47,  0.46,  0.02,  0.85,  0.82],
       [ 0.46,  0.02,  0.85,  0.82,  0.78,  0.76]])

这是3D视图输出的样子-

In [69]: get_sliding_window(df, 3,return2D=0)
Out[69]: 
array([[[ 0.44,  0.41],
        [ 0.46,  0.47],
        [ 0.46,  0.02]],

       [[ 0.46,  0.47],
        [ 0.46,  0.02],
        [ 0.85,  0.82]],

       [[ 0.46,  0.02],
        [ 0.85,  0.82],
        [ 0.78,  0.76]]])

我们将其计时以3D输出各种窗口大小的视图-

In [331]: df = pd.DataFrame(np.random.rand(1000, 3).round(2))

In [332]: %timeit get_3d_shfted_array(df,2) # @Yakym Pirozhenko's soln
10000 loops, best of 3: 47.9 µs per loop

In [333]: %timeit get_sliding_window(df,2)
10000 loops, best of 3: 39.2 µs per loop

In [334]: %timeit get_3d_shfted_array(df,5) # @Yakym Pirozhenko's soln
10000 loops, best of 3: 89.9 µs per loop

In [335]: %timeit get_sliding_window(df,5)
10000 loops, best of 3: 39.4 µs per loop

In [336]: %timeit get_3d_shfted_array(df,15) # @Yakym Pirozhenko's soln
1000 loops, best of 3: 258 µs per loop

In [337]: %timeit get_sliding_window(df,15)
10000 loops, best of 3: 38.8 µs per loop

让我们验证一下我们确实在获取视图-

In [338]: np.may_share_memory(get_sliding_window(df,2), df.values)
Out[338]: True

get_sliding_window甚至跨各种窗口大小的几乎恒定的时间表明获取视图而不是复制具有巨大的好处。



 类似资料:
  • 问题内容: 有没有一种方法可以有效地为Numpy中的1D数组实现滚动窗口? 例如,我有这个纯Python代码段来计算一维列表的滚动标准偏差,其中一维值列表和标准偏差的窗口长度: 有没有办法在Numpy内完全做到这一点,即没有任何Python循环?标准偏差对于而言是微不足道的,但是滚动窗口部分完全使我难过。 我发现这个关于numpy的滚动窗口博客文章,但似乎并没有为一维数组。 问题答案: 只需使用博

  • 问题内容: 我有一个AJAX聊天程序,将消息输出到div溢出:自动,所以如果它太长,则会出现滚动条。有没有办法让它在添加新消息时自动滚动到底部?最好使用jQuery? 问题答案: 这将通过以下行完成 这是将滚动条设置为自己元素的高度 只需在每条新消息中都调用它即可:) 干杯

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

  • 问题内容: 我有一个模态框窗口(弹出窗口),其中包含一个iframe, 并且在该 iframe中 有一个可滚动的 div 。 当我滚动iframe的内部DIV,并且达到其上限或下限时, 浏览器本身的窗口就会开始滚动。这是 不想要的行为 。 我已经尝试过类似的操作, 当鼠标进入弹出框区域时,该操作会在onMouseEnter时终止主窗口滚动: e.preventDefault()由于某些原因无法正常

  • 问题内容: 每当用户接近文档顶部时,我都会尝试向下滚动100px。 当用户接近文档顶部时,我执行了该函数,但是.scrollTo函数不起作用。 我在之前和之后放置了一个警报,以检查它实际上是否是阻止该行的线路,并且只有第一个警报响起,这是代码: 我知道我的jquery页面链接正确,因为我在整个过程中都使用了许多其他jquery函数,而且它们都可以正常工作。我也尝试过从上方删除“ px”,但似乎没有

  • 问题内容: 我需要一个滚动窗口(也称为滑动窗口)可在序列/迭代器/生成器上使用。默认的Python迭代可视为一种特殊情况,其中窗口长度为1。我目前正在使用以下代码。有没有人有一个更蟒蛇,更少冗长,或更有效的方法来做这件事? 问题答案: 117 Python文档的旧版本中有一个带有示例: 文档中的一个更为简洁,我想它可以起到更大的作用。