-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgeoinformation_processor.py
More file actions
101 lines (84 loc) · 3.36 KB
/
geoinformation_processor.py
File metadata and controls
101 lines (84 loc) · 3.36 KB
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
from outlier import ImageMetadata, Normalisation
from flask import request, Flask
import pandas as pd
import json
from typing import List
app = Flask(__name__)
class Filter:
def __init__(self):
self.normalis = Normalisation()
def prepare_df_to_filter(self, data: List[dict]) -> pd.DataFrame:
"""
Preparing a pandas Dataframe for further
Args:
data: sended over rest list of jsons
Returns:
filled pandas dataframe
"""
for elem in data:
user_data = ImageMetadata(elem)
self.normalis.user_array.append(user_data.id)
self.normalis.latitude_array.append(user_data.latitude)
self.normalis.longitude_array.append(user_data.longitude)
self.normalis.score_array.append(user_data.score)
d = {
"id": self.normalis.user_array,
"latitude": self.normalis.latitude_array,
"longitude": self.normalis.longitude_array,
"score": self.normalis.score_array,
}
df = pd.DataFrame(data=d)
return df
def remove_outliers(self, data: List[dict]) -> bytes:
"""
Removing outliers by using
1. z-score
2. iqr filter
Args:
data: sended over rest list of jsons
Returns:
returns a json in a form of a scoring list with ids and boolean value, if the proposed information
by user was helpful(was not thrown away). and the mean value of the coordinates for the latitude
longitude
Examples:
{"mean": {"latitude": "54.409669", "longitude": "23.976294"}, "user": [{"id": "fang", "score": true}]}
"""
df = self.prepare_df_to_filter(data)
df = self.normalis.process_zscore(df, "longitude")
df = self.normalis.process_zscore(df, "latitude")
# IQR FILTER
(
upper_bound_lat,
lower_bound_lat,
) = self.normalis.iqr_lower_uperbound_calculation(df, "latitude")
(
upper_bound_long,
lower_bound_long,
) = self.normalis.iqr_lower_uperbound_calculation(df, "longitude")
df["latitude"] = df["latitude"].map(
lambda x: self.normalis.lqr_help_func(x, upper_bound_lat, lower_bound_lat)
)
df["longitude"] = df["longitude"].map(
lambda x: self.normalis.lqr_help_func(x, upper_bound_long, lower_bound_long)
)
df["score"] = ~(df.isnull().any(axis=1))
frame_to_send = df[["id", "score"]]
mean_values = df[(df["latitude"].notna()) & (df["longitude"].notna())][
["latitude", "longitude"]
]
reply, mean = {}, {}
reply["mean"] = mean
mean["latitude"] = str(mean_values[["latitude"]].mean().tolist()[0])
mean["longitude"] = str(mean_values[["longitude"]].mean().tolist()[0])
score_json = frame_to_send.to_json(orient="records", force_ascii=False)
reply["user"] = json.loads(score_json)
filtered_data_with_score = json.dumps(reply, ensure_ascii=False).encode("utf8")
return filtered_data_with_score
@app.route("/normalise", methods=["POST"])
def main():
data = request.get_json()
filter = Filter()
filtered_data = filter.remove_outliers(data)
return filtered_data
if __name__ == "__main__":
app.run("0.0.0.0", port=2000)