Doubt For i Range Python

Asked

Viewed 57 times

0

First, I have 2 dataframe with several latitude and longitude points:

db_gas2['lat-long'] = db_gas2['latitude'].astype(str)+', '+db_gas2['longitude'] db_gas2

db_cidades3['lat-long'] = db_cidades3['latitude'].astype(str)+', '+db_cidades3['longitude'] db_cidades3.head()

db_gas2 has 37 lines (which are local)inserir a descrição da imagem aqui

db_cidades3 has 5,570 lines (municipalities of Brazil) inserir a descrição da imagem aqui

I managed to create this in a simulator, but not one for i range

#teste se a variavel "ponto gás" iria funcionar

ponto_gas = 1 # range de 0 a 36

cidade_origem = 1050 # range de 0 a 5569

p1 = (db_cidades3.iloc[cidade_origem]['lat-long'])

p1_n = (db_cidades3.iloc[cidade_origem]['cidade'])

p2 = (db_gas2.iloc[ponto_gas]['lat-long'])

p2_n = (db_gas2.iloc[ponto_gas]['Ponto de entrega'])

print("A distância entre a cidade", p1_n, "e o ponto de entrega", p2_n, "é de:") print(round((distance.distance(p1, p2).km),2),"km")

The answer comes true "The distance between the city of Teixeiras and the TBG Bilac delivery point is: 794.22 km"

However, how to do it for each municipality is calculated the distance for the 37 gas lines. I want to automatically take line 1 of "db_city3" and calculate distance for all lines of "db_gas2", after that take line 2 of "db_city3" and calculate distance for all lines of "db_gas2" ...

Can you help me?

1 answer

4

When we use pandas or other libraries, we have the idea that they solve everything. Python has numerous libraries that, working together, make it a super programming language.

That said, let’s get to the problem: Correlate all cities with delivery points.

To do this, we can think of a nested loop (nested loop) as below:

for cidade in cidades:
    for pt_entrega in pontos_de_entrega:
        # seu codigo

Note: In the pandas would be something like for idx, row in df.iterrows():

That’s not performative at all!!!

Let’s go to the solution

Loading libraries

import io               # Esta servirá apenas para este teste
import itertools
import pandas as pd

from geopy import distance

Defining locations

cidades1 = """
Código IBGE,Nome do Município,Código UF,UF,Estado,Capital,Latitude,Longitude
5200100,Abadiânia,52,GO,Goiás,0,-16.1970,-48.7057
3100203,Abaeté,31,MG,Minas Gerais,0,-19.1551,-45.4444
4314902,Porto Alegre,43,RS,Rio Grande do Sul,1,-30.0318,-51.2065
"""

cidades2 = """
Código IBGE,Nome do Município,Código UF,UF,Estado,Capital,Latitude,Longitude
5200050,Abadia de Goiás,52,GO,Goiás,0,-16.7573,-49.4412
3100104,Abadia dos Dourados,31,MG,Minas Gerais,0,-18.4831,-47.3916
"""

Note since I don’t have access to the base, I used the above localities.

Creating dataframes

df1 = pd.read_csv(io.StringIO(cidades1), sep=",")
df2 = pd.read_csv(io.StringIO(cidades2), sep=",")

Turning into list of tuples

campos = ['Nome do Município', 'Latitude', 'Longitude']

l1 = df1[campos].to_records(index=False)
l2 = df2[campos].to_records(index=False)

Generating the result

todos_para_todos = itertools.product(l1, l2)

for par_de_localidades in todos_para_todos:
    c1, lat1, lon1 = par_de_localidades[0]
    c2, lat2, lon2 = par_de_localidades[1]
    distancia = round((distance.distance((lat1, lon1), (lat2,lon2)).km),2)
    print(f"A distância entre a cidade {c1} e o ponto de entrega {c2} é de: {distancia}km")

Note: Note that the variable todos_para_todos is the cat jump

Upshot

A distância entre a cidade Abadiânia e o ponto de entrega Abadia de Goiás é de: 100.06km
A distância entre a cidade Abadiânia e o ponto de entrega Abadia dos Dourados é de: 289.0km
A distância entre a cidade Abaeté e o ponto de entrega Abadia de Goiás é de: 499.64km
A distância entre a cidade Abaeté e o ponto de entrega Abadia dos Dourados é de: 218.31km
A distância entre a cidade Porto Alegre e o ponto de entrega Abadia de Goiás é de: 1481.15km
A distância entre a cidade Porto Alegre e o ponto de entrega Abadia dos Dourados é de: 1336.25km

Final Note: I did not put the output of the dataframes, list of tuples and etc, not to leave the extensive answer.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.