Я хочу реализовать скользящее окно в списке, но вместо окна фиксированной длины я хотел бы предоставить список скользящих окон:
Что-то вроде этого:

l1 = [5, 3, 8, 2, 10, 12, 13, 15, 22, 28]
l2 = [1, 2, 2, 2, 3, 4, 2, 3, 5, 3]
get_custom_roling( l1, l2, np.average)

И результат будет:

[5, 4, 5.5, 5, 6.67, ....]

6,67 рассчитывается как среднее значение 3 элементов 10, 2, 8.

Я реализовал медленное решение, и каждая идея может сделать это быстрее :):

import numpy as np



def get_the_list(end_point, number_points):
   """ 
   example: get_the_list(6, 3) ==> [4, 5, 6]
   example: get_the_list(9, 5) ==> [5, 6, 7, 8, 9]
   """
    if np.isnan(number_points):
        return []
    number_points = int( number_points)
    return list(range(end_point, end_point - number_points, -1  ))

def get_idx(s):
    ss = list(enumerate(s) )
    sss = (get_the_list(*elem)  for elem in ss  )
    return sss

def get_custom_roling(s, ss, funct):
    output_get_idx = get_idx(ss)
    agg_stuff = [s[elem] for elem in output_get_idx]
    res_agg_stuff = [ funct(elem) for elem in agg_stuff   ]
    res_agg_stuff = eiu.pd.Series(data=res_agg_stuff, index = s.index)
    return res_agg_stuff

2
Anouar 12 Окт 2020 в 19:04

1 ответ

Лучший ответ