У меня есть фрейм данных, который имеет 3 столбца, Latitude, Longitude и Median_Income.Мне нужно получить средний медианный доход по всем точкам в пределах x км от исходной точки в 4-й колонке.Мне нужно делать это для каждого наблюдения.
Я попытался сделать 3 функции, которые я использую, чтобы попытаться сделать это быстро.Тем не менее, данные кадры обрабатываются вечно (часы).Я еще не видел ошибку, так что, похоже, она работает нормально.
Формула Хаверсайна, которую я нашел здесь.Я использую его для вычисления расстояния между двумя точками, используя широту / долготу.
from math import radians, cos, sin, asin, sqrt
def haversine(lon1, lat1, lon2, lat2):
#Calculate the great circle distance between two points
#on the earth (specified in decimal degrees)
# convert decimal degrees to radians
lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2])
# haversine formula
dlon = lon2 - lon1
dlat = lat2 - lat1
a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2
c = 2 * asin(sqrt(a))
r = 6371 # Radius of earth in kilometers. Use 3956 for miles
return c * r
Моя функция hav_checker будет проверять расстояние текущей строки относительно всех остальных строк, возвращая фрейм данных с расстоянием haversine в столбце.
def hav_checker(row, lon, lat):
hav = haversine(row['longitude'], row['latitude'], lon, lat)
return hav
Моя функция захвата значений использует фрейм, возвращенный hav_checker, для возврата среднего значения из моего целевого столбца (median_income).
Для справки, я использую набор данных жилья Калифорнии дляпостроить это.
def value_grabber(row, frame, threshold, target_col):
frame = frame.copy()
frame['hav'] = frame.apply(hav_checker, lon = row['longitude'], lat = row['latitude'], axis=1)
mean_tar = frame.loc[frame.loc[:,'hav'] <= threshold, target_col].mean()
return mean_tar
Я пытаюсь вернуть эти 3 столбца в исходный фрейм данных для проекта по проектированию объектов в рамках более крупного проекта класса.
df['MedianIncomeWithin3KM'] = df.apply(value_grabber, frame=df, threshold=3, target_col='median_income', axis=1)
df['MedianIncomeWithin1KM'] = df.apply(value_grabber, frame=df, threshold=1, target_col='median_income', axis=1)
df['MedianIncomeWithinHalfKM'] = df.apply(value_grabber, frame=df, threshold=.5, target_col='median_income', axis=1)
Я смогуспешно сделать это с циклом, но это требует очень много времени и требует более быстрого решения.