鉴于我有以下两个向量:
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时间戳(epoch)的列表.
目标:我想要计算的是比特率.
这意味着我将构建一个数据框
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
这是正确的值..
用熊猫计算梯度给了我
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.493333333333不同
你能不能指导我做错了什么?
pd.Series.diff()
只有差异.它也不会除以指数的差值.
这可以得到答案
recv.diff() / recv.index.to_series().diff().dt.total_seconds() 2017-01-20 20:00:00 NaN 2017-01-20 20:05:00 4521.493333 2017-01-20 20:10:00 4533.760000 2017-01-20 20:15:00 4557.493333 2017-01-20 20:20:00 4536.053333 2017-01-20 20:25:00 4567.813333 2017-01-20 20:30:00 4406.160000 2017-01-20 20:35:00 4366.720000 2017-01-20 20:40:00 4407.520000 2017-01-20 20:45:00 4421.173333 Freq: 300S, dtype: float64
您也可以使用numpy.gradient
传递bytes_in
和期望的delta.这不会将长度减少一个,而是对边缘进行假设.
np.gradient(bytes_in, 300) * 8 array([ 4521.49333333, 4527.62666667, 4545.62666667, 4546.77333333, 4551.93333333, 4486.98666667, 4386.44 , 4387.12 , 4414.34666667, 4421.17333333])