2014-11-11 5 views
3

Я искал для этого какое-то время и не нашел правильного решения. У меня есть временные ряды с парой миллионов строк, который имеет довольно странную структуру:Pandas TimeSeries С продолжительностью события

VisitorID Time    VisitDuration 
1   01.01.2014 00:01 80 seconds 
2   01.01.2014 00:03 37 seconds 

Я хотел бы знать, сколько людей на веб-сайте в течение определенного момента. Для этого мне пришлось бы превратить эти данные во что-то большее:

Time    VisitorsPresent 
01.01.2014 00:01 1 
01.01.2014 00:02 1 
01.01.2014 00:03 2 
... 

Но делать что-то подобное представляется крайне неэффективным. Мой код будет:

dates = {} 
for index, row in data.iterrows(): 
    for i in range(0,int(row["duration"])): 
     dates[index+pd.DateOffset(seconds=i)] = dates.get(index+pd.DateOffset(seconds=i), 1) + 1 

Тогда я мог бы передать это в серии и быть в состоянии ресамплинг:

result = pd.Series(dates) 
result.resample("5min",how="mean").plot() 

Не могли бы вы мне точку в правильном направлении?

EDIT ---

Привет HYRY Вот голова()

 
    uid  join_time_UTC  duration 
    0 1 2014-03-07 16:58:01  2953  
    1 2 2014-03-07 17:13:14  1954  
    2 3 2014-03-07 17:47:38  223 
+1

Вы можете преобразовать данные to enter_time и exit_tim e, а затем подсчитывать эти два раза за каждую секунду. разные из двух отсчетов - это изменение счета во втором. Затем используйте 'cumsum()' для разных счетчиков, вы получаете подсчет онлайн в каждую секунду. Если вы публикуете некоторые реальные данные, я могу показать вам код. – HYRY

ответ

5

Создайте несколько фиктивных данных первого:

import numpy as np 
import pandas as pd 
start = pd.Timestamp("2014-11-01") 
end = pd.Timestamp("2014-11-02") 
N = 100000 
t = np.random.randint(start.value, end.value, N) 
t -= t % 1000000000 

start = pd.to_datetime(np.array(t, dtype="datetime64[ns]")) 
duration = pd.to_timedelta(np.random.randint(100, 1000, N), unit="s") 
df = pd.DataFrame({"start":start, "duration":duration}) 
df["end"] = df.start + df.duration 

print df.head(5) 

Вот что выглядит как данные:

duration    start     end 
0 00:13:45 2014-11-01 08:10:45 2014-11-01 08:24:30 
1 00:04:07 2014-11-01 23:15:49 2014-11-01 23:19:56 
2 00:09:26 2014-11-01 14:04:10 2014-11-01 14:13:36 
3 00:10:20 2014-11-01 19:40:45 2014-11-01 19:51:05 
4 00:02:48 2014-11-01 02:25:47 2014-11-01 02:28:35 

Затем выполните стоимость co ЕНТ:

enter_count = df.start.value_counts() 
exit_count = df.end.value_counts() 
df2 = pd.concat([enter_count, exit_count], axis=1, keys=["enter", "exit"]) 
df2.fillna(0, inplace=True) 
print df2.head(5) 

здесь отсчеты:

     enter exit 
2014-11-01 00:00:00  1  0 
2014-11-01 00:00:02  2  0 
2014-11-01 00:00:04  4  0 
2014-11-01 00:00:06  2  0 
2014-11-01 00:00:07  2  0 

наконец RESAMPLE и сюжет:

df2["diff"] = df2["enter"] - df2["exit"] 
counts = df2["diff"].resample("5min", how="sum").fillna(0).cumsum() 
counts.plot() 

выход:

enter image description here

+0

прохладно позвольте мне попробовать, что ... – plotti

+0

это работает! это был изобретательный метод для вычисления этих значений с помощью метода value_counts. Большое спасибо! – plotti

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