아파트 주소를 기준으로 한 위도와 경도 x, y 좌표값과 공원 주소를 기준으로 한 위도와 경도 x, y 좌표값이 존재한다.
이때, 경도와 위도를 가지고 거리를 계산해서 1km 이내에 공원이 몇 개 있는지를 새로운 컬럼으로 넣어준다.
HOW
1) 아파트와 공원 좌표값을 넣어주면, 거리를 계산해주는 함수를 만든다.
2) 1km 이내 거리에 있는 공원의 합계를 리턴하는 함수를 만든다.
3) 데이터셋에 새로운 컬럼으로 붙여 넣는다.
from scipy.spatial.distance import cdist
import numpy as np
from math import radians, sin, cos, sqrt, atan2
#모든 아파트와 모든 공원 사이의 거리를 계산. 결과는 2차원 배열로, 각 행은 공원, 각 열은 아파트.
def haversine_distances(apt_coords, park_coords):
# 지구의 반경 (km)
R = 6371.0
apt_coords = np.radians(apt_coords)
park_coords = np.radians(park_coords)
diff = park_coords[:, np.newaxis] - apt_coords
a = np.sin(diff[:,:,0]/2)**2 + \
np.cos(park_coords[:,0])[:, np.newaxis] * np.cos(apt_coords[:,0]) * \
np.sin(diff[:,:,1]/2)**2
c = 2 * np.arctan2(np.sqrt(a), np.sqrt(1-a))
return R * c
def count_parks_within_radius(apt_coords, park_coords, radius_km=1):
distances = haversine_distances(apt_coords, park_coords)
return np.sum(distances <= radius_km, axis=0)
#모든 아파트의 좌표(경도, 위도)를 numpy 배열로 변환
apt_coords = merge[['x', 'y']].values
#모든 공원의 좌표(경도, 위도)를 numpy 배열로 변환
park_coords = park[['X좌표(WGS84)', 'Y좌표(WGS84)']].values
# 각 아파트 주변 1km 내의 공원 수 계산
merge['주변공원개수'] = count_parks_within_radius(apt_coords, park_coords)
# 결과 확인
print(merge['주변공원개수'].value_counts())
0 478152
1 413030
2 183969
3 57722
4 7262
5 968
6 17
Name: 주변공원개수, dtype: int64
'공부방 > Upstage AI Lab 4기' 카테고리의 다른 글
가상환경 깔고나서 가상환경이 있던 폴더 이름 바꾸지 말자!!! (0) | 2024.09.25 |
---|---|
데이터프레임 merge할 때 중복값 때문에 shape이 망가진다면 (0) | 2024.09.25 |
학습일지 | MLOps에 대한 대략적인 소개 (0) | 2024.09.23 |
경진대회 Fast-Up Report (1) | 2024.09.20 |
진짜로 나는 지금 뭘 배우고 있는 건가 (1) | 2024.09.16 |