熊猫 - 滚动坡度计算

时间:2017-02-09 13:44:08

标签: python pandas regression

如何计算每列滚动(窗口= 60)值的斜率,步长为5?

我想计算每5分钟的值,而且我不需要每个记录的结果。

以下是示例数据框和结果:

df
Time                A    ...      N
2016-01-01 00:00  1.2    ...    4.2
2016-01-01 00:01  1.2    ...    4.0
2016-01-01 00:02  1.2    ...    4.5
2016-01-01 00:03  1.5    ...    4.2
2016-01-01 00:04  1.1    ...    4.6
2016-01-01 00:05  1.6    ...    4.1
2016-01-01 00:06  1.7    ...    4.3
2016-01-01 00:07  1.8    ...    4.5
2016-01-01 00:08  1.1    ...    4.1
2016-01-01 00:09  1.5    ...    4.1
2016-01-01 00:10  1.6    ...    4.1
....

result
Time                A    ...      N
2016-01-01 00:04  xxx    ...    xxx
2016-01-01 00:09  xxx    ...    xxx
2016-01-01 00:14  xxx    ...    xxx
...

可以将df.rolling函数应用于此问题吗?

如果NaN在窗口中,那就没关系,意味着子集可能小于60.

5 个答案:

答案 0 :(得分:2)

您似乎想要以特定步长滚动。 但是,根据documentation of pandasrolling当前不支持

如果数据大小不太大,只需对所有数据进行滚动并使用索引选择结果。

这是示例数据集。为简单起见,时间列使用整数表示。

data = pd.DataFrame(np.random.rand(500, 1) * 10, columns=['a'])
            a
0    8.714074
1    0.985467
2    9.101299
3    4.598044
4    4.193559
..        ...
495  9.736984
496  2.447377
497  5.209420
498  2.698441
499  3.438271

然后,滚动并计算坡度,

def calc_slope(x):
    slope = np.polyfit(range(len(x)), x, 1)[0]
    return slope

# set min_periods=2 to allow subsets less than 60.
# use [4::5] to select the results you need.
result = data.rolling(60, min_periods=2).apply(calc_slope)[4::5]

结果将是

            a
4   -0.542845
9    0.084953
14   0.155297
19  -0.048813
24  -0.011947
..        ...
479 -0.004792
484 -0.003714
489  0.022448
494  0.037301
499  0.027189

或者,您可以参考这篇文章。第一个答案提供了一种实现这一目标的方法: step size in pandas.DataFrame.rolling

答案 1 :(得分:1)

尝试

<ol>
<li>My abc</li>
<li>LiveColor</li>
<li>LiveFood</li>
<li>Ola</li>
<li>Uber</li>
<li>Good Chat</li>
<li>Food Panda</li>
<li>Domino'd</li>
<li>Clickfood</li>
<li>Smartyo</li>
<li>Tide</li>
<li>Webseries</li>
<li>GoPro</li>
<li>Liveshow</li>
</ol>

答案 2 :(得分:0)

抱歉,我提出了这个老问题。但我无法跟踪结果:S

def calc_slope(x):
    slope = np.polyfit(range(len(x)), x, 1)[0]
    return slope

# set min_periods=2 to allow subsets less than 60.
# use [4::5] to select the results you need.
data['slope']  = data.rolling(3, min_periods=3).apply(calc_slope)

print(data.to_string())

结果为:

           a     slope
0   6.902663       NaN
1   2.257267       NaN
2   0.172393 -3.365135
3   9.642700  3.692717
4   1.221879  0.524743
5   1.634674 -4.004013
6   8.274599  3.526360
7   9.800035  4.082681
8   4.577713 -1.848443
9   1.368656 -4.215690
10  9.377983  2.400135
11  9.795934  4.213639
12  3.045406 -3.166288
13  6.063934 -1.866000
14  8.202430  2.578512

有什么想法吗?

thx

答案 3 :(得分:0)

我使用:

    df['slope_I'] = df['I'].rolling('600s').apply(lambda x: (x[-1]-x[0])/600) 

其中斜率约为1 /秒单位。

结果的前600可能是空的,应该用零或均值填充。 斜率列中的第一个数字将是从窗口内的第一行到最后一行的直线的斜率,依此类推。在滚动过程中,依此类推。

最诚挚的问候。

答案 4 :(得分:-1)

您可以使用pandas Resample。请注意,要使用此功能,您需要一个具有时间值的索引

df.index = pd.to_datetime(df.Time)
print df
result = df.resample('5Min').bfill()
print result
                                 Time    A    N
Time                                           
2016-01-01 00:00:00  2016-01-01 00:00  1.2  4.2
2016-01-01 00:01:00  2016-01-01 00:01  1.2  4.0
2016-01-01 00:02:00  2016-01-01 00:02  1.2  4.5
2016-01-01 00:03:00  2016-01-01 00:03  1.5  4.2
2016-01-01 00:04:00  2016-01-01 00:04  1.1  4.6
2016-01-01 00:05:00  2016-01-01 00:05  1.6  4.1
2016-01-01 00:06:00  2016-01-01 00:06  1.7  4.3
2016-01-01 00:07:00  2016-01-01 00:07  1.8  4.5
2016-01-01 00:08:00  2016-01-01 00:08  1.1  4.1
2016-01-01 00:09:00  2016-01-01 00:09  1.5  4.1
2016-01-01 00:10:00  2016-01-01 00:10  1.6  4.1
2016-01-01 00:15:00  2016-01-01 00:15  1.6  4.1
                                 Time    A    N

输出

Time                                           
2016-01-01 00:00:00  2016-01-01 00:00  1.2  4.2
2016-01-01 00:05:00  2016-01-01 00:05  1.6  4.1
2016-01-01 00:10:00  2016-01-01 00:10  1.6  4.1
2016-01-01 00:15:00  2016-01-01 00:15  1.6  4.1