Browse Source

add geo_clean()

psophometric 3 years ago
parent
commit
1ba08ce3c5
2 changed files with 56 additions and 1 deletions
  1. BIN
      data/geo_sncf.db
  2. 56 1
      export_geoloc_sncf.py

BIN
data/geo_sncf.db


+ 56 - 1
export_geoloc_sncf.py

@@ -94,7 +94,10 @@ def geo2df(f):
94 94
         print('erreur de lecture du fichier ', f)
95 95
         return False
96 96
     print('création de la base Géolocalisation')
97
-    df = pd.read_json(df['fields'].to_json(),orient = 'index')
97
+    try:
98
+        df = pd.read_json(df['fields'].to_json(),orient = 'index')
99
+    except:
100
+        pass
98 101
     list_fields = list(df.columns.values)
99 102
     list_fields = regex_fields(list_fields) # APPEL FCT regex_fields()
100 103
     if list_fields:
@@ -182,6 +185,57 @@ def parser():
182 185
     parser.add_argument('--delete','-d', action='store_true', help='delete JSON files after export' )
183 186
     return parser.parse_args()
184 187
 
188
+def geo_clean():
189
+    """ Suppression des coordonnées géographiques aberrantesde la base SQLite """
190
+    def test(nb_suppr):
191
+        suppr=0
192
+        cur.execute("""SELECT code_ligne, pk, lat, lon FROM geo WHERE code_ligne = {} ORDER BY pk""".format(sligne))
193
+        req=cur.fetchall()
194
+        for i in xrange(0,len(req)-1):
195
+            if (abs(req[i][2]-req[i+1][2]) > 0.01 or abs(req[i][3]-req[i+1][3]) > 0.015) : # premier test de comparaison (plus rapide que de tester chaque lignes unes à unes...)
196
+                #Calcul des lat/lon moyennes +- 0.5km
197
+                pkmin = req[i][1]-0.5
198
+                pkmax = req[i][1]+0.5
199
+                cur.execute("""SELECT AVG(lat), AVG(lon) FROM geo WHERE pk < ? AND pk > ? AND code_ligne=?""",(pkmax,pkmin,sligne))
200
+                req2=cur.fetchall()
201
+                e_lat = abs(req[i][2]-float(str(req2[0][0])))
202
+                e_lon = abs(req[i][3]-float(str(req2[0][1])))
203
+                if nb_suppr==999 and (e_lat > 0.5 or e_lon > 0.5): #Premier passage pour supprimer les valeurs les plus aberrantes
204
+                    suppr+=1
205
+                    cur.execute("""DELETE FROM geo WHERE code_ligne = ? AND pk = ? AND lat = ? AND lon = ?""",(req[i][0],req[i][1],req[i][2],req[i][3]))
206
+                if nb_suppr!=999 and (e_lat > 0.02 or e_lon > 0.03): #Second passage plus fin
207
+                    suppr+=1
208
+                    cur.execute("""DELETE FROM geo WHERE code_ligne = ? AND pk = ? AND lat = ? AND lon = ?""",(req[i][0],req[i][1],req[i][2],req[i][3]))
209
+        if nb_suppr==999: #Second passage plus fin, permet plus de précision dans les valeurs moyennes après la suppression des valeurs les plus aberrantes
210
+            for i in xrange(0,len(req)-1):
211
+                if (abs(req[i][2]-req[i+1][2]) > 0.01 or abs(req[i][3]-req[i+1][3]) > 0.015) :
212
+                    pkmin = req[i][1]-0.5
213
+                    pkmax = req[i][1]+0.5
214
+                    cur.execute("""SELECT AVG(lat), AVG(lon) FROM geo WHERE pk < ? AND pk > ? AND code_ligne=?""",(pkmax,pkmin,sligne))
215
+                    req2=cur.fetchall()
216
+                    e_lat = abs(req[i][2]-float(str(req2[0][0])))
217
+                    e_lon = abs(req[i][3]-float(str(req2[0][1])))
218
+                    if e_lat > 0.02 or e_lon > 0.03:
219
+                        suppr+=1
220
+                        cur.execute("""DELETE FROM geo WHERE code_ligne = ? AND pk = ? AND lat = ? AND lon = ?""",(req[i][0],req[i][1],req[i][2],req[i][3]))
221
+        return suppr
222
+
223
+    print('Suppression des coordonnées géographiques aberrantes de la base SQLite.\nCela va prendre quelques minutes...')
224
+    con = sqlite3.connect(REPERTOIRE_DATA+DB_FILE)
225
+    cur = con.cursor()
226
+    cur.execute("""SELECT DISTINCT code_ligne FROM geo ORDER BY code_ligne""") #recuperation des codes_lignes
227
+    code_lignes = cur.fetchall()
228
+    for ligne in code_lignes:
229
+        lig = ligne[0]
230
+        sligne = str(lig)
231
+        nb_suppr=999
232
+        while nb_suppr != 0:
233
+            nb_suppr = test(nb_suppr)
234
+
235
+    con.commit()
236
+    con.close()
237
+
238
+
185 239
 if __name__ == '__main__':
186 240
     args = parser()
187 241
     if not len(sys.argv) > 1: # Si aucun argument : export SQLite
@@ -193,6 +247,7 @@ if __name__ == '__main__':
193 247
         geo2df(f)
194 248
 if args.sql:
195 249
     geo2db()
250
+    geo_clean()
196 251
 if args.csv:
197 252
      geo2csv()
198 253
 gar2df()