Вот простой иллюстративный пример того, как свойства двойного подчеркивания могут влиять на унаследованный класс. Итак, со следующей настройкой:
class parent(object):
__default = "parent"
def __init__(self, name=None):
self.default = name or self.__default
@property
def default(self):
return self.__default
@default.setter
def default(self, value):
self.__default = value
class child(parent):
__default = "child"
, если вы затем создадите дочерний экземпляр в REPL python, вы увидите ниже
child_a = child()
child_a.default # 'parent'
child_a._child__default # 'child'
child_a._parent__default # 'parent'
child_b = child("orphan")
## this will show
child_b.default # 'orphan'
child_a._child__default # 'child'
child_a._parent__default # 'orphan'
Это может быть очевидно для некоторых, но он поймал меня на страже в гораздо более сложной среде
Перед тем, как прочитать этот ответ, имейте в виду, что есть еще один ответ ниже, от Романа Х, который использует
blockquote>numpy.cumsum
и МНОГО БОЛЬШИХ ФАКТОРОВ, чем этот.
Наилучший Один из распространенных способов применения среднего / скользящего среднего (или любой другой функции скользящего окна) к сигналу с помощью
numpy.convolve()
.def movingaverage(interval, window_size): window = numpy.ones(int(window_size))/float(window_size) return numpy.convolve(interval, window, 'same')
Здесь интервал является вашим
x
массив, аwindow_size
- количество рассматриваемых образцов. Окно будет центрировано по каждому образцу, поэтому для вычисления среднего значения выборки берут образцы до и после текущего образца. Ваш код станет:plot(x,y) xlim(0,1000) x_av = movingaverage(interval, r) plot(x_av, y) xlabel("Months since Jan 1749.") ylabel("No. of Sun spots") show()
Надеюсь, это поможет!
Скользящее среднее - это свертка, а numpy будет быстрее, чем большинство операций чистого python. Это даст вам 10-точечную скользящую среднюю.
import numpy as np
smoothed = np.convolve(data, np.ones(10)/10)
Я также настоятельно рекомендую использовать большой пакет pandas, если вы работаете с данными таймсеристов. Есть несколько хороших операций скользящей средней, построенных в .
Я думаю, что-то вроде:
aves = [sum(data[i:i+6]) for i in range(0, len(data), 5)]
Но мне всегда нужно дважды проверять, что индексы делают то, что я ожидаю. Диапазон, который вы хотите (0, 5, 10, ...) и данные [0: 6], предоставят вам данные [0] ... данные [5]
ETA: oops, и вы Конечно, хотите аве, а не суммировать. Так что, фактически, используя ваш код и формулу:
r = 5
x = data[:,0]
y1 = data[:,1]
y2 = [ave(y1[i-r:i+r]) for i in range(r, len(y1), 2*r)]
y = [y1, y2]
Функция Moving Average без функции numpy:
from __future__ import division # must be on first line of script
class Solution:
def Moving_Avg(self,A):
m = A[0]
B = []
B.append(m)
for i in range(1,len(A)):
m = (m * i + A[i])/(i+1)
B.append(m)
return B
1
: m = (m * i + A[i])/(i+1.)
– Bennett Brown
2 August 2017 в 14:38
Существует проблема с принятым ответом. Я думаю, что здесь нужно использовать «valid» вместо «same» здесь return numpy.convolve(interval, window, 'same')
.
В качестве примера попробуйте MA этого набора данных = [1,5,7,2,6,7,8,2,2,7,8,3,7,3,7,3,15,6]
- результат должен быть [4.2,5.4,6.0,5.0,5.0,5.2,5.4,4.4,5.4,5.6,5.6,4.6,7.0,6.8]
, но с «одинаковым» дает неверный вывод [2.6,3.0,4.2,5.4,6.0,5.0,5.0,5.2,5.4,4.4,5.4,5.6,5.6, 4.6,7.0,6.8,6.2,4.8]
кода Rusty, чтобы попробовать это: -
result=[]
dataset=[1,5,7,2,6,7,8,2,2,7,8,3,7,3,7,3,15,6]
window_size=5
for index in xrange(len(dataset)):
if index <=len(dataset)-window_size :
tmp=(dataset[index]+ dataset[index+1]+ dataset[index+2]+ dataset[index+3]+ dataset[index+4])/5.0
result.append(tmp)
else:
pass
result==movingaverage(y, window_size)
Попробуйте это с действительным & amp; то же самое и посмотреть, имеет ли смысл математика.
'valid'
в convolve
и получил ошибку ValueError: x and y must have same first dimension
. Я проверил длину моего массива, и они были такими же. Я даже сделал x = numpy.array(data[:,0]) y = numpy.array(data[:,1])
, но у меня все еще была такая же ошибка.
– dingo_d
29 August 2015 в 13:07
Поскольку numpy.convolve довольно медленный, тем, кто нуждается в быстродействующем решении, может быть проще понять подход cumsum . Вот код:
cumsum_vec = numpy.cumsum(numpy.insert(data, 0, 0))
ma_vec = (cumsum_vec[window_width:] - cumsum_vec[:-window_width]) / window_width
, где data содержит ваши данные, а ma_vec будет содержать скользящие средние window_width длина
В среднем, cumsum примерно в 30-40 раз быстрее, чем свертывает .
ravgs = [sum(data[i:i+5])/5. for i in range(len(data)-4)]
Это не самый эффективный подход, но он даст вам ответ, и я не знаю, будет ли ваше окно 5 баллов или 10. Если его 10, замените каждый 5 на 10 и 4 на 9.
linspace
иloadtxt
. Вы должны добавитьones
иconvolve
к этому: o) – heltonbiker 5 July 2012 в 22:04