如何使用 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' 项都会有数据

参考:CSV Library reference

您也可以对 pandas 执行相同的操作。

import pandas as pd

df = pd.read_csv('datafile.csv')

现在,您不需要迭代。只需一次使用整列进行计算,pandas 将创建这些结果。 例如

df['total'] = df['a'] + df['b']

就这样 参考:Pandas