Mam ramkę danych, która zawiera identyfikator grupy, dwie miary odległości (miara długości/szerokości geograficznej) i wartość. Dla danego zestawu odległości chcę znaleźć liczbę innych pobliskich grup oraz średnie wartości innych pobliskich grup.Przyspieszenie obliczania pobliskich grup?
Napisałem poniższy kod, ale jest tak nieefektywny, że po prostu nie kończy się w rozsądnym czasie dla bardzo dużych zestawów danych. Kalkulacja pobliskich sprzedawców jest szybka. Ale obliczenie średniej wartości pobliskich sprzedawców detalicznych to wyjątkowo powolny. Czy istnieje lepszy sposób na zwiększenie wydajności?
distances = [1,2]
df = pd.DataFrame(np.random.randint(0,100,size=(100, 4)),
columns=['Group','Dist1','Dist2','Value'])
# get one row per group, with the two distances for each row
df_groups = df.groupby('Group')[['Dist1','Dist2']].mean()
# create KDTree for quick searching
tree = cKDTree(df_groups[['Dist1','Dist2']])
# find points within a given radius
for i in distances:
closeby = tree.query_ball_tree(tree, r=i)
# put into density column
df_groups['groups_within_' + str(i) + 'miles'] = [len(x) for x in closeby]
# get average values of nearby groups
for idx, val in enumerate(df_groups.index):
val_idx = df_groups.iloc[closeby[idx]].index.values
mean = df.loc[df['Group'].isin(val_idx), 'Value'].mean()
df_groups.loc[val, str(i) + '_mean_values'] = mean
# merge back to dataframe
df = pd.merge(df, df_groups[['groups_within_' + str(i) + 'miles',
str(i) + '_mean_values']],
left_on='Group',
right_index=True)