Создать функцию для идентификации агрегации столбца для всех столбцов на определенном расстоянии от другого - PullRequest
0 голосов
/ 12 апреля 2019

У меня есть фрейм данных, который имеет 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)

Я смогуспешно сделать это с циклом, но это требует очень много времени и требует более быстрого решения.

...