У меня есть фрейм данных с координатами (X, Y), и мне нужно получить список с координатами точек с самой высокой плотностью.
Я использовал среднее значение координат (X, Y) и вычислить с этой точки расстояние до всех остальных точек, а затем упорядочить их, но среднее значение не всегда находится в самой плотной точке.Используя gaussian_kde, я могу визуализировать самые плотные точки, но я не знаю, как извлечь точки из списка.
import numpy as np
import pandas as pd
import pylab as plt
import random
from scipy.stats import gaussian_kde
from scipy.spatial.distance import cdist
from scipy.spatial import distance
def closest_point(point, points):
""" Find the nearest point. """
return points[cdist([point], points).argmin()]
x = [random.randint(0, 100) for x in range(1, 51)]
y = [random.randint(0, 100) for x in range(1, 51)]
fr = pd.DataFrame({'x':x,'y':y})
mx = fr['x'].mean()
my = fr['y'].mean()
fr2 = pd.DataFrame({'x':[mx],'y':[my]})
fr['Punto'] = [(x, y) for x,y in zip(fr['x'], fr['y'])]
fr2['Punto'] = [(x, y) for x,y in zip(fr2['x'], fr2['y'])]
fr2['Cercano'] = [closest_point(x, list(fr['Punto'])) for x in fr2['Punto']]
lista = fr['Punto'].tolist()
media = fr2['Punto'].tolist()
distancia_numpy = distance.cdist(lista,media, 'euclidean')
distancia_lista = np.array(distancia_numpy).tolist()
distancia_serie = pd.Series(distancia_lista)
"""
we place a new column with the distance from the average point to the nearest point
"""
fr['Distancia'] = distancia_serie
ordenado = fr.sort_values('Distancia', ascending = True)
xy = np.vstack([x,y])
z = gaussian_kde(xy)(xy)
fig, ax = plt.subplots()
ax.scatter(x, y, s=50, c=z, edgecolor='')
"""in red the mean of the points"""
ax.scatter(mx, my, s=100,c='red', edgecolor='')
plt.show()
print (ordenado)
результатом должен быть сначала список или упорядоченный массив данных с самыми плотными точками, фактическиЯ получаю эти результаты, но они не верны, поскольку средняя точка не находится в точке наибольшей плотности.Любая помощь очень приветствуется