জিওপ্যান্ডস স্থানিক চূড়ান্তভাবে ধীরে ধীরে যোগ দেয়


14

আমি কয়েক মিলিয়ন জিপিএস পয়েন্টের জন্য একটি দেশ (এবং কখনও কখনও রাষ্ট্র) সন্ধান করতে নীচের কোডটি ব্যবহার করছি। কোডটি বর্তমানে প্রতি পয়েন্টে প্রায় এক সেকেন্ড সময় নেয় যা অবিশ্বাস্যরূপে ধীর। শেফফাইলটি 6 এমবি।

আমি পড়েছি যে জিওপ্যান্ডগুলি স্থানিক যোগদানের জন্য rtree ব্যবহার করে, তাদের অবিশ্বাস্যভাবে দক্ষ করে তোলে, তবে এটি এখানে কাজ করে বলে মনে হয় না। আমি কি ভুল করছি? আমি প্রতি সেকেন্ড বা এক হাজার পয়েন্টের জন্য আশা করছিলাম।

শেফফাইল এবং সিএসভি এখানে (5MB) ডাউনলোড করা যাবে: https://www.DPboxbox.com/s/gdkxtpqupj0sidm/SpatialJoin.zip?dl=0

import pandas as pd
import geopandas as gpd
from geopandas import GeoDataFrame, read_file
from geopandas.tools import sjoin
from shapely.geometry import Point, mapping,shape
import time


#parameters
shapefile="K:/.../Shapefiles/Used/World.shp"
df=pd.read_csv("K:/.../output2.csv",index_col=None,nrows=20)# Limit to 20 rows for testing    

if __name__=="__main__":
    start=time.time()
    df['geometry'] = df.apply(lambda z: Point(z.Longitude, z.Latitude), axis=1)
    PointsGeodataframe = gpd.GeoDataFrame(df)
    PolygonsGeodataframe = gpd.GeoDataFrame.from_file(shapefile)
    PointsGeodataframe.crs = PolygonsGeodataframe.crs
    print time.time()-start
    merged=sjoin(PointsGeodataframe, PolygonsGeodataframe, how='left')
    print time.time()-start
    merged.to_csv("K:/01. Personal/04. Models/10. Location/output.csv",index=None)
    print time.time()-start

আপনার ডেটা লিঙ্কটি 404
হারুন

উত্তর:


17

sjoin ফাংশনে op = 'এর মধ্যে' যুক্তি যুক্ত করে পয়েন্ট-ইন-বহুভুজ ক্রিয়াকে নাটকীয়ভাবে গতি দেয়।

ডিফল্ট মানটি হল op = 'ছেদ করা', যা আমি অনুমান করি যে এটিও সঠিক ফলাফলের দিকে নিয়ে যাবে তবে এটি 100 থেকে 1000 গুণ বেশি ধীর।


যে কারও এটি পড়ার জন্য, এর অর্থ এই নয় যে withinএটি সাধারণত কোনওভাবে দ্রুত হয়, নীচে নিক_জি এর উত্তরটি পড়ুন।
inc42

7

জিওপ্যান্ডাস স্থানিক যোগদানের ক্ষেত্রে কীভাবে আর-গাছের সুবিধা নেওয়ার প্রশ্নটি জিজ্ঞাসা করে, এবং অন্য একটি উত্তরদাতা সঠিকভাবে উল্লেখ করেছেন যে আপনাকে 'ছেদ করা' পরিবর্তে 'ভিতরে' ব্যবহার করা উচিত। যাইহোক, আপনি intersects/ জিওপ্যান্ডাসে আর-ট্রি স্পটিয়াল ইনডেক্সের সুবিধা নিতে পারেন / ব্যবহার করার সময় intersection, এই জিওপ্যান্ডাস আর-ট্রি টিউটোরিয়ালে প্রদর্শিত হয়েছে :

spatial_index = gdf.sindex
possible_matches_index = list(spatial_index.intersection(polygon.bounds))
possible_matches = gdf.iloc[possible_matches_index]
precise_matches = possible_matches[possible_matches.intersects(polygon)]

6

এখানে সম্ভবত যা চলছে তা হ'ল ডান দিকের কেবলমাত্র ডেটাফ্রেমই rtree সূচকে দেওয়া হয়: https://github.com/geopandas/geopandas/blob/master/geopandas/tools/sjoin.py#L48-L55 কোনটি op="intersects"রান মানে বহুভুজকে সূচকে খাওয়ানো হয়েছিল, সুতরাং প্রতিটি পয়েন্টের জন্য, একই বহুভুজটি rtree সূচকের মাধ্যমে পাওয়া যায়।

তবে এর জন্য op="within", জিওডাটাফ্রেমগুলি উল্টানো হয়েছে যেহেতু অপারেশনটি আসলে বিপরীত contains: https://github.com/geopandas/geopandas/blob/master/geopandas/tools/sjoin.py#L41-L43

কি খাচ্ছ এই বেলা যখন আপনি জাগ্রত opথেকে op="intersects"থেকে op="within"যে প্রতি বহুভুজ জন্য সংশ্লিষ্ট পয়েন্ট rtree সূচক, যা আপনার ক্ষেত্রে ক্যোয়ারী আপ sped মাধ্যমে পাওয়া হয়।


1
আপনি অ স্থায়ী ইউআরএল ব্যবহার করেছেন, আপনি কি কোনও নির্দিষ্ট সংশোধনীতে আপডেট করতে পারেন?
inc42
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.