Octave isnan: ошибка не определена с использованием oct2py

#python #jupyter-notebook #octave #oct2py

#python #jupyter-notebook #octave #oct2py

Вопрос:

Использование oct2py для вызова corrcoef.m для нескольких фреймов данных размером (10 ММ ) для возврата матриц [R, P] для генерации обучающих наборов для алгоритма ML. Вчера у меня это работало без проблем. Сегодня утром запустил скрипт сверху, вернув идентичный набор тестов, который должен быть передан Octave через oct2py.

Меня возвращают:

 Oct2PyError: Octave evaluation error:
error: isnan: not defined for cell
error: called from:
corrcoef at line 152, column 5
CorrCoefScript at line 1, column 7
  

Во-первых, в наборе нет значений null / nan. На самом деле, там даже нет нулей. Ни в одном столбце нет единообразия, так что при вычислении corrcoef стандартное отклонение не возвращается. Это математически обосновано.

Во-вторых, когда я загружаю набор тестов в Octave через графический интерфейс и выполняю то же самое.m для одних и тех же данных ошибок не возвращается, а матрицы [R, P] идентичны сохраненным выводам со вчерашнего вечера. Я проверил, правильно ли передается matrix var в Octave через oct2py, и Octave получает идентичную матрицу. Однако oct2py больше не может выполнить ЛЮБОЙ файл .m с проверкой nan в исходном коде. Ошибка, приведенная выше, возвращается для любого скрипта Octave, упакованного в .m, который содержит .isnan в любой точке.

Для s amp; g я изменил свой файл .m, чтобы получить matrix var и записать его в плоский файл следующим образом:

 csvwrite ('filename', data);
  

Это также приводит к ошибке fprintf; если я запускаю тот же код для того же набора данных внутри графического интерфейса Octave, работает нормально.

Я в растерянности. Я обновил conda, oct2py и Octave с теми же результатами. Опять же, точный код с точными данными выполнялся так, как ожидалось, менее чем за 24 часа до этого.

Я использую приведенный ниже код в Jupyter Notebook для тестирования:

 %env OCTAVE_EXECUTABLE = F:OctaveOctave-5.1.0.0mingw32binoctave-cli-5.1.0.exe
import oct2py
from oct2py import octave

octave.addpath('F:\FinanceServer\Python\Secondary Docs\autotesting\atOctave_Scripts');
data = x
octave.push('data',data)
octave.eval('CorrCoefScript')
cmat = octave.pull('R')
enter code here
  

Примечание сбоку — у меня эта проблема возникает только внутри определенного скрипта .ipynb. По какой-то случайности, похоже, что никакие другие скрипты, использующие oct2py, не затронуты.

Комментарии:

1. Возможно, вы передаете список, а не массив Numpy.

2. (x) генерируется путем преобразования df в массив numpy с использованием подхода .values — как бы я проверил, приводит ли это к массиву в Octave, при этом oct2py находится за кулисами?

3. Примечание — когда я записываю (x) в csv из Python и загружаю csv в графический интерфейс Ocatve, это матрица с теми же размерами, что и объект Python (x)

4. В скрипте octave введите class(x) (или что там еще называется переменной). Это должно вывести double или cell или что-то подобное на терминал. Я предполагаю, что это массив ячеек, поскольку вызов isnan функции для него является причиной вашей ошибки. Массивы ячеек генерируются из наборов Python, списков и кортежей: blink1073.github.io/oct2py/source/conversions.html

5. Кстати: не только isnan эта ошибка будет генерироваться большинством числовых функций. Просто похоже, что все ваши функции сначала сталкиваются с isnan , но это случайное совпадение.

Ответ №1:

Исправлено, но это порождает больше вопросов, чем ответов. Я использовал список фреймов данных для зацикливания по типу, так что для каждой итерации i , x был сгенерирован через x = dflst[i] . По причинам, выходящим за рамки моего понимания, с течением времени произошел сбой. Однако, записывая мой цикл в пользовательскую функцию и явно вызывая каждый фрейм данных в этой функции следующим образом: oct_func(type1df) я вижу ожидаемое поведение и желаемый результат. Однако я все еще не могу использовать цикл для передачи фреймов данных oct_func() . Итак, это простое решение, которое соответствует моим целям, но, к сожалению, не может масштабироваться .

Редактировать: Цикл работает нормально, если выполняется итерация по dict фреймов данных вместо списка.