dynamic_time_warping_test.py 3.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
import unittest
import geopandas as gpd
from context import measprocess as mpc
import pandas as pd
import numpy as np

from shapely.geometry import LineString, Point

class TestDTW(unittest.TestCase):
    def setUp(self):
        '''
        Note, that the Dummy Example does not use coordinates but x, y positions
        Still we transform it here to be consistent with the default use-case
        '''

        #Prepare Reference Path
        rp = pd.read_csv("tests/example_files/dtw_example/reference_path.csv", index_col=0)
        rp = gpd.GeoSeries(
            gpd.points_from_xy(rp.x_m, rp.y_m)
        ).set_crs("EPSG:31287").to_crs("EPSG:4326")
        self._rp = rp.drop(columns=["x_m, y_m"])

        #Prepare Measurements
        measurement_files = (
            pd.read_csv(f"tests/example_files/dtw_example/measurement_{i}.csv", index_col=0)
            for i in range(3)
        )
        self._measurements = [
            gpd.GeoDataFrame(
                meas,
                geometry=gpd.points_from_xy(meas.x_m, meas.y_m)
            ).set_crs("EPSG:31287").to_crs("EPSG:4326").drop(columns=["x_m", "y_m"]) for meas in measurement_files
        ]

    def test_epsg_exception(self):
        rp = self._rp
        rp.crs = None

        measurements = self._measurements
        for meas in measurements:
            meas.crs = None

        with self.assertRaises(ValueError) as context:
            mpc.dtw.warp_geodataframe(
                rp, measurements
            )

    def test_original_index(self):
        #Check the no measurement was lost
        measurement = self._measurements[0]
        warped_measurement = mpc.dtw.warp_geodataframe(
            self._rp, [measurement],
            resampling_distance=1
        )[0]

        self.assertTrue(
            all(i in warped_measurement.original_index for i in measurement.index)
        )

    def test_basic_example_resampling(self):
        measurement_list = mpc.dtw.warp_geodataframe(
            self._rp, self._measurements,
            resampling_distance=1
        )

        self.assertTrue(
            ((measurement_list[0].geometry == measurement_list[1].geometry) & (measurement_list[1].geometry == measurement_list[2].geometry)).all()
        )

    def test_basic_example(self):
        measurement_list = mpc.dtw.warp_geodataframe(
            self._rp, self._measurements,
            resampling_distance=None
        )

        self.assertTrue(
            ((measurement_list[0].geometry == measurement_list[1].geometry) & (measurement_list[1].geometry == measurement_list[2].geometry)).all()
        )

    def test_linestring_input(self):
        rp = gpd.GeoSeries(LineString(self._rp)).set_crs("EPSG:4326")

        measurement_list = mpc.dtw.warp_geodataframe(
            rp, self._measurements,
            resampling_distance=1
        )

        self.assertTrue(
            ((measurement_list[0].geometry == measurement_list[1].geometry) & (measurement_list[1].geometry == measurement_list[2].geometry)).all()
        )

    def test_linestring_input_warning(self):
        rp = gpd.GeoSeries(LineString(self._rp)).set_crs("EPSG:4326")

        measurement_list = mpc.dtw.warp_geodataframe(
            rp, self._measurements,
            resampling_distance=1
        )

        self.assertTrue(
            ((measurement_list[0].geometry == measurement_list[1].geometry) & (measurement_list[1].geometry == measurement_list[2].geometry)).all()
        )

    def test_index_warning(self):
        rp = gpd.GeoSeries(LineString(self._rp)).set_crs("EPSG:4326")

        with self.assertRaises(IndexError) as context:
            measurement_list = mpc.dtw.warp_geodataframe(
                rp, self._measurements,
                resampling_distance=5
            )