2017-01-21 23 views
7

Cho rằng tôi có hai vectơ sau:python: làm thế nào để tính toán phái sinh/Gradient

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] 

đâu bytes_in là một gia tăng chỉ truy cập, và time_index là một danh sách để timestamps unix (thời đại).

Mục tiêu: Điều tôi muốn tính là tốc độ bit.

Điều đó có nghĩa rằng tôi sẽ xây dựng một khung dữ liệu như

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 

Câu hỏi: Bây giờ, những gì là lạ, tính toán gradient bằng tay mang lại cho tôi:

In [104]: (bytes_in[1]-bytes_in[0])*8/300 
Out[104]: 4521.493333333333 

mà là giá trị đúng ..

trong khi tính toán độ dốc với gấu trúc cho tôi

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 

mà không giống như trên, 1.356.448,0 khác với 4521,493333333333

Ông có thể soi sáng trên những gì tôi đang làm sai?

+0

thử 'recv.diff()' là lời gọi hàm 'recv.diff' là tham chiếu đến phương thức' diff' ;-) – MaxU

+0

@MaxU cảm ơn :) bạn có điểm! vẫn thấy kết quả khác nhau. Tôi đã chỉnh sửa câu hỏi gốc với kết quả mới. – iamsterdam

+1

Bạn đang quên các bước bổ sung mà tôi cho là - 'recv.diff(). Mul (8) .div (300)' –

Trả lời

8

pd.Series.diff() chỉ nhận sự khác biệt. Nó không phân chia bởi vùng đồng bằng của chỉ mục.

này giúp bạn câu trả lời

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 

Bạn cũng có thể sử dụng numpy.gradient đi qua các bytes_in và vùng đồng bằng mà bạn mong muốn có. Điều này sẽ không làm giảm độ dài của một, thay vì đưa ra giả định về các cạnh.

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]) 
Các vấn đề liên quan