In [1]:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt  
from mpl_toolkits.basemap import Basemap  

#%matplotlib inline

plt.rcParams['text.usetex'] = True
plt.rcParams['figure.figsize'] = [10, 8]
plt.rcParams['font.size'] = 16

In [ ]:
# Create a dataframe from the json file in the filepath
raw = pd.io.json.read_json('LocationHistory.json') 
df = raw['locations'].apply(pd.Series)

In [ ]:
df['latitude'] = df['latitudeE7'] * 1e-7
df['longitude'] = df['longitudeE7'] * 1e-7

In [24]:
df.columns


Out[24]:
Index([u'accuracy', u'activitys', u'altitude', u'heading', u'latitudeE7', u'longitudeE7', u'timestampMs', u'velocity', u'latitude', u'longitude', u'DistanceFromGreenwhich', u'Deltat'], dtype='object')

In [28]:
df.drop(['activitys', 'altitude', 'heading', 'latitudeE7', 'longitudeE7', 'velocity'] , axis=1, inplace=True)

In [2]:
def Haversine(theta):
    return np.sin(theta/2.0)**2

def DistanceFromGreenwhich(lat, lon):
    R = 6.371e6 # m
    latG, lonG = 51.48, 0.00 # Grenwhich lat and long
    latG = np.radians(latG)
    lonG = np.radians(lonG)
    lat = np.radians(lat)
    lon = np.radians(lon)
    arg = Haversine(lat - latG) + np.cos(latG)*np.cos(lat)*Haversine(lon - lonG)
    return 2 * R * np.arcsin(np.sqrt(arg))

df['DistanceFromGreenwhich'] = DistanceFromGreenwhich(df.latitude, df.longitude)

df_home = df[df.DistanceFromGreenwhich < 300e3]

In [10]:
def PaddingFunction(xL, xR, frac=0.1):
    """ Return xL and xR with an added padding factor of frac either side """
    xRange = xR - xL
    xL_new = xL - frac*xRange
    xR_new = xR + frac*xRange
    return xL_new, xR_new

def GeneratePlot(data, fig=None, ignore_first=False, *args, **kwargs):
    """ Helper function to plot points on a map
    
    Parameters
    ----------
    ignore_first : bool, 
        If true the data in the first df in data is ignored and used only to set 
        up the map 
    """
    if type(data) == pd.core.frame.DataFrame:
        # Single df
        df = data
        df_list = [df]
    elif type(data) == list:
        df_list = data
        df = data[0]

    
    if not fig:
        fig = plt.figure()

    # Calculate some parameters which will be resused]
    lat_0 = df.latitude.mean()
    lon_0 = df.longitude.mean()
    llcrnrlon, urcrnrlon = PaddingFunction(df.longitude.min(), df.longitude.max(), frac=0.3)
    llcrnrlat, urcrnrlat = PaddingFunction(df.latitude.min(), df.latitude.max())

    # Create a map, using the Gall–Peters projection, 
    m = Basemap(projection='gall',  
                  resolution = 'h', 
                  area_thresh = 10000.0,
                  lat_0=lat_0, lon_0=lon_0,
                  llcrnrlon=llcrnrlon,
                  urcrnrlon=urcrnrlon,
                  llcrnrlat=llcrnrlat, 
                  urcrnrlat=urcrnrlat,
                  ax=fig.gca()
                  )

    m.drawcoastlines()
    m.drawcountries()
    m.fillcontinents(color = '#996633')
    m.drawmapboundary(fill_color='#0099FF')

    if ignore_first:
        df_list = df_list[1:]
        
    for df in df_list:
        # Define our longitude and latitude points
        x, y = m(df['longitude'].values, df['latitude'].values)

        # Plot them using round markers of size 6 
        m.plot(x, y, "o", zorder=100, *args, **kwargs)

    return fig

In [7]:
fig = GeneratePlot(df_home, color="r")
plt.show()

Get only connected data frames

The times for which data is recorded depends on many external factors, cheif amonst these is if I have the gps turned on, or if the phone tries to find its location via wifi.


In [12]:
fig = GeneratePlot(df_home[df_home.accuracy < 50], color="r")
plt.show()

In [35]:
df_home['Deltat'] = np.concatenate(([0], np.diff(df_home.timestampMs.values.astype(np.float64))))
df_home


/home/greg/Programs/ipython/IPython/kernel/__main__.py:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  if __name__ == '__main__':
Out[35]:
accuracy activitys altitude heading latitudeE7 longitudeE7 timestampMs velocity latitude longitude DistanceFromGreenwhich Deltat
0 39 NaN NaN NaN 509362003 -13984835 1424078580622 NaN 50.936200 -1.398483 114659.466626 0
1 1200 NaN NaN NaN 509014593 -13732129 1424078296716 NaN 50.901459 -1.373213 115307.717875 -283906
2 1200 [{u'activities': [{u'confidence': 100, u'type'... NaN NaN 509014593 -13732129 1424078232809 NaN 50.901459 -1.373213 115307.717875 -63907
3 37 NaN NaN NaN 509362143 -13984699 1424078170566 NaN 50.936214 -1.398470 114657.828263 -62243
4 45 NaN NaN NaN 509362226 -13984751 1424078109921 NaN 50.936223 -1.398475 114657.641908 -60645
5 37 [{u'activities': [{u'confidence': 100, u'type'... NaN NaN 509362341 -13985141 1424078038232 NaN 50.936234 -1.398514 114659.265531 -71689
6 31 NaN NaN NaN 509362803 -13985563 1424077978014 NaN 50.936280 -1.398556 114659.013053 -60218
7 36 NaN NaN NaN 509362485 -13985295 1424077917093 NaN 50.936248 -1.398529 114659.319781 -60921
8 1200 [{u'activities': [{u'confidence': 100, u'type'... NaN NaN 509014593 -13732129 1424077854200 NaN 50.901459 -1.373213 115307.717875 -62893
9 1200 NaN NaN NaN 509014593 -13732129 1424077792960 NaN 50.901459 -1.373213 115307.717875 -61240
10 1200 NaN NaN NaN 509014593 -13732129 1424077728176 NaN 50.901459 -1.373213 115307.717875 -64784
11 25 [{u'activities': [{u'confidence': 82, u'type':... NaN NaN 509362363 -13984751 1424077668276 NaN 50.936236 -1.398475 114656.826335 -59900
12 27 NaN NaN NaN 509361462 -13982884 1424077615482 NaN 50.936146 -1.398288 114651.141160 -52794
13 26 [{u'activities': [{u'confidence': 100, u'type'... NaN NaN 509361273 -13987394 1424077558994 NaN 50.936127 -1.398739 114678.957818 -56488
14 20 NaN NaN NaN 509363477 -13986479 1424077509388 NaN 50.936348 -1.398648 114660.423070 -49606
15 40 [{u'activities': [{u'confidence': 100, u'type'... NaN NaN 509361723 -13983857 1424077443825 NaN 50.936172 -1.398386 114655.345497 -65563
16 23 NaN NaN NaN 509362838 -13985608 1424077369949 NaN 50.936284 -1.398561 114659.071062 -73876
17 39 NaN NaN NaN 509361738 -13983556 1424077308435 NaN 50.936174 -1.398356 114653.474808 -61514
18 40 [{u'activities': [{u'confidence': 100, u'type'... NaN NaN 509362164 -13984575 1424077244197 NaN 50.936216 -1.398457 114656.969357 -64238
19 46 NaN NaN NaN 509361723 -13983545 1424077182954 NaN 50.936172 -1.398354 114653.499016 -61243
20 1114 NaN NaN NaN 509219043 -13911563 1424077123779 NaN 50.921904 -1.391156 115088.114601 -59175
21 1114 [{u'activities': [{u'confidence': 100, u'type'... NaN NaN 509219043 -13911563 1424077063680 NaN 50.921904 -1.391156 115088.114601 -60099
22 27 NaN NaN NaN 509361669 -13983076 1424077001432 NaN 50.936167 -1.398308 114651.044916 -62248
23 30 NaN NaN NaN 509361490 -13982670 1424076941362 NaN 50.936149 -1.398267 114649.707982 -60070
24 1114 [{u'activities': [{u'confidence': 54, u'type':... NaN NaN 509219043 -13911563 1424076882218 NaN 50.921904 -1.391156 115088.114601 -59144
25 42 [{u'activities': [{u'confidence': 100, u'type'... NaN NaN 509362147 -13984501 1424076821877 NaN 50.936215 -1.398450 114656.632599 -60341
26 48 NaN NaN NaN 509362734 -13985317 1424076752241 NaN 50.936273 -1.398532 114657.967772 -69636
27 40 NaN NaN NaN 509362655 -13985233 1424076702372 NaN 50.936265 -1.398523 114657.940861 -49869
28 1114 [{u'activities': [{u'confidence': 58, u'type':... NaN NaN 509219043 -13911563 1424076655007 NaN 50.921904 -1.391156 115088.114601 -47365
29 1114 NaN NaN NaN 509219043 -13911563 1424076589740 NaN 50.921904 -1.391156 115088.114601 -65267
... ... ... ... ... ... ... ... ... ... ... ... ...
453731 1097 NaN NaN NaN 509393836 -13959365 1345381169107 NaN 50.939384 -1.395936 114319.402801 -155295
453732 1097 NaN NaN NaN 509393836 -13959365 1345381164072 NaN 50.939384 -1.395936 114319.402801 -5035
453733 1097 NaN NaN NaN 509393836 -13959365 1345381159049 NaN 50.939384 -1.395936 114319.402801 -5023
453734 1097 NaN NaN NaN 509393836 -13959365 1345381154026 NaN 50.939384 -1.395936 114319.402801 -5023
453735 1097 NaN NaN NaN 509393836 -13959365 1345381149002 NaN 50.939384 -1.395936 114319.402801 -5024
453736 1097 NaN NaN NaN 509393836 -13959365 1345381143874 NaN 50.939384 -1.395936 114319.402801 -5128
453737 1097 NaN NaN NaN 509393836 -13959365 1345380805143 NaN 50.939384 -1.395936 114319.402801 -338731
453738 1097 NaN NaN NaN 509393836 -13959365 1345380800244 NaN 50.939384 -1.395936 114319.402801 -4899
453739 1097 NaN NaN NaN 509393836 -13959365 1345380752614 NaN 50.939384 -1.395936 114319.402801 -47630
453740 1097 NaN NaN NaN 509393836 -13959365 1345380747591 NaN 50.939384 -1.395936 114319.402801 -5023
453741 1097 NaN NaN NaN 509393836 -13959365 1345380742539 NaN 50.939384 -1.395936 114319.402801 -5052
453742 1097 NaN NaN NaN 509393836 -13959365 1345380737487 NaN 50.939384 -1.395936 114319.402801 -5052
453743 1097 NaN NaN NaN 509393836 -13959365 1345380732436 NaN 50.939384 -1.395936 114319.402801 -5051
453744 1097 NaN NaN NaN 509393836 -13959365 1345380727421 NaN 50.939384 -1.395936 114319.402801 -5015
453745 1097 NaN NaN NaN 509393836 -13959365 1345380721547 NaN 50.939384 -1.395936 114319.402801 -5874
453746 1097 NaN NaN NaN 509393836 -13959365 1345380716528 NaN 50.939384 -1.395936 114319.402801 -5019
453747 1097 NaN NaN NaN 509393836 -13959365 1345380705204 NaN 50.939384 -1.395936 114319.402801 -11324
453748 1097 NaN NaN NaN 509393836 -13959365 1345380700186 NaN 50.939384 -1.395936 114319.402801 -5018
453749 1097 NaN NaN NaN 509393836 -13959365 1345380695132 NaN 50.939384 -1.395936 114319.402801 -5054
453750 1097 NaN NaN NaN 509393836 -13959365 1345380690064 NaN 50.939384 -1.395936 114319.402801 -5068
453751 1097 NaN NaN NaN 509393836 -13959365 1345380685013 NaN 50.939384 -1.395936 114319.402801 -5051
453752 1097 NaN NaN NaN 509393836 -13959365 1345380679980 NaN 50.939384 -1.395936 114319.402801 -5033
453753 1097 NaN NaN NaN 509393836 -13959365 1345380674940 NaN 50.939384 -1.395936 114319.402801 -5040
453754 1097 NaN NaN NaN 509393836 -13959365 1345380670068 NaN 50.939384 -1.395936 114319.402801 -4872
453755 1097 NaN NaN NaN 509393836 -13959365 1345380664833 NaN 50.939384 -1.395936 114319.402801 -5235
453756 1097 NaN NaN NaN 509393836 -13959365 1345380659737 NaN 50.939384 -1.395936 114319.402801 -5096
453757 1097 NaN NaN NaN 509393836 -13959365 1345380654670 NaN 50.939384 -1.395936 114319.402801 -5067
453758 1097 NaN NaN NaN 509393836 -13959365 1345380649666 NaN 50.939384 -1.395936 114319.402801 -5004
453759 1097 NaN NaN NaN 509393836 -13959365 1345380635679 NaN 50.939384 -1.395936 114319.402801 -13987
453760 1097 NaN NaN NaN 509393836 -13959365 1345380630623 NaN 50.939384 -1.395936 114319.402801 -5056

407854 rows × 12 columns


In [40]:
plt.hist(df_home.Deltat[df_home.Deltat > -1e5], bins=50, log=True)
plt.show()

In [31]:
df[df.Deltat < -1e10]


Out[31]:
accuracy timestampMs latitude longitude DistanceFromGreenwhich Deltat
450938 1974 1345968005171 50.738327 -1.717338 145511.381166 -29886687683