J'ai une liste d'augmentation de distance entre deux gares adjacentes d'un chemin de fer dans le bon ordre. Ce que je dois faire est de créer une matrice pour les distances entre toutes les deux stations. Voici cette liste.



    +-------------------------+-------------------------+---------------+
    |    Departure Station    |     Arrival Station     | distance in m |
    +-------------------------+-------------------------+---------------+
    |                         | San Francisco           |           0.0 |
    | San Francisco           | 22nd Street             |   2521.949349 |
    | 22nd Street             | Bayshore                |     5875.8986 |
    | Bayshore                | South San Francisco     |   6690.161279 |
    | South San Francisco     | San Bruno               |   2964.853585 |
    | San Bruno               | Millbrae Transit Center |   4154.792069 |
    | Millbrae Transit Center | Broadway                |   2549.171972 |
    | Broadway                | Burlingame              |   1762.653178 |
    | Burlingame              | San Mateo               |   2307.847611 |
    | San Mateo               | Hayward Park            |   2148.992125 |
    | Hayward Park            | Hillsdale               |   2597.932334 |
    | Hillsdale               | Belmont                 |       2092.15 |
    | Belmont                 | San Carlos              |   1990.239598 |
    | San Carlos              | Redwood City            |   3492.618122 |
    | Redwood City            | Atherton                |   3847.644532 |
    | Atherton                | Menlo Park              |    1752.92218 |
    | Menlo Park              | Palo Alto               |   2011.382315 |
    | Palo Alto               | Stanford                |   1582.663905 |
    | Stanford                | California Ave.         |       965.606 |
    | California Ave.         | San Antonio             |   3939.685111 |
    | San Antonio             | Mountain View           |   3108.414275 |
    | Mountain View           | Sunnyvale               |    4312.51742 |
    | Sunnyvale               | Lawrence                |   3189.943773 |
    | Lawrence                | Santa Clara             |   5889.680131 |
    | Santa Clara             | College Park            |    2252.43061 |
    | College Park            | San Jose Diridon        |   1872.857195 |
    | San Jose Diridon        | Tamien                  |   2887.967478 |
    | Tamien                  | Capitol                 |    4999.21158 |
    | Capitol                 | Blossom Hill            |   5304.202424 |
    | Blossom Hill            | Morgan Hill             |   19050.76536 |
    | Morgan Hill             | San Martin              |     5917.5495 |
    | San Martin              | Gilroy                  |   10061.59472 |
    | Gilroy                  | Gilroy                  |           0.0 |
    +-------------------------+-------------------------+---------------+



Mon idée était de faire une liste de distances et un dictionnaire des stations et de leurs index pour faire une matrice où les valeurs seront générées en regardant le dictionnaire des stations et en définissant la plage d'indices dans laquelle nous avons besoin de résumer les distances. J'ai beaucoup travaillé sur cette matrice mais je n'ai pas pu obtenir les résultats.

import pandas as pd
file = open('/Users/miss_evgenia/Downloads/Caltrain Metrics - Sheet4.csv')
dist = pd.read_csv(file)
distances = list(dist['distance in m'])
#%%
names = list(dist['Departure Station'])
names.pop(0)
names= dict(zip(names, range(len(names))))
#%%
def sumRange(L,a,b):
    sum = 0
    for i in range(a,b+1,1):
        sum += L[i]
    return sum

Voici le dictionnaire et la liste que j'ai.

{'San Francisco': 0, '22nd Street': 1, 'Bayshore': 2, 'South San Francisco': 3, 'San Bruno': 4, 'Millbrae Transit Center': 5, 'Broadway': 6, 'Burlingame': 7, 'San Mateo': 8, 'Hayward Park': 9, 'Hillsdale': 10, 'Belmont': 11, 'San Carlos': 12, 'Redwood City': 13, 'Atherton': 14, 'Menlo Park': 15, 'Palo Alto': 16, 'Stanford': 17, 'California Ave.': 18, 'San Antonio': 19, 'Mountain View': 20, 'Sunnyvale': 21, 'Lawrence': 22, 'Santa Clara': 23, 'College Park': 24, 'San Jose Diridon': 25, 'Tamien': 26, 'Capitol': 27, 'Blossom Hill': 28, 'Morgan Hill': 29, 'San Martin': 30, 'Gilroy': 31}

[0.0, 2521.949349, 5875.8986, 6690.161279, 2964.8535850000003, 4154.792069, 2549.171972, 1762.653178, 2307.847611, 2148.992125, 2597.932334, 2092.15, 1990.2395980000001, 3492.618122, 3847.6445320000003, 1752.92218, 2011.3823149999998, 1582.663905, 965.6060000000001, 3939.685111, 3108.414275, 4312.51742, 3189.943773, 5889.680131, 2252.4306100000003, 1872.8571949999998, 2887.967478, 4999.21158, 5304.202424, 19050.765359999998, 5917.5495, 10061.594720000001, 0.0]

Aidez-moi, s'il vous plaît! Je vous remercie.

4
ZheniaMagic 24 mai 2020 à 13:36

3 réponses

Meilleure réponse

En plus de a_guest, vous pouvez également essayer ce qui suit pour récupérer le résultat en tant que dataframe pandas avec des étiquettes

def transform_dataframe():
    with open("test_data.csv", "r") as input_data:
        station_distances = pd.read_csv(input_data)
        # to stop gilroy appearing twice
        station_distances.drop(station_distances.tail(1).index,inplace=True)
    cumulative_distances = station_distances['distance in m'].cumsum()

    distance_matrix = cumulative_distances.values - cumulative_distances.values[:, None]
    distance_matrix = pd.DataFrame(distance_matrix, index=station_distances["Arrival Station"], columns=station_distances["Arrival Station"])
    return distance_matrix
1
MindOfMetalAndWheels 24 mai 2020 à 11:34

Vous pouvez calculer les "positions" des stations comme le cumsum des distances, puis utiliser scipy.spatial.distance.pdist pour le calcul des distances:

from scipy.spatial.distance import pdist, squareform

positions = data['distance in m'].cumsum()
matrix = squareform(pdist(positions.to_numpy()[:, None], 'euclidean'))
7
a_guest 24 mai 2020 à 10:51

Si les noms de la gare sont les mêmes au départ et à l'arrivée, vous pouvez peut-être essayer quelque chose comme ceci:

cities = np.unique(distance_table["Departure Station"])
matrix = pd.DataFrame(columns = cities, index = cities)
for j in distance_table:
    matrix.at[distance_matrix.iloc[j,0],distance_matrix.iloc[j,1]] = distance_matrix.iloc[j,2]

Où distance_table est celui que vous montrez dans votre question. Peut-être que vous pouvez même le faire avec un .apply ()

0
Let's try 24 mai 2020 à 10:49