Source code for feets.tests.test_extractors
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# The MIT License (MIT)
# Copyright (c) 2017 Juan Cabral
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
# =============================================================================
# FUTURE
# =============================================================================
from __future__ import unicode_literals
# =============================================================================
# DOC
# =============================================================================
__doc__ = """Extractors Tests"""
# =============================================================================
# IMPORTS
# =============================================================================
import unittest
import numpy as np
import mock
from .. import Extractor, register_extractor, extractors
from .core import FeetsTestCase
# =============================================================================
# BASE CLASS
# =============================================================================
[docs]class SortByFependenciesTest(FeetsTestCase):
[docs] @mock.patch("feets.extractors._extractors", {})
def test_sort_by_dependencies(self):
@register_extractor
class A(Extractor):
data = ["magnitude"]
features = ["test_a"]
def fit(self, *args):
pass
@register_extractor
class B1(Extractor):
data = ["magnitude"]
features = ["test_b1"]
dependencies = ["test_a"]
def fit(self, *args):
pass
@register_extractor
class B2(Extractor):
data = ["magnitude"]
features = ["test_b2"]
dependencies = ["test_a"]
def fit(self, *args):
pass
@register_extractor
class C(Extractor):
data = ["magnitude"]
features = ["test_c"]
dependencies = ["test_b1", "test_b2", "test_a"]
def fit(self, *args):
pass
a, b1, b2, c = A(), B1(), B2(), C()
exts = [c, b1, a, b2]
plan = extractors.sort_by_dependencies(exts)
for idx, ext in enumerate(plan):
if idx == 0:
self.assertIs(ext, a)
elif idx in (1, 2):
self.assertIn(ext, (b1, b2))
elif idx == 3:
self.assertIs(ext, c)
else:
self.fail("to many extractors in plan: {}".format(idx))
[docs]class FATSExtractorsTestCases(FeetsTestCase):
[docs] def test_FATS_doc_Amplitude(self):
ext = extractors.Amplitude()
value = ext.fit(np.arange(0, 1001))["Amplitude"]
self.assertEquals(value, 475)
[docs] @unittest.skip("FATS say must be 0.2, but actual is -0.60")
def test_FATS_doc_AndersonDarling(self):
ext = extractors.AndersonDarling()
values = np.empty(1000)
for idx in range(values.size):
mags = self.random.normal(size=1000)
values[idx] = ext.fit(mags)["AndersonDarling"]
self.assertAllClose(values.mean(), 0.25)
[docs] def test_FATS_doc_Beyond1Std(self):
ext = extractors.Beyond1Std()
values = np.empty(1000)
for idx in range(values.size):
mags = self.random.normal(size=1000)
errors = self.random.normal(scale=0.001, size=1000)
values[idx] = ext.fit(mags, errors)["Beyond1Std"]
self.assertAllClose(values.mean(), 0.32972600000000002)
[docs] def test_FATS_doc_Con(self):
ext = extractors.Con()
values = np.empty(1000)
for idx in range(values.size):
mags = self.random.normal(size=1000)
values[idx] = ext.fit(mags, consecutiveStar=1)["Con"]
self.assertAllClose(values.mean(), 0.045557)
[docs] def test_FATS_doc_MeanVariance(self):
ext = extractors.MeanVariance()
values = np.empty(1000)
for idx in range(values.size):
mags = self.random.uniform(size=1000)
values[idx] = ext.fit(magnitude=mags)['Meanvariance']
self.assertAllClose(values.mean(), 0.57664232208148747)
[docs] def test_FATS_doc_MedianAbsDev(self):
ext = extractors.MedianAbsDev()
values = np.empty(1000)
for idx in range(values.size):
mags = self.random.normal(size=1000)
values[idx] = ext.fit(magnitude=mags)['MedianAbsDev']
self.assertAllClose(values.mean(), 0.67490807679242459)
[docs] def test_FATS_doc_RCS(self):
ext = extractors.RCS()
values = np.empty(1000)
for idx in range(values.size):
mags = self.random.uniform(size=1000)
values[idx] = ext.fit(magnitude=mags)['Rcs']
self.assertAllClose(values.mean(), 0.03902862976795655)
[docs] def test_FATS_doc_Skew(self):
ext = extractors.Skew()
values = np.empty(1000)
for idx in range(values.size):
mags = self.random.normal(size=1000)
values[idx] = ext.fit(magnitude=mags)['Skew']
self.assertAllClose(values.mean(), -0.0017170680368871292)
[docs] def test_FATS_doc_SmallKurtosis(self):
ext = extractors.SmallKurtosis()
values = np.empty(1000)
for idx in range(values.size):
mags = self.random.normal(size=1000)
values[idx] = ext.fit(magnitude=mags)['SmallKurtosis']
self.assertAllClose(values.mean(), 0.00040502517673364258)
[docs] def test_FATS_doc_Std(self):
ext = extractors.Std()
values = np.empty(1000)
for idx in range(values.size):
mags = self.random.normal(size=1000)
values[idx] = ext.fit(magnitude=mags)['Std']
self.assertAllClose(values.mean(), 0.9994202277548033)
[docs] @unittest.skip("FATS say must be 0, but actual is -0.41")
def test_FATS_doc_StetsonJ(self):
ext = extractors.StetsonJ()
values = np.empty(1000)
for idx in range(values.size):
mags = self.random.normal(size=1000)
mags2 = mags * self.random.uniform(0, 1.5, mags.size)
errors = self.random.normal(scale=0.001, size=1000)
errors2 = self.random.normal(scale=0.001, size=1000)
values[idx] = ext.fit(
aligned_magnitude=mags, aligned_magnitude2=mags2,
aligned_error=errors, aligned_error2=errors2)['StetsonJ']
self.assertAllClose(values.mean(), 0)
[docs] @unittest.skip("FATS say must be 2/pi, but actual is -0.20")
def test_FATS_doc_StetsonK(self):
ext = extractors.StetsonK()
values = np.empty(1000)
for idx in range(values.size):
mags = self.random.normal(size=1000)
errors = self.random.normal(scale=0.001, size=1000)
values[idx] = ext.fit(magnitude=mags, error=errors)['StetsonK']
self.assertAllClose(values.mean(), 0.798)
[docs] def test_FATS_doc_StetsonL(self):
ext = extractors.StetsonL()
values = np.empty(1000)
for idx in range(values.size):
mags = self.random.normal(size=1000)
mags2 = mags * self.random.uniform(0, 1.5, mags.size)
errors = self.random.normal(scale=0.001, size=1000)
errors2 = self.random.normal(scale=0.001, size=1000)
values[idx] = ext.fit(
aligned_magnitude=mags, aligned_magnitude2=mags2,
aligned_error=errors, aligned_error2=errors2)['StetsonL']
self.assertAllClose(values.mean(), -0.0470713296883)
[docs]class feetsExtractorsTestCases(FeetsTestCase):
[docs] def test_feets_dmdt(self):
ext = extractors.DeltamDeltat()
params = ext.get_default_params()
time = np.arange(0, 1000)
values = np.empty(50)
for idx in range(values.size):
mags = self.random.normal(size=1000)
feats = ext.fit(magnitude=mags, time=time, **params)
values[idx] = np.sum(list(feats.values()))
self.assertAllClose(values.mean(), 424.56)
[docs] def test_flatten_dmdt(self):
ext = extractors.DeltamDeltat()
params = ext.get_default_params()
dmbins = len(params["dm_bins"]) - 1
dtbins = len(params["dt_bins"]) - 1
mags = self.random.normal(size=100)
time = np.arange(0, 100)
lc_len = len(time)
n_vals = int(0.5 * lc_len * (lc_len - 1))
sign = 5000.*self.random.rand(dtbins, dmbins)
expected = np.fix(255. * sign/n_vals + 0.999).astype(int)
with mock.patch("numpy.histogram2d", return_value=[sign]):
results = ext.fit(magnitude=mags, time=time, **params)
flattened = np.zeros_like(expected) - 1
for name, value in results.items():
it = int(name.split('_')[2])
im = int(name.split('_')[-1])
flattened[it][im] = value
# .T.reshape(23, 24))
np.testing.assert_array_equal(expected, flattened)