Je veux extraire toutes les coordonnées d'une table qui sont à l'intérieur d'un rayon donné. Comment dois-je définir la boucle for?
J'utilise la formule haversine pour cela et je saisis simplement les valeurs lat et lon du point central et les valeurs lat et lon du point à tester s'il est dans le rayon donné.
J'ai donc pensé que j'avais besoin d'une boucle for où j'exécute la formule haversine pour chaque ligne de la colonne lat et lon et si les cooridnates sont à l'intérieur du rayon, je les sauvegarde dans une liste.
File "<ipython-input-574-02dadebee55c>", line 18 ^ SyntaxError: unexpected EOF while parsing
Avec le code donné, j'obtiens le message d'erreur suivant:
#Get coordinates #Center coordinates = nearest road location lat1 = float(lowParkingUtilization.iloc[roadIndex].toLat) lon1 = float(lowParkingUtilization.iloc[roadIndex].toLon) #Test coordinates = scooter coordinates insideRadius = [] radius = 2.50 # in kilometer for i in eScooterVOI['lat']: lat2 = float(eScooterVOI['lat'][i]) lon2 = float(eScooterVOI['lon'][i]) a = haversine(lon1, lat1, lon2, lat2) if a <= radius: insideRadius += str(lon2)+","+str(lat2) else:
3 Réponses :
Le message d'erreur SyntaxError: EOF inattendu lors de l'analyse
signifie que certains des blocs de code ne sont pas terminés et que la fin du code est atteinte.
Votre bloc else
nécessite au moins une ligne de code qui devrait y figurer.
Par exemple:
else: lots_of_code_to_write_here
p>
Vous avez rencontré cette erreur à cause de votre bloc else
.
Lorsque Python le lit, il s'attend à ce que du code soit écrit. Python n'en trouve pas, donc une erreur se produit.
Votre code fonctionne peut-être déjà, supprimez simplement le bloc else
, vous pouvez utiliser un bloc if
sans être obligé d'utiliser un else
un.
Quoi qu'il en soit, si vous voulez absolument utiliser un bloc else
, essayez quelque chose comme ça:
if a <= radius: insideRadius += str(lon2)+","+str(lat2) else : pass
Mais je le fais ne pense pas qu'il est recommandé.
La bonne réponse à la question "Comment dois-je définir la boucle for?" est: VOUS NE FAITES PAS. Les dataframes pandas
ne sont pas pour boucler sur leurs lignes. Ce que vous devez faire est de créer deux nouvelles colonnes dans le dataframe, une pour calculer la distance, et une pour stocker les noms au format souhaité:
insideRadius = list(eScooterVOI[eScooterVOI['dist'] <= radius]['name'])
Et puis, pour obtenir une liste avec uniquement les noms des coordonnées dont la distance est inférieure au rayon utiliser:
eScooterVOI['dist'] = eScooterVOI.apply(lambda x: haversine(lon1, lat1, x['lon'], x['lat']), axis=1) eScooterVOI['name'] = eScooterVOI['lon'].astype(str) + ',' + eScooterVOI['lat'].astype(str)
btw: la fonction haversine
peut être construite dans un manière qu'il reçoit une série pandas
au lieu d'une valeur, et par cela il pourrait être implémenté beaucoup plus rapidement que d'utiliser df.apply
, mais cela nécessiterait de changer un code qui est pas ici dans la question.
Vous avez besoin de code dans le bloc
else
.Vous pouvez supprimer
else
de votre code car il ne fait rien. ou Vous pouvez mettreelse: pass
(avec indentation)