如何在Python中计算移动平均线
在这篇文章中,我们将看到如何在Python中计算移动平均数。移动平均数指的是一系列固定大小的观察值子集的平均数。它也被称为滚动平均数、运行平均数、滚动平均值或运行平均值。
考虑n个观测值的集合,k是用于确定任何时间t的平均数的窗口的大小。然后通过最初取当前窗口中存在的前k个观测值的平均数并将其存储在列表中来计算移动平均数列表。现在,根据要确定的移动平均数的条件扩大窗口,再次计算窗口中存在的元素的平均数并将其存储在列表中。这个过程一直持续到窗口达到集合的末端。
例如:给定一个由五个整数组成的列表arr=[1, 2, 3, 7, 9],我们需要计算窗口大小为3的列表的移动平均数。 我们将首先计算前三个元素的平均数,并将其作为第一个移动平均数存储。然后,窗口将向右移动一个位置,再次计算窗口中存在的元素的平均值并存储在列表中。类似地,这个过程将重复进行,直到窗口到达数组的最后一个元素。以下是上述方法的说明。
以下是实现:
# Program to calculate moving average
arr = [1, 2, 3, 7, 9]
window_size = 3
i = 0
# Initialize an empty list to store moving averages
moving_averages = []
# Loop through the array to consider
# every window of size 3
while i < len(arr) - window_size + 1:
# Store elements from i to i+window_size
# in list to get the current window
window = arr[i : i + window_size]
# Calculate the average of current window
window_average = round(sum(window) / window_size, 2)
# Store the average of current
# window in moving average list
moving_averages.append(window_average)
# Shift window to right by one position
i += 1
print(moving_averages)
输出:
[2.0, 4.0, 6.33]
简单移动平均线
SMA的计算方法是在当前窗口中存在的某个时间段内,取k(窗口的大小)观测值的非加权平均值。它用于分析趋势。
公式:
其中,
- SMA j = 第j个窗口的简单移动平均数
- k = 窗口的大小
- a i = 观察集合的第i个元素
方法1:使用Numpy
Python的Numpy模块提供了一种简单的方法来计算观察数组的简单移动平均数。它提供了一个名为numpy.sum()的方法,返回给定数组的元素之和。移动平均数可以通过找到窗口中存在的元素的总和并将其除以窗口大小来计算。
# Program to calculate moving average using numpy
import numpy as np
arr = [1, 2, 3, 7, 9]
window_size = 3
i = 0
# Initialize an empty list to store moving averages
moving_averages = []
# Loop through the array t o
#consider every window of size 3
while i < len(arr) - window_size + 1:
# Calculate the average of current window
window_average = round(np.sum(arr[
i:i+window_size]) / window_size, 2)
# Store the average of current
# window in moving average list
moving_averages.append(window_average)
# Shift window to right by one position
i += 1
print(moving_averages)
输出:
[2.0, 4.0, 6.33]
方法2:使用Pandas
Python的Pandas模块提供了一种简单的方法来计算一系列观测值的简单移动平均数。它提供了一个名为pandas.Series.rolling(window_size)的方法,返回一个指定大小的滚动窗口。窗口的平均值可以通过对上面得到的窗口对象使用pandas.Series.mean()函数来计算。pandas.Series.rolling(window_size)将返回一些空系列,因为它需要至少k(窗口的大小)元素来进行滚动。
# Python program to calculate
# simple moving averages using pandas
import pandas as pd
arr = [1, 2, 3, 7, 9]
window_size = 3
# Convert array of integers to pandas series
numbers_series = pd.Series(arr)
# Get the window of series
# of observations of specified window size
windows = numbers_series.rolling(window_size)
# Create a series of moving
# averages of each window
moving_averages = windows.mean()
# Convert pandas series back to list
moving_averages_list = moving_averages.tolist()
# Remove null entries from the list
final_list = moving_averages_list[window_size - 1:]
print(final_list)
输出:
[2.0, 4.0, 6.33]
累计移动平均数
CMA的计算方法是取截至计算时间的所有观测值的未加权平均值。它用于时间序列分析。
公式:
其中:
- CMA t = 时间t的累积移动平均数
- k t = 截止到时间t的观测值的数量
- ai = 观察值集合的第i个元素
方法1:使用Numpy
Python的Numpy模块提供了一种简单的方法来计算观察数组的累积移动平均数。它提供了一个名为numpy.cumsum()的方法,返回给定数组元素的累积和。移动平均数可以通过将元素的累积和除以窗口大小来计算。
# Program to calculate cumulative moving average
# using numpy
import numpy as np
arr = [1, 2, 3, 7, 9]
i = 1
# Initialize an empty list to store cumulative moving
# averages
moving_averages = []
# Store cumulative sums of array in cum_sum array
cum_sum = np.cumsum(arr);
# Loop through the array elements
while i <= len(arr):
# Calculate the cumulative average by dividing
# cumulative sum by number of elements till
# that position
window_average = round(cum_sum[i-1] / i, 2)
# Store the cumulative average of
# current window in moving average list
moving_averages.append(window_average)
# Shift window to right by one position
i += 1
print(moving_averages)
输出:
[1.0, 1.5, 2.0, 3.25, 4.4]
方法2:使用Pandas
Python的Pandas模块提供了一种简单的方法来计算一系列观测值的累积移动平均数。它提供了一个名为pandas.Series.expanding()的方法,该方法返回一个横跨到时间t之前的所有观测值的窗口。
# Python program to calculate
# cumulative moving averages using pandas
import pandas as pd
arr = [1, 2, 3, 7, 9]
window_size = 3
# Convert array of integers to pandas series
numbers_series = pd.Series(arr)
# Get the window of series of
# observations till the current time
windows = numbers_series.expanding()
# Create a series of moving averages of each window
moving_averages = windows.mean()
# Convert pandas series back to list
moving_averages_list = moving_averages.tolist()
print(moving_averages_list)
输出:
[1.0, 1.5, 2.0, 3.25, 4.4]
指数式移动平均数
EMA的计算方法是在一个时间段内取观察值的加权平均值。观察值的权重随着时间的推移呈指数式下降。它用于分析最近的变化。
公式:
其中:
- EMA t = 时间t的指数移动平均数
- α = 观察值的重量随时间下降的程度
- a t = 时间t的观察
# Program to calculate exponential
# moving average using formula
import numpy as np
arr = [1, 2, 3, 7, 9]
x=0.5 # smoothening factor
i = 1
# Initialize an empty list to
# store exponential moving averages
moving_averages = []
# Insert first exponential average in the list
moving_averages.append(arr[0])
# Loop through the array elements
while i < len(arr):
# Calculate the exponential
# average by using the formula
window_average = round((x*arr[i])+
(1-x)*moving_averages[-1], 2)
# Store the cumulative average
# of current window in moving average list
moving_averages.append(window_average)
# Shift window to right by one position
i += 1
print(moving_averages)
输出:
[1, 1.5, 2.25, 4.62, 6.81]
方法1:使用Pandas
Python的Pandas模块提供了一种简单的方法来计算一系列观测值的指数移动平均数。它提供了一个名为pandas.Series.ewm.mean()的方法来计算给定观测值的指数移动平均数。pandas.Series.ewm()需要一个名为平滑系数的参数,即观测值的权重随时间的推移而减少的程度。平滑化因子的值总是在0到1之间。
# Python program to
# calculate exponential moving averages
import pandas as pd
arr = [1, 2, 3, 7, 9]
# Convert array of integers to pandas series
numbers_series = pd.Series(arr)
# Get the moving averages of series
# of observations till the current time
moving_averages = round(numbers_series.ewm(
alpha=0.5, adjust=False).mean(), 2)
# Convert pandas series back to list
moving_averages_list = moving_averages.tolist()
print(moving_averages_list)
输出:
[1.0, 1.5, 2.25, 4.62, 6.81]
应用
1.时间序列分析。它被用来平滑短期变化,并突出长期观察,如趋势和周期。
2.金融分析。它用于股票市场的财务分析,如计算股票价格、收益和分析市场的趋势。
3.环境工程。它用于分析环境条件,考虑各种因素,如污染物的浓度等。
4.计算机性能分析。它通过计算平均CPU利用率、平均进程队列长度等指标,用于分析计算机性能。