2013-12-10 4 views
3

Я собираю информацию о дорожном движении для специального случая использования, где у меня ок. через каждые 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 и т. Д.). Таким образом, приведенный ниже код берет ввод, переиндексирует его на второй уровень, выполняет линейную интерполяцию (при условии, что трафик равномерно распределяется между точками измерения), сокращает первую и последнюю дробные минуты (так что если 1-я точка данных находится в 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 
+1

Использовать обычные http://pandas.pydata.org/ – YXD

ответ

1

Если я понял ваш вопрос правильно, может быть, это поможет:

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 

принять, чтобы учесть, что некоторые периоды охватывают в течение одного часа, я думаю, что одно решение изменить частоту минут, назад заполнить все значения нан, а затем ресэмплировать ежечасно со средним расчетом:

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, а

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

Спасибо, это выглядит нормально, но я также потребуюсь сумма трафика, кроме скорости, то есть я должен преобразовать этот набор данных в регулярных минутах уровня набора данных, имеющие е ,g - точка в 12:00 со значением 110 + 10 * 4/9 (при условии равномерного распределения скорости в пределах интервала измерения), как это сделать? – abali

+1

@abali, который является интерполяцией, см. [This] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.interpolate.html#pandas.Series.interpolate) –

+0

Спасибо, это работает, однако это очень медленно - я отредактировал вопрос с обновлением, любые дальнейшие предложения приветствуются. – abali

Смежные вопросы