假设我有以下两个向量:
In [99]: time_index
Out[99]:
[1484942413,
1484942712,
1484943012,
1484943312,
1484943612,
1484943912,
1484944212,
1484944511,
1484944811,
1484945110]
In [100]: bytes_in
Out[100]:
[1293981210388,
1293981379944,
1293981549960,
1293981720866,
1293981890968,
1293982062261,
1293982227492,
1293982391244,
1293982556526,
1293982722320]
其中,bytes_in 是仅递增计数器,time_index 是unix时间戳(历元)列表。
**目标:**我想计算的是比特率。
这意味着我将构建一个数据框架,如
In [101]: timeline = pandas.to_datetime(time_index, unit="s")
In [102]: recv = pandas.Series(bytes_in, timeline).resample("300S").mean().ffill().apply(lambda i: i*8)
In [103]: recv
Out[103]:
2017-01-20 20:00:00 10351849683104
2017-01-20 20:05:00 10351851039552
2017-01-20 20:10:00 10351852399680
2017-01-20 20:15:00 10351853766928
2017-01-20 20:20:00 10351855127744
2017-01-20 20:25:00 10351856498088
2017-01-20 20:30:00 10351857819936
2017-01-20 20:35:00 10351859129952
2017-01-20 20:40:00 10351860452208
2017-01-20 20:45:00 10351861778560
Freq: 300S, dtype: int64
**问题:**现在,奇怪的是,手动计算梯度得到:
In [104]: (bytes_in[1]-bytes_in[0])*8/300
Out[104]: 4521.493333333333
这是正确的值。
用Pandas计算梯度时
In [124]: recv.diff()
Out[124]:
2017-01-20 20:00:00 NaN
2017-01-20 20:05:00 1356448.0
2017-01-20 20:10:00 1360128.0
2017-01-20 20:15:00 1367248.0
2017-01-20 20:20:00 1360816.0
2017-01-20 20:25:00 1370344.0
2017-01-20 20:30:00 1321848.0
2017-01-20 20:35:00 1310016.0
2017-01-20 20:40:00 1322256.0
2017-01-20 20:45:00 1326352.0
Freq: 300S, dtype: float64
这与上述不同,*1356448.0与4521.4933333333333不同 *
你能告诉我我做错了什么吗?
5条答案
按热度按时间pdkcd3nj1#
pd.Series.diff()
只取差值,不除以索引的增量。这会给你答案
你也可以使用
numpy.gradient
传递bytes_in
和你期望得到的delta,这不会减少长度1,而是对边缘做一些假设。efzxgjgh2#
由于Pandas Series / DataFrame中没有内置的
derivative
方法,您可以使用https://github.com/scls19fr/pandas-helper-calc。它将为Pandas Series和DataFrames提供一个名为
calc
的新访问器,以计算数值导数和积分。所以你可以简单地
它在引擎盖下使用
diff()
。dced5bon3#
一个简单的解释是
.diff()
直接减去后面的项,而np.gradient()
使用中心差分方案。nuypyhwy4#
或者,如果要计算变化率,则可以使用
df.pct_change()
您可以输入
df.pct_change(n)
作为参数,其中n
是回顾周期(假设您有一个datetime索引的 Dataframe )。nmpmafwu5#
要获得正确的时间导数,请更改
series
的索引