В настоящее время я пытаюсь обработать экспериментальный набор данных таймеров, у которого отсутствуют значения. Я хотел бы рассчитать скользящее оконное среднее этого набора данных во времени, обрабатывая значения nan. Правильный способ сделать это - вычислить внутри каждого окна сумму конечных элементов и делить его на их число. Эта нелинейность заставляет меня использовать не сверточные методы решения этой проблемы, поэтому у меня есть суровое узкое место в этой части процесса. В качестве примера кода, что я пытаюсь сделать, я представляю следующее:Python: Скользящее оконное среднее, игнорирование отсутствующих данных
import numpy as np
#Construct sample data
n = 50
n_miss = 20
win_size = 3
data= np.random.random(50)
data[np.random.randint(0,n-1, n_miss)] = None
#Compute mean
result = np.zeros(data.size)
for count in range(data.size):
part_data = data[max(count - (win_size - 1)/2, 0): min(count + (win_size + 1)/2, data.size)]
mask = np.isfinite(part_data)
if np.sum(mask) != 0:
result[count] = np.sum(part_data[mask])/np.sum(mask)
else:
result[count] = None
print 'Input:\t',data
print 'Output:\t',result
с выходом:
Input: [ 0.47431791 0.17620835 0.78495647 0.79894688 0.58334064 0.38068788
0.87829696 nan 0.71589171 nan 0.70359557 0.76113969
0.13694387 0.32126573 0.22730891 nan 0.35057169 nan
0.89251851 0.56226354 0.040117 nan 0.37249799 0.77625334
nan nan nan nan 0.63227417 0.92781944
0.99416471 0.81850753 0.35004997 nan 0.80743783 0.60828597
nan 0.01410721 nan nan 0.6976317 nan
0.03875394 0.60924066 0.22998065 nan 0.34476729 0.38090961
nan 0.2021964 ]
Output: [ 0.32526313 0.47849424 0.5867039 0.72241466 0.58765847 0.61410849
0.62949242 0.79709433 0.71589171 0.70974364 0.73236763 0.53389305
0.40644977 0.22850617 0.27428732 0.2889403 0.35057169 0.6215451
0.72739103 0.49829968 0.30119027 0.20630749 0.57437567 0.57437567
0.77625334 nan nan 0.63227417 0.7800468 0.85141944
0.91349722 0.7209074 0.58427875 0.5787439 0.7078619 0.7078619
0.31119659 0.01410721 0.01410721 0.6976317 0.6976317 0.36819282
0.3239973 0.29265842 0.41961066 0.28737397 0.36283845 0.36283845
0.29155301 0.2021964 ]
Может ли этот результат быть получен путем Numpy операций, без использования для цикла?
Рассматривали ли вы переиндексации и интерполяцией кадра данных, чтобы иметь линейный индекс и использовать [ ' [http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rolling.html) позже? – jdehesa
Если я правильно понял, это не приведет к желаемому результату. Я не хочу игнорировать существование нан-ценностей, их положение имеет значение. Если у меня 3 наса один за другим, результат в среднем элементе с раздвижным окном 3 должен быть нан. Пожалуйста, объясните, если я ошибаюсь. –
Извините, я совсем не читал ваш вопрос! : S – jdehesa