2013-05-22 6 views
1

У меня есть DataFrame с колонками time, latitude и longitude. Это выглядит так:Получение конкретных медианных данных

>>> df.head() 
        time latitude longitude 
0 2011-12-16 08:09:07 42.386391 -71.013544 
1 2011-12-16 08:09:08 42.386391 -71.013544 
2 2011-12-16 08:09:09 42.386391 -71.013544 
3 2011-12-16 08:09:10 42.386391 -71.013544 
4 2011-12-16 08:09:11 42.386391 -71.013544 

Что я пытаюсь сделать, это оценка того, где живет человек. Самый простой способ сделать это - получить режим (наиболее распространенный) своего местоположения в самые ранние моменты дня.

В моем кадре данных более 700 000 строк и занимает около 3 месяцев с данными по 4-8 часов в день каждую секунду! Поэтому мне нужно найти наиболее распространенные пары (широта, долгота) с первых двух секунд каждого дня.

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

l = [] 
for i in range(len(df)-1): 
    l.append((df.latitude[i],df.longitude[i])) 
import collections 
answer = collections.Counter(l).most_common(1) 

Это может или не может быть наиболее эффективным способом, и если вы иметь лучший способ, который будет работать, не стесняйтесь использовать это в своем ответе. Важная часть этого состоит в том, что только только принимают первые значения пары за каждый день.

спасибо.

примечание: время начала каждого дня варьируется.

+0

Фактически * режим * является наиболее распространенным значением в наборе данных. медиана - это значение, значение которого меньше половины, чем половина. интеграл от -infinity до m, где m - медиана, равна 1/2 –

+0

wow, yeah my bad –

ответ

0

Я думаю, что это будет работать, я использую часов здесь, но та же самая идея GroupBy дата, затем Ваша функция возвращает медиану первых 3 значений (или меньше, если есть меньше)

In [23]: df = DataFrame(randn(2000,2), 
     index=date_range('20130101',periods=2000,freq='H')) 

In [24]: df 
Out[24]: 
<class 'pandas.core.frame.DataFrame'> 
DatetimeIndex: 2000 entries, 2013-01-01 00:00:00 to 2013-03-25 07:00:00 
Freq: H 
Data columns (total 2 columns): 
0 2000 non-null values 
1 2000 non-null values 
dtypes: float64(2) 

In [21]: def f(frame): 
    ....:  if len(frame) > 3: 
    ....:   frame = frame.iloc[0:4,:] 
    ....:  return frame.median() 
    ....: 


In [25]: df.resample('D',how=f).head(20) 
Out[25]: 
        0   1 
2013-01-01 -1.168960 0.752771 
2013-01-02 0.252991 0.257350 
2013-01-03 0.823164 0.246403 
2013-01-04 -0.253409 -0.099833 
2013-01-05 0.328023 -0.308967 
2013-01-06 -0.086218 -1.090935 
2013-01-07 0.073870 0.256468 
2013-01-08 -0.551869 0.332902 
2013-01-09 0.267126 0.232623 
2013-01-10 0.305948 0.460094 
2013-01-11 -0.088975 -1.080070 
2013-01-12 -0.587940 0.391419 
2013-01-13 -0.220146 0.380210 
2013-01-14 -0.689020 -0.873559 
2013-01-15 0.576461 -0.184413 
2013-01-16 0.258620 0.221407 
2013-01-17 -0.385102 0.376829 
2013-01-18 0.096542 0.331183 
2013-01-19 0.385703 0.241587 
2013-01-20 -1.119306 -0.210429 
+0

благодаря @Dan Allen для resample, а не groupby date – Jeff

0

Вы можете взять медианное начало дня в одной строке.

df.set_index('time').resample('D', how='first').median() 

Это рассмотрим только первую позицию каждый день, а не первые несколько, но если образцы берутся каждый второй, как мне кажется, что первая позиция, и первые несколько позиций, скорее всего, будет примерно такой же.

+0

это предлагает функцию: '.resample ('D', how = 'range', start = 0, stop = 3) .median() '' – Jeff

+0

Аккуратное предложение. Может быть, я сделаю PR. –

+0

его вроде как ваш '' фильтр'' PR, но в этом случае '' BinFilter'' (в отличие от '' ValueFilter'') – Jeff