如何使用 Python 手动实现指数平滑?
How to implement exponential smoothing manually with Python?
这是我的第一个问题,我也是Python的新手(没有CS背景,我必须补充)!
我正在尝试实施三次指数平滑来进行预测。我的数据基于 AIS 数据,我特别关注 SOG(对地速度)值。我遵循的数学方法是 Triple Exponential Smoothing Model.
我仍然只遵循 Python 的基础知识,并且正在努力弄清楚迭代部分。然而,我期望的是从 CSV(包括时间和 SOG)读取数据并预测速度值,这样我就可以比较预测值和实际值。
Here 是我正在使用 atm 的 example/test 数据 table。
我尝试对方程部分(如下所示)进行编码,我知道它非常草率。但是我不想空手来这里。
alpha = 0.9
m = 3
def test(ssv_current, x_current, ssv_previous, dsv_previous, tsv_previous):
# ssv = single smoothing value (s'(t-1) and s'(t))
ssv_current = (alpha * x_current) + ((1 - alpha) * ssv_previous)
# dsv = double smoothing value (s''(t-1) and s''(t))
dsv_current = (alpha * ssv_current) + ((1 - alpha) * dsv_previous)
# tsv = triple smoothing value (s'''(t-1) and s'''(t))
tsv_current = (alpha * dsv_current) + ((1 - alpha) * tsv_previous)
at = (3 * ssv_current) - (3 * dsv_current) + tsv_current
bt = ((alpha ** 2) / (2 * ((1 - alpha) ** 2))) * (((6 - 5 * alpha) * ssv_current) - ((10 - 8 * alpha) * dsv_current)
+ ((4 - 3 * alpha) * tsv_current))
ct = ((alpha ** 2) / ((1 - alpha) ** 2)) * (ssv_current - (2 * dsv_current) + tsv_current)
ft = at + (m * bt) + (0.5 * (m ** 2) * ct) # mth predicted value at time t
我知道我的问题和这段代码看起来都很垃圾,但我期待从这个社区学习。我以前只使用过 MatLab,这里的任何提示都会对我有帮助。
TIA!
编辑:我意识到我的 post 没有表达我真正想要的。基本上,我希望代码逐个读取速度值并遍历它并打印预测值。
一个非常基本的迭代器是
import csv
datafile = open('datafile.csv', 'r')
csv_file = csv.reader(datafile)
for row in csv_file:
print(row)
每个 'row' 项都会有数据
您也可以对 pandas 执行相同的操作。
import pandas as pd
df = pd.read_csv('datafile.csv')
现在,您不需要迭代。只需一次使用整列进行计算,pandas 将创建这些结果。
例如
df['total'] = df['a'] + df['b']
就这样
参考:Pandas
这是我的第一个问题,我也是Python的新手(没有CS背景,我必须补充)!
我正在尝试实施三次指数平滑来进行预测。我的数据基于 AIS 数据,我特别关注 SOG(对地速度)值。我遵循的数学方法是 Triple Exponential Smoothing Model.
我仍然只遵循 Python 的基础知识,并且正在努力弄清楚迭代部分。然而,我期望的是从 CSV(包括时间和 SOG)读取数据并预测速度值,这样我就可以比较预测值和实际值。
Here 是我正在使用 atm 的 example/test 数据 table。
我尝试对方程部分(如下所示)进行编码,我知道它非常草率。但是我不想空手来这里。
alpha = 0.9
m = 3
def test(ssv_current, x_current, ssv_previous, dsv_previous, tsv_previous):
# ssv = single smoothing value (s'(t-1) and s'(t))
ssv_current = (alpha * x_current) + ((1 - alpha) * ssv_previous)
# dsv = double smoothing value (s''(t-1) and s''(t))
dsv_current = (alpha * ssv_current) + ((1 - alpha) * dsv_previous)
# tsv = triple smoothing value (s'''(t-1) and s'''(t))
tsv_current = (alpha * dsv_current) + ((1 - alpha) * tsv_previous)
at = (3 * ssv_current) - (3 * dsv_current) + tsv_current
bt = ((alpha ** 2) / (2 * ((1 - alpha) ** 2))) * (((6 - 5 * alpha) * ssv_current) - ((10 - 8 * alpha) * dsv_current)
+ ((4 - 3 * alpha) * tsv_current))
ct = ((alpha ** 2) / ((1 - alpha) ** 2)) * (ssv_current - (2 * dsv_current) + tsv_current)
ft = at + (m * bt) + (0.5 * (m ** 2) * ct) # mth predicted value at time t
我知道我的问题和这段代码看起来都很垃圾,但我期待从这个社区学习。我以前只使用过 MatLab,这里的任何提示都会对我有帮助。 TIA!
编辑:我意识到我的 post 没有表达我真正想要的。基本上,我希望代码逐个读取速度值并遍历它并打印预测值。
一个非常基本的迭代器是
import csv
datafile = open('datafile.csv', 'r')
csv_file = csv.reader(datafile)
for row in csv_file:
print(row)
每个 'row' 项都会有数据
您也可以对 pandas 执行相同的操作。
import pandas as pd
df = pd.read_csv('datafile.csv')
现在,您不需要迭代。只需一次使用整列进行计算,pandas 将创建这些结果。 例如
df['total'] = df['a'] + df['b']
就这样 参考:Pandas