Для набора данных, состоящего из:
- координаты x, y
- глубина z
- определенное значение c
Я хотел бы сделать следующее более эффективным:
- bin, набор данных в 2D bin, основанный на координатах (x, y)
- , взять 10 самых глубоких точек данных (z)на бин
- рассчитать среднее значение c из этих 10 точек данных на бин
Наконец покажите 2-мерную тепловую карту с вычисленными средними значениями.
Я нашелрабочее решение, но это занимает слишком много времени для небольших контейнеров и / или больших наборов данных.
Есть ли более эффективный способ достижения того же результата?
Текущий рабочий пример
Пример кадра данных:
import numpy as np
from numpy.random import rand
import pandas as pd
import math
import matplotlib.pyplot as plt
n = 10000
df = pd.DataFrame({'x':rand(n), 'y':rand(n), 'z':rand(n), 'c':rand(n)})
Бин набора данных:
cell_size = 0.01
nx = math.ceil((max(df['x']) - min(df['x'])) / cell_size)
ny = math.ceil((max(df['y']) - min(df['y'])) / cell_size)
x_range = np.arange(0, nx)
y_range = np.arange(0, ny)
df['xbin'], x_edges = pd.cut(x=df['x'], bins=nx, labels=x_range, retbins=True)
df['ybin'], y_edges = pd.cut(x=df['y'], bins=ny, labels=y_range, retbins=True)
Код, который теперь занимает длинную позицию:
df = df.groupby(['xbin', 'ybin']).apply(
lambda d: d.sort_values('z').head(10).mean())
Обновление пустого кадра данных дляБункеры без данных и показывают результат:
index = pd.MultiIndex.from_product([x_range, y_range],
names=['xbin', 'ybin'])
tot_df = pd.DataFrame(index=index, columns=['z', 'c'])
tot_df.update(df)
zval = tot_df['c'].astype('float').values
zval = zval.reshape((nx, ny))
zval = zval.T
zval = np.flipud(zval)
extent = [min(x_edges), max(x_edges), min(y_edges), max(y_edges)]
plt.matshow(zval, aspect='auto', extent=extent)
plt.show()