Этот отличный ответ очень хорошо объясняет, что происходит, и дает решение. Я хотел бы добавить другое решение, которое может быть подходящим в подобных случаях: с помощью метода query
:
result = result.query("(var > 0.25) or (var < -0.25)")
См. Также http: // pandas. pydata.org/pandas-docs/stable/indexing.html#indexing-query.
(Некоторые тесты с фреймворком данных, с которыми я сейчас работаю, показывают, что этот метод немного медленнее, чем используя побитовые операторы в рядах булевых: 2 мс против 870 мкс)
Предупреждение: по крайней мере, одна ситуация, когда это не просто, когда имена столбцов являются выражениями python. Я имел столбцы с именами WT_38hph_IP_2
, WT_38hph_input_2
и log2(WT_38hph_IP_2/WT_38hph_input_2)
и хотел выполнить следующий запрос: "(log2(WT_38hph_IP_2/WT_38hph_input_2) > 1) and (WT_38hph_IP_2 > 20)"
Я получил следующее исключение:
KeyError: 'log2'
UndefinedVariableError: name 'log2' is not defined
ValueError: "log2" is not a supported function
Я предполагаю, что это произошло потому, что анализатор запросов пытался что-то сделать с первого два столбца вместо того, чтобы идентифицировать выражение с именем третьего столбца.
Предлагается возможное обходное решение здесь .
Я не уверен, есть ли какой-нибудь простой способ сделать это, но вы можете попробовать запустить Mocha программно .
Вот немного грязная версия того, что это могло
data.js
var Promise = require('bluebird')
module.exports.tests = []
function getTests () {
return Promise.resolve('kitty pancake')
.delay(500)
.then(function (value) {
module.exports.tests = [
{
'arg': 'kitty',
'expect': value
},
{
'arg': 'doggy',
'expect': 'doggy pancake'
}
]
})
}
module.exports.getTests = getTests
test-launcher.js
var Mocha = require('mocha'),
fs = require('fs'),
path = require('path')
// First, you need to instantiate a Mocha instance.
var mocha = new Mocha()
// Then, you need to use the method "addFile" on the mocha
// object for each file.
// Here is an example:
fs.readdirSync('test').filter(function(file){
// Only keep the .js files
return file.substr(-3) === '.js'
}).forEach(function(file){
// Use the method "addFile" to add the file to mocha
mocha.addFile(
path.join('test', file)
)
})
// make sure your tests are loaded before running the tests
require('./data').getTests().then(function () {
// Now, you can run the tests.
mocha.run(function(failures){
process.on('exit', function () {
process.exit(failures)
})
})
})
test/index.js
var assert = require('assert')
var tests = require('../data').tests
var fn = function (value) {
return value + ' ' + 'pancake'
}
describe('test', function () {
describe('example', function () {
tests.forEach(function (test) {
it('should return ' + test.expect, function (){
var value = fn(test.arg)
assert.equal(value, test.expect)
})
})
})
})
Затем вы можете запустить ваши остатки, запустив test-launcher.js
.
Я бы переместил асинхронную логику в вызов it
. Привыкание с модульными тестами - это запах кода и, вероятно, просто раздражает других разработчиков, когда им нужно не только отлаживать и исправлять неудачные тесты, но и отлаживать и исправлять тесты, которые даже не определены и не выполняются, потому что у причудливого кода установки есть ошибки , Старайтесь не ходить туда.
var assert = require('assert')
var Promise = require('bluebird')
/* global describe, it*/
var fn = function(value) {
return value + ' ' + 'pancake'
}
function getTests() {
return Promise.resolve('kitty pancake')
.delay(500)
.then(function(value) {
return [
{
'arg': 'kitty',
'expect': value
},
{
'arg': 'doggy',
'expect': 'doggy pancake'
}
]
})
}
describe('example', function() {
it('should handle many things', function(done) {
getTests().then(function(tests) {
tests.forEach(function(test) {
var value = fn(test.arg)
assert.equal(value, test.expect, 'should return ' + test.expect)
})
done()
})
})
})
Я бы использовал async / await с опцией delay , как показано ниже:
setTimeout(async () => {
//get tests async
const tests = await getTests()
describe('example', async () => {
tests.forEach((test) => {
it(`test name: ${test.name} `, () => {
console.log(test.name)
})
})
})
run()
}, 1000)