是否有一个scipy函数或numpy函数或模块用于python,在给定特定窗口的情况下计算一维数组的运行平均值?
我再次使用Python,我找到了一本带有例子的简洁书.其中一个例子是绘制一些数据.我有一个包含两列的.txt文件,我有数据.我把数据绘制得很好,但是在练习中它说:进一步修改程序以计算和绘制数据的运行平均值,定义如下:
$Y_k=\frac{1}{2r}\sum_{m=-r}^r y_{k+m}$
Run Code Online (Sandbox Code Playgroud)
其中r=5在此情况下(以及y_k在数据文件中的第二列).让程序在同一图表上绘制原始数据和运行平均值.
到目前为止我有这个:
from pylab import plot, ylim, xlim, show, xlabel, ylabel
from numpy import linspace, loadtxt
data = loadtxt("sunspots.txt", float)
r=5.0
x = data[:,0]
y = data[:,1]
plot(x,y)
xlim(0,1000)
xlabel("Months since Jan 1749.")
ylabel("No. of Sun spots")
show()
Run Code Online (Sandbox Code Playgroud)
那么如何计算总和呢?在Mathematica中它很简单,因为它是符号操作(例如Sum [i,{i,0,10}]),但是如何计算python中的sum,它取数据中的每十个点并对其进行平均,直到结束分数?
我看了看这本书,却发现没有什么可以解释这个:
heltonbiker的代码诀窍^^:D
from __future__ import division
from pylab import plot, ylim, xlim, show, xlabel, ylabel, grid
from numpy import linspace, loadtxt, ones, convolve
import numpy as numpy
data = loadtxt("sunspots.txt", float)
def movingaverage(interval, …Run Code Online (Sandbox Code Playgroud) 如何获得NumPy中的指数加权移动平均值,就像下面的熊猫一样?
import pandas as pd
import pandas_datareader as pdr
from datetime import datetime
# Declare variables
ibm = pdr.get_data_yahoo(symbols='IBM', start=datetime(2000, 1, 1), end=datetime(2012, 1, 1)).reset_index(drop=True)['Adj Close']
windowSize = 20
# Get PANDAS exponential weighted moving average
ewm_pd = pd.DataFrame(ibm).ewm(span=windowSize, min_periods=windowSize).mean().as_matrix()
print(ewm_pd)
Run Code Online (Sandbox Code Playgroud)
我用NumPy尝试了以下内容
import numpy as np
import pandas_datareader as pdr
from datetime import datetime
# From this post: http://stackoverflow.com/a/40085052/3293881 by @Divakar
def strided_app(a, L, S): # Window len = L, Stride len/stepsize = S
nrows = ((a.size - …Run Code Online (Sandbox Code Playgroud) 我正在写一个移动平均函数,它使用numpy中的convolve函数,它应该等于a(加权移动平均值).当我的权重都相等时(如简单的算术平均值),它可以正常工作:
data = numpy.arange(1,11)
numdays = 5
w = [1.0/numdays]*numdays
numpy.convolve(data,w,'valid')
Run Code Online (Sandbox Code Playgroud)
给
array([ 3., 4., 5., 6., 7., 8.])
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用加权平均值时
w = numpy.cumsum(numpy.ones(numdays,dtype=float),axis=0); w = w/numpy.sum(w)
Run Code Online (Sandbox Code Playgroud)
而不是(对于相同的数据)3.667,4.667,5.667,6.667,...我希望,我得到
array([ 2.33333333, 3.33333333, 4.33333333, 5.33333333, 6.33333333,
7.33333333])
Run Code Online (Sandbox Code Playgroud)
如果我删除'有效'标志,我甚至看不到正确的值.我真的想使用卷积为WMA和MA,因为它使代码更清晰(相同的代码,不同的权重),否则我认为我将不得不遍历所有数据并采取切片.
关于这种行为的任何想法?
考虑一下 df
tidx = pd.date_range('2012-12-31', periods=11, freq='D')
df = pd.DataFrame(dict(A=np.arange(len(tidx))), tidx)
df
Run Code Online (Sandbox Code Playgroud)
我想计算一个过去5天,每3天的总和.
我期待看起来像这样的东西
这被编辑
了我的错误.@ivan_pozdeev和@boud注意到这是一个居中的窗口,这不是我的意图.混淆的应用.
每个人的解决方案都捕获了我追求的大部分内容.
标准
我正在寻找可以扩展到大型数据集的智能高效解决方案.
我将提供解决方案并考虑优雅.
解决方案也应该适用于各种样本和回溯频率.
来自评论
5D并且可能有4或50个观察属于该回顾.我编写了下面的函数,以便根据所需的 SMA 公式查找 csv 文件的 SMA,但是,我的公式有问题,我无法弄清楚。
def SMA_calculation(t, w):
s = np.size(t)
g = np.zeros(s)
for i in range(0, s):
if i < w-1:
g[i] = np.NaN
else:
g[i] = np.mean(t[i-w:i])
return g
Run Code Online (Sandbox Code Playgroud) 我有一个时间序列"Ser",我想用滚动窗口计算波动率(标准偏差).我当前的代码正确地以这种形式执行:
w=10
for timestep in range(length):
subSer=Ser[timestep:timestep+w]
mean_i=np.mean(subSer)
vol_i=(np.sum((subSer-mean_i)**2)/len(subSer))**0.5
volList.append(w_i)
Run Code Online (Sandbox Code Playgroud)
这在我看来非常低效.Pandas是否具有内置功能来执行此类操作?
我正在寻找一种快速计算滚动总和的方法,可能使用Numpy.这是我的第一种方法:
def func1(M, w):
Rtn = np.zeros((M.shape[0], M.shape[1]-w+1))
for i in range(M.shape[1]-w+1):
Rtn[:,i] = np.sum(M[:, i:w+i], axis=1)
return Rtn
M = np.array([[0., 0., 0., 0., 0., 1., 1., 0., 1., 1., 1., 0., 0.],
[0., 0., 1., 0., 1., 0., 0., 0., 0., 0., 0., 1., 1.],
[1., 1., 0., 1., 0., 0., 0., 1., 0., 0., 0., 0., 0.]])
window_size = 4
print func1(M, window_size)
[[ 0. 0. 1. 2. 2. 3. 3. 3. 3. 2.]
[ 1. 2. …Run Code Online (Sandbox Code Playgroud) 我有一个数组,想要找到两个数字之间的平均值,并在两个数字之间添加一个附加元素。例如,如果我从
x = np.array([1, 3, 5, 7, 9])
Run Code Online (Sandbox Code Playgroud)
我想结束
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?
有一个numpy方法在区间中每三个元素做一个总和?例如:
import numpy as np
mydata = np.array([4, 2, 3, 8, -6, 10])
Run Code Online (Sandbox Code Playgroud)
我想得到这个结果:
np.array([9, 13, 5, 12])
Run Code Online (Sandbox Code Playgroud) python ×10
numpy ×9
pandas ×3
performance ×2
average ×1
math ×1
matplotlib ×1
plot ×1
python-2.7 ×1
scipy ×1
sum ×1