#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.html5. Кстати: не только
isnan
эта ошибка будет генерироваться большинством числовых функций. Просто похоже, что все ваши функции сначала сталкиваются сisnan
, но это случайное совпадение.
Ответ №1:
Исправлено, но это порождает больше вопросов, чем ответов. Я использовал список фреймов данных для зацикливания по типу, так что для каждой итерации i
, x
был сгенерирован через x = dflst[i]
. По причинам, выходящим за рамки моего понимания, с течением времени произошел сбой. Однако, записывая мой цикл в пользовательскую функцию и явно вызывая каждый фрейм данных в этой функции следующим образом: oct_func(type1df)
я вижу ожидаемое поведение и желаемый результат. Однако я все еще не могу использовать цикл для передачи фреймов данных oct_func()
. Итак, это простое решение, которое соответствует моим целям, но, к сожалению, не может масштабироваться .
Редактировать: Цикл работает нормально, если выполняется итерация по dict фреймов данных вместо списка.