Ho un file CSV contenente la distanza tra centroidi in un modello GIS nel prossimo format:Come velocizzare il codice - la ricerca attraverso un dataframe richiede ore
InputID,TargetID,Distance
1,2,3050.01327866
1,7,3334.99565217
1,5,3390.99115304
1,3,3613.77046864
1,4,4182.29900892
...
...
3330,3322,955927.582933
Si è ordinato sulla provenienza (InputID
) e quindi sulla destinazione più vicina (TargetID
).
Per uno specifico strumento di modellazione ho bisogno di questi dati in un file CSV, formattati come segue (i numeri sono i numeri baricentro):
distance1->1, distance1->2, distance1->3,.....distance1->3330
distance2->1, distance2->2,.....
.....
distance3330->1,distance3330->2....distance3330->3330
Quindi niente InputID del o TargetID, a soli le distanze con le origini su le righe e le destinazioni sulle colonne: (esempio per i primi 5 origini/destinazioni)
0,3050.01327866,3613.77046864,4182.29900892,3390.99115304
3050.01327866,0,1326.94611797,1175.10254872,1814.45584129
3613.77046864,1326.94611797,0,1832.209595,3132.78725738
4182.29900892,1175.10254872,1832.209595,0,1935.55056767
3390.99115304,1814.45584129,3132.78725738,1935.55056767,0
ho costruito il codice successivo, e funziona. Ma è così lento che l'esecuzione richiederà giorni per ottenere il file 3330x3330. Come io sono un principiante in Python penso che sto sottovalutando qualcosa ...
import pandas as pd
import numpy as np
file=pd.read_csv('c:\\users\\Niels\\Dropbox\\Python\\centroid_distances.csv')
df=file.sort_index(by=['InputID', 'TargetID'], ascending=[True, True])
number_of_zones=3330
text_file = open("c:\\users\\Niels\\Dropbox\\Python\\Output.csv", "w")
for origin in range(1,number_of_zones):
output_string=''
print(origin)
for destination in range(1,number_of_zones):
if origin==destination:
distance=0
else:
distance_row=df[(df['InputID']==origin) & (df['TargetID'] == destination)]
# I guess this is the time-consuming part
distance=distance_row.iloc[0]['Distance']
output_string=output_string+str(distance)+','
text_file.write(output_string[:-1]+'\n') #strip last ',' of line
text_file.close()
Mi può dare qualche suggerimento per accelerare questo codice?
Non capisco il formato CSV. Potete fornire un esempio di input/output esplicito? –
Fatto. Grazie in anticipo! – Nelis