首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Min周期的Numpy滚动窗口&最大值(类似于Pandas滚动,但Numpy)

Min周期的Numpy滚动窗口&最大值(类似于Pandas滚动,但Numpy)
EN

Stack Overflow用户
提问于 2021-06-15 11:47:00
回答 2查看 404关注 0票数 0

我期待(无法看到这个已经涵盖任何地方)创建一个滑动窗口使用numpy而不是pandas.rolling (主要是为了速度)。但是,滑动窗口也必须是窗口中实例的最小和最大数目的函数,并在无法构造窗口时返回NaN。这与pandas.rolling类似,参数设置为窗口大小(最大)和min_periods。例如:

设置Min_periods =3和Max_periods = 7,参见下面指定窗口的示例:

代码语言:javascript
复制
index  values  intended_window
0      10      np.nan
1      11      np.nan
2      12      [10,11,12]
3      13      [10,11,12,13]
4      14      [10,11,12,13,14]
5      15      [10,11,12,13,14,15]
6      16      [10,11,12,13,14,15,16]
7      17      [11,12,13,14,15,16,17]
8      18      [12,12,14,15,16,17,18]
9      19      [13,14,15,16,17,18,19]

我看到了在滑动窗口没有最大或最小要求的情况下如何构造这个滑动窗口的例子。

代码语言:javascript
复制
def rolling_window(a, window):
  shp = a.shape[:-1] + (a.shape[-1] - window + 1, window)
  strides = a.strides + (a.strides[-1],)
  return np.lib.stride_tricks.as_strided(a, shape=shp, strides=strides)

有人知道我如何像上面的例子那样展开它来返回窗口吗?

EN

回答 2

Stack Overflow用户

发布于 2021-06-15 16:57:11

请试试看以下几点。

代码语言:javascript
复制
def dataframe_striding(dataframe, window):
    '''
    Parameters
    ----------
    dataframe : Input Dataframe, in this case df with columns ['index', 'values'] present.
    window : Tuple denoting the window size.

    Returns
    -------
    dataframe : Pandas Dataframe

    '''
    lower_end, upper_end = window 
    if lower_end > upper_end:
        raise ValueError('Check window size!')

    results = []
    for i in range(dataframe.shape[0]):
        l = [k for k in dataframe['values'][:i+1]]        
        if len(l) < lower_end:                 # checks for minimum window length
            l = np.nan
            results.append(l)
        elif lower_end <= len(l) <= upper_end: # checks for required window length
            results.append(l)
        else:                                  # checks for maximum window length
            l = l[-upper_end:]
            results.append(l)
        
     dataframe['rolling_output'] = results     # appends output to input dataframe
     return dataframe 

# run above function #
final_df = dataframe_striding(df, window = (4,6))
票数 1
EN

Stack Overflow用户

发布于 2021-06-15 12:01:24

代码语言:javascript
复制
values = np.linspace(1, 10, num=10)
window_column = []
for i in range(len(values)):
    if i - 7 < 0:
        t = 0
    else:
        t = i - 7
    window = values[t:i]
    if len(window) < 3:
        window_column.append(np.nan)
    else:
        window_column.append(window)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67985651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档