簡體   English   中英

從帶時間戳的流量計數器創建摘要統計信息

[英]Creating summary statistics from timestamped traffic counters

我正在收集一個特殊用例的交通信息,我有約。 每10分鍾(但不完全是)流量計數器的帶時間戳的值,例如:

11:45 100
11:56 110
12:05 120
12:18 130
...

這是我擁有的數據,我無法改進。

我想從這個輸入中產生一些每小時/每日統計數據,你能在python中建議一些現成的函數或算法嗎?

我正在考慮將帶時間戳的計數器分成幾小時,並將小時的第一個時間戳與最后一個時間戳相比較,並將差異顯示為給定小時內的流量,但是因為這可能不是精確地以小時開始(例如,以上數據,從120 @ 12:05開始),它可能完全關閉,並且也可以按比例包括先前的數據(例如((120-110)/ 9)* 5)。 但是我不想重新發明輪子。

- 更新 -

根據以下建議,我調查了大熊貓並制作了以下代碼。 作為對上述書面背景的澄清,時間戳值是二級的並且在一分鍾內不規則地分布(例如,11:45:03,11:56:34等)。 因此,下面的代碼接受輸入,將其重新索引到第二級,執行線性插值(假設流量均勻分布在測量點之間),減少第一個和最后一個小數分鍾(如果第一個數據點是11:45) :03,它沒有被前3秒的缺失扭曲)並將第二級數據重新采樣到分鍾級別。 現在這已經按預期工作了,但是它非常慢,我想由於二級插值,因為數據總共超過幾個月。 有關如何進一步改進或加快代碼的任何想法?

import datetime
import pandas as pd
import numpy as np
import math

COLUMNS = ['date', 'lan_in', 'inet_in', 'lan_out', 'inet_out']

ts_converter = lambda x: datetime.datetime.fromtimestamp(int(x))
td = pd.read_table("traffic_log",
                   names = COLUMNS,
                   delim_whitespace = True,
                   header = None,
                   converters = { 'date' : ts_converter }).set_index('date')

# reindex to second-level data
td = td.reindex(pd.date_range(min(td.index), max(td.index), freq="s"))
# linear interpolation to fill data for all seconds
td = td.apply(pd.Series.interpolate)
# cut first and last fractional minute data
td = td[pd.Timestamp(long(math.ceil(td.index.min().value/(1e9*60))*1e9*60)):
        pd.Timestamp(long(math.floor(td.index.max().value/(1e9*60))*1e9*60))]
# resample to minute-level taking the minimum value for each minute
td = td.resample("t", how="min")
# change absolute values to differences
td = td.apply(pd.Series.diff)
# create daily statistics in gigabytes
ds = td.resample("d", how="sum").apply(lambda v: v/1024/1024/1024)
# create speed columns
for i in COLUMNS[1:]:
    td[i+'_speed'] = td[i] / 60 / 1024

如果我理解你的問題可能會有所幫助:

df = pd.DataFrame( [ ['11:45', 100 ], ['11:56', 110], ['12:05', 120], ['12:18', 130]], 
                   columns=['tick', 'val'] )
df.tick = df.tick.map ( pd.Timestamp )

所以df看起來像這樣:

                 tick  val
0 2013-12-10 11:45:00  100
1 2013-12-10 11:56:00  110
2 2013-12-10 12:05:00  120
3 2013-12-10 12:18:00  130

現在你可以計算每個區間的長度,並找到每小時平均值:

df[ 'period' ] = df.tick - df.tick.shift( 1 )
df.period = df.period.div( np.timedelta64( '1', 'h' ) )
df[ 'chval' ] = df.val - df.val.shift( 1 )
df[ 'havg' ] = df.chval / df.period  

輸出:

                 tick  val  period  chval     havg
0 2013-12-10 11:45:00  100     NaN    NaN      NaN
1 2013-12-10 11:56:00  110  0.1833     10  54.5455
2 2013-12-10 12:05:00  120  0.1500     10  66.6667
3 2013-12-10 12:18:00  130  0.2167     10  46.1538

考慮到一些時段跨越一個小時,我認為一種解決方案是將頻率更改為分鍾,向后填充所有nan值,然后使用平均值計算每小時重新采樣:

df = df.set_index( 'tick' ).asfreq( freq='T', method='bfill' )
df = df.shift( -1 ).resample( 'h', how='mean' ) 

輸出:

                          val  period  chval     havg
2013-12-10 11:00:00  112.6667  0.1744     10  57.7778
2013-12-10 12:00:00  127.2222  0.1981     10  51.8519

現在我認為havg值是coorect,as

( 10 + 10 * 4 / 9 ) / 15 * 60 = 57.7778
(      10 * 5 / 9 + 10 ) / 18 * 60 = 51.8519

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM