コールGoogleの距離のAPIへのデータフレームを反復処理する最善の方法

Groszours:

私はGoogleからの距離を取得するための最良の解決策は、75K行の周りにある座標(原点&目的地)で構成される私のデータフレームのための距離APIをマッピングしているかを知りたいと思います。

    #Origin                     #Destination

1   (40.7127837, -74.0059413)   (34.0522342, -118.2436849)
2   (41.8781136, -87.6297982)   (29.7604267, -95.3698028)
3   (39.9525839, -75.1652215)   (40.7127837, -74.0059413)
4   (41.8781136, -87.6297982)   (34.0522342, -118.2436849)
5   (29.7604267, -95.3698028)   (39.9525839, -75.1652215)

これまでのところ私のコードのデータフレームを反復処理し、新たな「距離」欄への距離値をコピーするAPIを呼び出します。

df['distance'] = ""

for index, row in df.iterrows():
    result = gmaps.distance_matrix(row['origin'], row['destination'], mode='driving')
    status = result['rows'][0]['elements'][0]['status']
    if status == "OK":                               # Handle "no result" exception
        KM = int(result['rows'][0]['elements'][0]['distance']['value'] / 1000)
        df['distance'].iloc[index] = KM
    else:
        df['distance'].iloc[index] = 0

df.to_csv('distance.csv')

私は望ましい結果を得るが、私はデータフレームを反復読んだから、むしろ非効率であり、避けるべきです。それは、すべてのデータフレームを行うために1h30を取るので、それは、240行のために20 secondesを取りました。なお行われた後、再実行して、もはや、唯一の新しいいくつかの新しい行する必要はありません月(〜500)。

私たちここに最善の解決策は何でしょうか?

編集:誰もがGoogleの距離APIとその限界と経験を持っている場合は任意のヒント/ベストプラクティスを歓迎しています。

rpanai :

私は、同時呼び出しに関する制限事項について理解しようとしたここが、私は何かを見つけることができませんでした。いくつかの提案

避けループ

あなたのコードについて、私はむしろループや使用の最初の適用のためにスキップしたいです

def get_gmaps_distance(row):
    result = gmaps.distance_matrix(row['origin'], row['destination'], mode='driving')
    status = result['rows'][0]['elements'][0]['status']
    if status == "OK":
        KM = int(result['rows'][0]['elements'][0]['distance']['value'] / 1000)
    else:
        KM = 0
    return KM

df["distance"] = df.apply(get_gmaps_distance, axis=1)

あなたのデータフレームと使用マルチプロセッシングを分割

import multiprocessing as mp

def parallelize(fun, vec, cores=mp.cpu_count()):
    with mp.Pool(cores) as p:
        res = p.map(fun, vec)
    return res

# split your dataframe in many chunks as the number of cores

df = np.array_split(df, mp.cpu_count())

# this use your functions for every chunck 
def parallel_distance(x):
    x["distance"] = x.apply(get_gmaps_distance, axis=1)
    return x

df = parallelize(parallel_distance, df)

df = pd.concat(df, ignore_index=True, sort=False)

($$$保存)を2回同じ距離を計算しないでください。

ケースでは、重複は、あなたがそれらのいくつかをドロップする必要があります行しています

grp = df.drop_duplicates(["origin", "destination"]).reset_index(drop=True)

ここで私は上書きしませんでしたdf、それはおそらくあなたが必要とするより多くの情報が含まれていて、あなたがそれに結果をマージすることができますよう。

grp["distance"] = grp.apply(get_gmaps_distance, axis=1)

df = pd.merge(df, grp, how="left")

小数を削減

あなたはあなたにこの質問をする必要があります:私は本当に第七十進数に正確である必要がありますか?緯度の1度は〜111キロであるとして第七十進場所は〜1センチメートルにあなたの精度を断念します。あなたは、このことからアイデアを得るレス-以上されたときにどこにモデルを改良し、小数点以下を低減することができます。

結論

あなたが最終的に提案されたすべてのメソッドを使用することができた場合、あなたは、いくつかの興味深い改善点を得ることができます。私は自分でしようとする個人のAPIキーを持っていないように私はあなたがここにコメントしたいと思います。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=373061&siteId=1