Запрос данных в пандах, где точки сгруппированы по функции hexbin - PullRequest
0 голосов
/ 10 января 2019

Как морские, так и панды предоставляют API для построения двумерных гистограмм в виде гексбина (пример, приведенный ниже). Тем не менее, я ищу, чтобы выполнить запрос для точек, которые находятся в одном и том же hexbin. Есть ли функция для извлечения строк, связанных с точками данных в гексбине?

Приведите пример: Мой фрейм данных содержит 3 строки: A, B и C. Я использую sns.jointplot(x=A,y=B), чтобы построить график плотности. Теперь я хочу выполнить запрос для каждой точки данных, расположенной в том же бункере. Например, для каждой ячейки вычислите среднее значение C, связанное с каждой точкой.

enter image description here

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Текущее решение - Quick Hack

В настоящее время я реализовал следующую функцию, чтобы применить функцию к данным, связанным с координатой (x, y), расположенной в том же гексбине:

def hexagonify(x, y, values, func=None):

    hexagonized_list = []

    fig = plt.figure()
    fig.set_visible(False)
    if func is not None:
        image = plt.hexbin(x=x, y=y, C=values, reduce_C_function=func)
    else:
        image = plt.hexbin(x=x, y=y, C=values)

    values = image.get_array()

    verts = image.get_offsets()
    for offc in range(verts.shape[0]):
            binx, biny = verts[offc][0], verts[offc][1]
            val = values[offc]
            if val:
                hexagonized_list.append((binx, biny, val))

    fig.clear()
    plt.close(fig)
    return hexagonized_list

Значения (того же размера, что и x или y) передаются через параметр values. Гексбины вычисляются с помощью функции hexbin, равной matplotlib. Значения извлекаются с помощью функции get_array() возвращаемого значения PolyCollection. По умолчанию функция np.mean применяется к накопленным значениям для бина. Эту функциональность можно изменить, предоставив функцию параметру func. Впоследствии метод get_offsets() позволяет нам вычислить центр бинов (, обсуждаемый здесь ). Таким образом, мы можем связать (по умолчанию) среднее значение предоставленных значений в гексбине. Однако это решение является взломом, поэтому любые улучшения этого решения приветствуются.

0 голосов
/ 10 января 2019

С matplotlib

Если вы уже нарисовали график, вы можете получить количество бинов из polycollection, возвращаемого matplotlib:

polycollection: экземпляр PolyCollection; используйте PolyCollection.get_array для этого, чтобы получить количество в каждом шестиугольнике.

Эта функция также доступна в:

Чистый pandas

Здесь MCVE использует только pandas, который может обрабатывать свойство C:

import numpy as np
import pandas as pd

# Trial Dataset:
N=1000
d = np.array([np.random.randn(N), np.random.randn(N), np.random.rand(N)]).T
df = pd.DataFrame(d, columns=['x', 'y', 'c'])

# Create bins: 
df['xb'] = pd.cut(df.x, 3)
df['yb'] = pd.cut(df.y, 3)

# Group by and Aggregate:
p = df.groupby(['xb', 'yb']).agg('mean')['c']
p.unstack()

Сначала мы создаем ячейки, используя pandas.cut. Затем мы группируем и объединяем . Вы можете выбрать функцию agg, которую хотите объединить C (например, max, median и т. Д.).

Вывод о:

yb               (-2.857, -0.936]  (-0.936, 0.98]  (0.98, 2.895]
xb                                                              
(-2.867, -0.76]          0.454424        0.519920       0.507443
(-0.76, 1.34]            0.535930        0.484818       0.513158
(1.34, 3.441]            0.441094        0.493657       0.385987
...