python pandas函数逐行计算

时间:2017-02-01 13:51:44

标签: python pandas dataframe row

我有一个具有以下结构的数据框:

"数据"

        Demand x(t)
week             
1                  18
2                  29
3                  25
4                  35
5                  40
6                  45
7                  49
8                  42
9                  31
10                 30
11                 25
12                 22

我计划使用具有指数平滑的Holt方法来估计下一时期的预测。为此,我将使用两个新列:level和trend,知道第一行(第1周)的数据:

                    demand  level  trend
week                      
1             18   18.0    7.0
2             29    NaN    NaN
3             25    NaN    NaN
4             35    NaN    NaN
5             40    NaN    NaN
6             45    NaN    NaN
7             49    NaN    NaN
8             42    NaN    NaN
9             31    NaN    NaN
10            30    NaN    NaN
11            25    NaN    NaN
12            22    NaN    NaN

要完成预测,我需要估算每周的水平和趋势,以前一周为基础。我能够通过使用for循环来实现它:

for idx in range(2,13):
        new_level = alpha*data.loc[idx].demand + (1-alpha)*(data.loc[idx-1].level + data.loc[idx-1].trend)
        new_trend = beta*(new_level -data.loc[idx-1].level) + (1-beta)*(data.loc[idx-1].trend)
        data.loc[idx] = (data.loc[idx].demand, new_level, new_trend)

和结果

        demand      level     trend
week                             
1           18.0  18.000000  7.000000
2           29.0  27.000000  7.660000
3           25.0  29.830000  6.066100
4           35.0  35.448050  5.918243
5           40.0  40.683147  5.692805
6           45.0  45.687976  5.465773
7           49.0  50.076874  5.110404
8           42.0  48.593639  2.934503
9           31.0  41.264071 -0.452640
10          30.0  35.405716 -2.236526
11          25.0  29.084595 -3.584443
12          22.0  23.750076 -4.161968

我想知道是否有更好的方法。我尝试使用shift,但我的问题是水平和趋势都取决于当前数据和先前计算的数据"在飞行中#34;所以我将需要以某种方式同时使用两列的cal来使用:

data['level'] = alpha*data.demand + (1-alpha)*(data.level.shift(1)+data.trend.shift(1))
data['trend'] = beta*(data.level-data.level.shift(1)) + (1-beta)*data.trend.shift(1)

任何建议?

0 个答案:

没有答案