-
Notifications
You must be signed in to change notification settings - Fork 117
/
location_queries.py
116 lines (97 loc) · 4.83 KB
/
location_queries.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
from __future__ import print_function
from __future__ import division
from __future__ import unicode_literals
from __future__ import absolute_import
from future import standard_library
standard_library.install_aliases()
from builtins import *
from past.utils import old_div
import logging
import datetime as pydt
import pandas as pd
import time
import pymongo
import attrdict as ad
from enum import Enum
import emission.core.get_database as edb
def get_uuid_list():
return edb.get_usercache_db().distinct('user_id')
def get_plottable_df(user_id, loc_filter, start_dt, end_dt):
tempSection = ad.AttrDict()
tempSection.user_id = user_id
tempSection.loc_filter = loc_filter
if (start_dt is not None and end_dt is not None):
tempSection.start_ts = time.mktime(start_dt.timetuple()) * 1000
tempSection.end_ts = time.mktime(end_dt.timetuple()) * 1000
return get_points_for_section(tempSection)
from_micros = lambda x: pydt.datetime.fromtimestamp(old_div(x,1000))
def get_activities_for_section(section):
query = {"user_id": section.user_id,
"metadata.filter": section.loc_filter,
"metadata.key": "background/activity"}
start_ts = section.start_ts
end_ts = section.end_ts
query.update({'$and': [{'metadata.write_ts': {'$gt': start_ts}},
{'metadata.write_ts': {'$lt': end_ts}}]})
full_entries = list(edb.get_usercache_db().find(query))
merged_entries = [dict(list(entry["metadata"].items()) + list(entry["data"].items())) for entry in full_entries]
entries_df = pd.DataFrame(merged_entries)
entries_df['formatted_time'] = entries_df.write_ts.apply(from_micros)
entries_df['activity'] = entries_df.agb.apply(to_activity_enum)
return entries_df
def get_transitions_df(user_id, loc_filter, start_dt, end_dt):
query = {"user_id": user_id,
"metadata.filter": loc_filter,
"metadata.key": "statemachine/transition"}
if (start_dt is not None and end_dt is not None):
start_ts = time.mktime(start_dt.timetuple()) * 1000
end_ts = time.mktime(end_dt.timetuple()) * 1000
query.update({'$and': [{'metadata.write_ts': {'$gt': start_ts}},
{'metadata.write_ts': {'$lt': end_ts}}]})
full_entries = list(edb.get_usercache_db().find(query))
merged_entries = [dict(list(entry["metadata"].items()) + list(entry["data"].items())) for entry in full_entries]
entries_df = pd.DataFrame(merged_entries)
entries_df['formatted_time'] = entries_df.write_ts.apply(from_micros)
return entries_df
def get_points_for_transitions(user_id, transitions_df):
get_section = lambda transition: ad.AttrDict({'user_id': user_id,
'loc_filter': transition["filter"],
'start_ts': transition["write_ts"] - 10 * 60 * 1000,
'end_ts': transition["write_ts"] + 10})
get_last_point = lambda transition: get_points_for_section(get_section(transition)).iloc[-1]
return transitions_df.apply(get_last_point, axis=1)
def get_points_for_section(section):
query = {"user_id": section.user_id,
"metadata.filter": section.loc_filter,
"metadata.key": "background/location"}
try:
query.update({'$and': [{'data.mTime': {'$gt': section.start_ts}},
{'data.mTime': {'$lt': section.end_ts}}]})
except AttributeError:
logging.debug("Start and end times not defined, no time query")
print("final query = %s " % query)
# full_entries = list(edb.get_usercache_db().find(query).sort("data.mTime", pymongo.ASCENDING))
full_entries = list(edb.get_usercache_db().find(query))
merged_entries = [dict(list(entry["metadata"].items()) + list(entry["data"].items())) for entry in full_entries]
entries_df = pd.DataFrame(merged_entries)
entries_df['formatted_time'] = entries_df.mTime.apply(from_micros)
return entries_df
def get_section(section_id):
section_json = edb.get_section_db().find_one({"id": section_id})
if section_json is None:
logging.warning("Did not find match for section %s, returning None" % section_id)
return None
return ad.AttrDict(section_json)
def get_potential_split_index(df):
inter_arrival_times = df.mTime.diff()
potential_splits = inter_arrival_times[inter_arrival_times > 5000 * 60].index
potential_splits = potential_splits.insert(0, min(df.index))
potential_splits = potential_splits.insert(len(potential_splits), max(df.index))
return potential_splits
def filter_low_accuracy(df, threshold):
return df[df.mAccuracy > threshold]
def get_mode_query(mode_enum_list):
mode_value_list = [me.value for me in mode_enum_list]
ret_val = {'data.mode': {'$in': mode_value_list}}
logging.debug("in get_mode_query, returning %s" % ret_val)
return ret_val