翼度科技»论坛 编程开发 python 查看内容

在Python中计算移动平均值的方法

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15
前言

在这篇文章中,我们将看到如何在Python中计算移动平均值。移动平均是指总观测值集合中固定大小子集的一系列平均值。它也被称为滚动平均。
考虑n个观测值的集合,k是用于确定任何时间t的平均值的窗口的大小。然后,移动平均列表通过最初取当前窗口中存在的前k个观测值的平均值并将其存储在列表中来计算。现在,根据要确定的移动平均值的条件来扩展窗口,并且再次计算窗口中存在的元素的平均值并将其存储在列表中。这个过程一直持续到窗口到达集合的末尾。
例如:给定一个包含五个整数的列表 arr=[1,2,3,7,9],我们需要计算窗口大小为3的列表的移动平均值。我们将首先计算前3个元素的平均值,并将其存储为第一个移动平均值。然后窗口将向右移动一个位置,并再次计算窗口中存在的元素的平均值并存储在列表中。类似地,该过程将重复,直到窗口到达数组的最后一个元素。以下是对上述方法的说明:

下面是实现:
  1. # Program to calculate moving average
  2. arr = [1, 2, 3, 7, 9]
  3. window_size = 3

  4. i = 0
  5. # Initialize an empty list to store moving averages
  6. moving_averages = []

  7. # Loop through the array to consider
  8. # every window of size 3
  9. while i < len(arr) - window_size + 1:
  10.        
  11.         # Store elements from i to i+window_size
  12.         # in list to get the current window
  13.         window = arr[i : i + window_size]

  14.         # Calculate the average of current window
  15.         window_average = round(sum(window) / window_size, 2)
  16.        
  17.         # Store the average of current
  18.         # window in moving average list
  19.         moving_averages.append(window_average)
  20.        
  21.         # Shift window to right by one position
  22.         i += 1

  23. print(moving_averages)
复制代码
输出
  1. [2.0, 4.0, 6.33]
复制代码
简单移动平均

SMA(Simple Moving Average)的计算方法是取当前窗口中某个时间的k个(窗口大小)观测值的加权平均值。它用于分析趋势。
公式:

其中,

  • SMAj = 第j个窗口的简单移动平均值
  • k =窗口大小
  • ai =观测集的第i个元素
方法1:使用Numpy
Python的Numpy模块提供了一种简单的方法来计算观测数组的简单移动平均值。它提供了一个名为numpy.sum()的方法,该方法返回给定数组的元素之和。移动平均值可以通过找到窗口中存在的元素的总和并将其除以窗口大小来计算。
  1. # Program to calculate moving average using numpy

  2. import numpy as np

  3. arr = [1, 2, 3, 7, 9]
  4. window_size = 3

  5. i = 0
  6. # Initialize an empty list to store moving averages
  7. moving_averages = []

  8. # Loop through the array t o
  9. #consider every window of size 3
  10. while i < len(arr) - window_size + 1:

  11.         # Calculate the average of current window
  12.         window_average = round(np.sum(arr[
  13.         i:i+window_size]) / window_size, 2)
  14.        
  15.         # Store the average of current
  16.         # window in moving average list
  17.         moving_averages.append(window_average)
  18.        
  19.         # Shift window to right by one position
  20.         i += 1

  21. print(moving_averages)
复制代码
输出
  1. [2.0, 4.0, 6.33]
复制代码
方法2:使用Pandas
Python的Pandas模块提供了一种简单的方法来计算一系列观测值的简单移动平均值。它提供了一个名为pandas.Series.rolling(window_size)的方法,该方法返回指定大小的滚动窗口。窗口的平均值可以通过在上面获得的窗口对象上使用pandas.Series.mean()函数来计算。pandas.Series.rolling(window_size)将返回一些空序列,因为它至少需要k个(窗口大小)元素才能滚动。
  1. # Python program to calculate
  2. # simple moving averages using pandas
  3. import pandas as pd

  4. arr = [1, 2, 3, 7, 9]
  5. window_size = 3

  6. # Convert array of integers to pandas series
  7. numbers_series = pd.Series(arr)

  8. # Get the window of series
  9. # of observations of specified window size
  10. windows = numbers_series.rolling(window_size)

  11. # Create a series of moving
  12. # averages of each window
  13. moving_averages = windows.mean()

  14. # Convert pandas series back to list
  15. moving_averages_list = moving_averages.tolist()

  16. # Remove null entries from the list
  17. final_list = moving_averages_list[window_size - 1:]

  18. print(final_list)
复制代码
输出
  1. [2.0, 4.0, 6.33]
复制代码
累积移动平均

CMA(Cumulative Moving Average)的计算方法是取计算时所有观测值的加权平均值。用于时间序列分析。
公式:

其中:

  • CMAt = 时间t的累积移动平均值
  • kt = 截至时间t的观测次数
  • ai = 观测集的第i个元素
方法1:使用Numpy
Python的Numpy模块提供了一种简单的方法来计算观测数组的累积移动平均值。它提供了一个名为numpy.cumsum()的方法,该方法返回给定数组的元素的累积和的数组。移动平均值可以通过将元素的累积和除以窗口大小来计算。
  1. # Program to calculate cumulative moving average
  2. # using numpy

  3. import numpy as np

  4. arr = [1, 2, 3, 7, 9]

  5. i = 1
  6. # Initialize an empty list to store cumulative moving
  7. # averages
  8. moving_averages = []

  9. # Store cumulative sums of array in cum_sum array
  10. cum_sum = np.cumsum(arr);

  11. # Loop through the array elements
  12. while i <= len(arr):

  13.         # Calculate the cumulative average by dividing
  14.         # cumulative sum by number of elements till
  15.         # that position
  16.         window_average = round(cum_sum[i-1] / i, 2)
  17.        
  18.         # Store the cumulative average of
  19.         # current window in moving average list
  20.         moving_averages.append(window_average)
  21.        
  22.         # Shift window to right by one position
  23.         i += 1

  24. print(moving_averages)
复制代码
输出
  1. [1.0, 1.5, 2.0, 3.25, 4.4]
复制代码
方法2:使用Pandas
Python的Pandas模块提供了一种简单的方法来计算一系列观测值的累积移动平均值。它提供了一个名为pandas.Series.expanding()的方法,该方法返回一个窗口,该窗口覆盖了截至时间t的所有观察结果。窗口的平均值可以通过使用pandas.Series.mean()函数在上面获得的窗口对象上计算。
  1. # Python program to calculate
  2. # cumulative moving averages using pandas
  3. import pandas as pd

  4. arr = [1, 2, 3, 7, 9]
  5. window_size = 3

  6. # Convert array of integers to pandas series
  7. numbers_series = pd.Series(arr)

  8. # Get the window of series of
  9. # observations till the current time
  10. windows = numbers_series.expanding()

  11. # Create a series of moving averages of each window
  12. moving_averages = windows.mean()

  13. # Convert pandas series back to list
  14. moving_averages_list = moving_averages.tolist()

  15. print(moving_averages_list)
复制代码
输出
  1. [1.0, 1.5, 2.0, 3.25, 4.4]
复制代码
指数移动平均

EMA(Exponential Moving Average)是通过每次取观测值的加权平均值来计算的。观察值的权重随时间呈指数下降。它用于分析最近的变化。
公式:

其中:

  • EMAt = 时间t的指数移动平均
  • α = 观察权重随时间的降低程度
  • at = 在时间t的观察
  1. # Program to calculate exponential
  2. # moving average using formula

  3. import numpy as np

  4. arr = [1, 2, 3, 7, 9]
  5. x=0.5 # smoothening factor

  6. i = 1
  7. # Initialize an empty list to
  8. # store exponential moving averages
  9. moving_averages = []

  10. # Insert first exponential average in the list
  11. moving_averages.append(arr[0])

  12. # Loop through the array elements
  13. while i < len(arr):

  14.         # Calculate the exponential
  15.         # average by using the formula
  16.         window_average = round((x*arr[i])+
  17.                                                 (1-x)*moving_averages[-1], 2)
  18.        
  19.         # Store the cumulative average
  20.         # of current window in moving average list
  21.         moving_averages.append(window_average)
  22.        
  23.         # Shift window to right by one position
  24.         i += 1

  25. print(moving_averages)
复制代码
输出
  1. [1, 1.5, 2.25, 4.62, 6.81]
复制代码
方法1:使用Pandas
Python的Pandas模块提供了一种简单的方法来计算一系列观测值的指数移动平均值。它提供了一种称为pandas.Series.ewm.mean()的方法,用于计算给定观测值的指数移动平均值。
pandas.Series.ewm()接受一个称为平滑因子的参数,即观察值的权重随时间减少的程度。平滑因子的值始终介于0和1之间。
  1. # Python program to
  2. # calculate exponential moving averages
  3. import pandas as pd

  4. arr = [1, 2, 3, 7, 9]

  5. # Convert array of integers to pandas series
  6. numbers_series = pd.Series(arr)

  7. # Get the moving averages of series
  8. # of observations till the current time
  9. moving_averages = round(numbers_series.ewm(
  10. alpha=0.5, adjust=False).mean(), 2)

  11. # Convert pandas series back to list
  12. moving_averages_list = moving_averages.tolist()

  13. print(moving_averages_list)
复制代码
输出
  1. [1.0, 1.5, 2.25, 4.62, 6.81]
复制代码
应用场景


  • 时间序列分析:它用于平滑短期变化并突出长期观察,如趋势和周期。
  • 金融分析:它用于股票市场的财务分析,如计算股票价格,回报和分析市场趋势。
  • 环境工程:它用于分析环境条件,考虑各种因素,如污染物的浓度等。
  • 计算机性能分析:它通过计算平均CPU利用率、平均进程队列长度等指标来分析计算机性能。
到此这篇关于在Python中计算移动平均值的方法的文章就介绍到这了,更多相关Python计算移动平均值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源:https://www.jb51.net/python/3287731g6.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具