Динамическая карта Holoviews с существующим фреймом данных Pandas

У меня есть фреймворк pandas, который я читал из базы данных, со структурой, похожей на

dt  t1  t2 val1 val2
12  A   C  12   33
13  A   B  42   39
14  T   C  12   09

и я пытаюсь создать DynamicMap из фрейма данных. Проблема в том, что все примеры динамических карт предназначены для генерации функций:

def gen_values(alpha, beta):
    return np.random.rand()* alpha +  beta

hv.DynamicMap(gen_values, kdims=['alpha', 'beta'])

и так далее. Проблема в том, что я хочу сделать что-то подобное, но с существующим фреймом данных, и если я попытаюсь передать его генерирующей функции, я получаю сообщение об ошибке отсутствия kdims:

def gen_from_pandas(col1, col2, filter_1, filter_2, df):
   df2 = df[(df[col1] == filter_1) & df[col2] == filter2]
   return hv.Curve(df2['dt'], df2['val1'])

hv.DynamicMap(gen_from_pandas, kdims=['col1', 'col2'])

Есть способ сделать это?


person Ivan    schedule 13.11.2017    source источник


Ответы (1)


Вы можете просто опустить ", df" из списка аргументов gen_from_pandas, если вы определили df до определения этой функции. Вместо этого вы сможете ссылаться на него во вложенном пространстве имен.

ETA: Если вы не можете сослаться на окружающее пространство имен, просто сделайте закрытие:

df = pd.DataFrame(dict(dt=[12,13,14], t1=['A','A','T'], t2=['C','B','C'], val1=[12,42,12], val2=[33,39,9]))

class fngen(object):
    def __init__(self, df):
        self.df = df

    def __call__(self, column):
        return df[column]

fn = fngen(df)

fn("t1")
person James A. Bednar    schedule 14.11.2017
comment
Это проблема в контексте, над которым я работаю. Я не могу полагаться на глобальную переменную, мне нужно передать ее функции. Если это невозможно, я не могу использовать динамические карты. - person Ivan; 14.11.2017
comment
Я немного не уверен, как вы предлагаете передать его функции; вы хотите передать его DynamicMap, а DynamicMap передать его функции? Мы могли бы поддержать это, но похоже, что вы могли бы просто использовать здесь замыкание - объект, который вы создаете, который имеет состояние, но может быть вызван как функция. См. Пример, добавленный выше. - person James A. Bednar; 15.11.2017
comment
В любом случае, было бы намного проще помочь с этим, если бы существовал исполняемый пример, потому что пока неясно, что будет предоставлять значения для любого из аргументов функции обратного вызова. - person James A. Bednar; 15.11.2017
comment
@ Иван: вы смогли запустить это? Кроме того, @James, я пытаюсь исправить аналогичную проблему stackoverflow.com/questions/53703731/. Я передаю df в вызываемый объект, передаваемый в DynamicMap, и этот df каждый раз перечитывается. Я не смог понять, как использовать закрытие в моем случае (т.е. пользователь загрузит CSV, который затем должен визуализировать DynamicMap) - все примеры на странице HV используют набор данных stocks, доступный глобально. - person avg; 06.02.2019
comment
Вы можете использовать вышеприведенный шаблон для любого подобного случая. Просто создайте класс, поместите все, что вы хотите, чтобы произошло только один раз (включая любые аргументы, которые вы хотите предоставить только один раз), в метод __init__, затем поместите вещи, которые вы хотите выполнять при каждом обновлении, в метод __call__. Затем экземпляр этого класса можно использовать как вызываемый объект, имеющий собственное внутреннее состояние, созданное в __init__ и доступное в __call__, что устраняет необходимость доступа к глобальному состоянию. - person James A. Bednar; 07.02.2019