dataframe- go: Как фильтровать, используя операторы <>? - PullRequest
0 голосов
/ 20 апреля 2020

Я пытаюсь сделать простой фильтр в dataframe-go. Я адаптировался на примере Github и попытался использовать простой оператор > в функции фильтра, но компилятор выдал ошибку invalid operation: vals["day"] > 4 (operator > not defined on interface) (см. Мой код ниже)

ОК, поэтому я изменил тип на map[string]int64 но потом выдал ошибку: cannot convert func literal (type func(map[string]int64, int, int) (dataframe.FilterAction, error)) to type dataframe.FilterDataFrameFn.

Я очень хорошо знаком с R DataFrame / Table и Pandas, но API dataframe-go довольно запутан. Единственный ресурс, который я нашел, это this , но автор также заявил, что не может понять API фильтра.

Любая помощь приветствуется, спасибо!

    s1 := dataframe.NewSeriesInt64("day", nil, 1, 2, 3, 4, 5, 6, 7, 8)
    s2 := dataframe.NewSeriesFloat64("sales", nil, 50.3, 23.4, 56.2, nil, nil, 84.2, 72, 89)
    df := dataframe.NewDataFrame(s1, s2)

    // Try filtering
    filterFn := dataframe.FilterDataFrameFn(
        func(vals map[string]int64, row, nRows int) (dataframe.FilterAction, error) {
        //func(vals map[interface{}]interface{}, row, nRows int) (dataframe.FilterAction, error) {
        if vals["day"] > 4 {  // <= This is where I changed things
            return dataframe.KEEP, nil
        }
        return dataframe.DROP, nil
        })

    ctx := context.Background()
    dt_filtered, _ := dataframe.Filter(ctx, df, filterFn)

    fmt.Print(dt_filtered)

1 Ответ

1 голос
/ 20 апреля 2020

Вы должны передать функцию с необходимой подписью, поэтому vals должно быть map[interface{}]interface{}. Это необходимо, поскольку Go не является интерпретируемым языком, а код, вызывающий эту функцию, переданную в качестве аргумента, не знает во время компиляции переданную функцию.

Поскольку ваши значения interface{} s Вы должны преобразовать их в правильный тип для работы с ними:

if ivalue, ok:=vals["day"].(int64); ok { // Check if the value is int64, and go ahead if so
    if ivalue > 4 { 
       return dataframe.KEEP, nil
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...