示例#1
0
    def testConstruction(self):
        """ Test event construction """

        start = tp_datetime(2004, 1, 1)
        end = tp_datetime(2004, 3, 21)

        event_id = 1
        event_type = "test"
        values = {"test": 2}

        event = S3TimePlotEvent(event_id, start=start, end=end)

        self.assertEqual(event.event_id, event_id)
        self.assertEqual(event.event_type, None)
        self.assertTrue(isinstance(event.values, dict))
        self.assertEqual(event["test"], None)

        event = S3TimePlotEvent(event_id, start=start, end=end, values=values)

        self.assertEqual(event.event_id, event_id)
        self.assertEqual(event.event_type, None)
        self.assertEqual(event.values, values)
        self.assertEqual(event["test"], 2)

        event = S3TimePlotEvent(event_id,
                                start=start,
                                end=end,
                                values=values,
                                event_type=event_type)

        self.assertEqual(event.event_id, event_id)
        self.assertEqual(event.event_type, event_type)
        self.assertEqual(event.values, values)
        self.assertEqual(event["test"], 2)
示例#2
0
文件: s3timeplot.py 项目: bmajz/eden
    def setUp(self):

        data = [
            # Always
            (1, None, None, {"test": 2}, "A"),
            # First two quarters
            (2, None, (2012,6,19), {"test": 5}, "A"),
            # Last three quarters
            (3, (2012,5,1), None, {"test": 8}, "A"),
            # First and Second Quarter
            (4, (2012,1,14), (2012,5,7), {"test": 3}, "A"),
            # Second and Third Quarter
            (5, (2012,5,1), (2012,7,21), {"test": 2}, "A"),
            # Third and Fourth Quarter
            (6, (2012,8,8), (2012,11,3), {"test": 1}, "A"),
            # Only Fourth Quarter
            (7, (2012,10,18), (2013,5,27), {"test": 9}, "A"),
            # Ended before Event Frame
            (8, (2011,1,1), (2011,12,6), {"test": 9}, "A"),
            # Starting after Event Frame
            (9, (2013,1,18), (2013,5,27), {"test": 3}, "A"),
        ]
        
        events = []
        for event_id, start, end, values, event_type in data:
            events.append(S3TimePlotEvent(event_id,
                                          start=tp_datetime(*start) if start else None,
                                          end=tp_datetime(*end) if end else None,
                                          values=values,
                                          event_type=event_type))
        self.events = events
示例#3
0
    def testExtend(self):
        """ Test correct grouping of events into intervals """

        # Create event frame and add events
        ef = S3TimePlotEventFrame(tp_datetime(2012, 1, 1),
                                  tp_datetime(2012, 12, 15),
                                  slots="3 months")
        ef.extend(self.events)

        # Expected result (start, end, previous, current, results)
        expected = [
            ((2012, 1, 1), (2012, 4, 1), [8], [1, 2, 4], (10, 5, 117)),
            ((2012, 4, 1), (2012, 7, 1), [8], [1, 2, 3, 4, 5], (20, 8, 150)),
            ((2012, 7, 1), (2012, 10, 1), [8, 2, 4], [1, 3, 5,
                                                      6], (13, 8, 176)),
            ((2012, 10, 1), (2012, 12, 15), [8, 2, 4, 5], [1, 3, 6,
                                                           7], (20, 9, 211)),
        ]

        # Check
        assertEqual = self.assertEqual
        for i, period in enumerate(ef):
            start, end, previous, current, expected_result = expected[i]

            # Check start/end date of period
            assertEqual(period.start, tp_datetime(*start))
            assertEqual(period.end, tp_datetime(*end))

            # Check current events in period
            event_ids = [
                event.event_id for event in period.current_events("A")
            ]
            assertEqual(set(event_ids), set(current))

            # Check previous events in period
            event_ids = [
                event.event_id for event in period.previous_events("A")
            ]
            assertEqual(set(event_ids), set(previous))

            # Check aggregation
            result = period.aggregate("sum", fields=["test"], event_type="A")
            assertEqual(result, expected_result[0])

            result = period.aggregate("max", fields=["test"], event_type="A")
            assertEqual(result, expected_result[1])

            result = period.aggregate("cumulate",
                                      fields=["test"],
                                      arguments=["months"],
                                      event_type="A")
            assertEqual(result, expected_result[2])
示例#4
0
    def testDtParseAbsolute(self):
        """ Test dtparse with absolute dates """

        assertTrue = self.assertTrue
        assertRaises = self.assertRaises
        assertEqual = self.assertEqual

        tp = S3TimePlot()

        result = tp.dtparse("5/2001")
        assertTrue(isinstance(result, datetime.datetime))
        assertEqual(result, tp_datetime(2001, 5, 1, 0, 0, 0))

        result = tp.dtparse("2007-03")
        assertTrue(isinstance(result, datetime.datetime))
        assertEqual(result, tp_datetime(2007, 3, 1, 0, 0, 0))

        result = tp.dtparse("1996")
        assertTrue(isinstance(result, datetime.datetime))
        assertEqual(result, tp_datetime(1996, 1, 1, 0, 0, 0))

        result = tp.dtparse("2008-02-12")
        assertTrue(isinstance(result, datetime.datetime))
        assertEqual(result, tp_datetime(2008, 2, 12, 0, 0, 0))

        result = tp.dtparse("2008-02-31")
        assertTrue(isinstance(result, datetime.datetime))
        assertEqual(result, tp_datetime(2008, 3, 2, 0, 0, 0))

        # Empty string defaults to now
        now = datetime.datetime.utcnow()
        result = tp.dtparse("")
        assertTrue(isinstance(result, datetime.datetime))
        assertEqual(result.year, now.year)
        assertEqual(result.month, now.month)
        assertEqual(result.day, now.day)
        assertEqual(result.hour, now.hour)
        assertEqual(result.minute, now.minute)

        # None defaults to now
        now = datetime.datetime.utcnow()
        result = tp.dtparse(None)
        assertTrue(isinstance(result, datetime.datetime))
        assertEqual(result.year, now.year)
        assertEqual(result.month, now.month)
        assertEqual(result.day, now.day)
        assertEqual(result.hour, now.hour)
        assertEqual(result.minute, now.minute)

        assertRaises(ValueError, tp.dtparse, "1985-13")
        assertRaises(ValueError, tp.dtparse, "68532")
        assertRaises(ValueError, tp.dtparse, "invalid")
示例#5
0
文件: s3timeplot.py 项目: bmajz/eden
    def testDtParseAbsolute(self):
        """ Test dtparse with absolute dates """

        assertTrue = self.assertTrue
        assertRaises = self.assertRaises
        assertEqual = self.assertEqual

        tp = S3TimePlot()

        result = tp.dtparse("5/2001")
        assertTrue(isinstance(result, datetime.datetime))
        assertEqual(result, tp_datetime(2001, 5, 1, 0, 0, 0))
        
        result = tp.dtparse("2007-03")
        assertTrue(isinstance(result, datetime.datetime))
        assertEqual(result, tp_datetime(2007, 3, 1, 0, 0, 0))
        
        result = tp.dtparse("1996")
        assertTrue(isinstance(result, datetime.datetime))
        assertEqual(result, tp_datetime(1996, 1, 1, 0, 0, 0))
        
        result = tp.dtparse("2008-02-12")
        assertTrue(isinstance(result, datetime.datetime))
        assertEqual(result, tp_datetime(2008, 2, 12, 0, 0, 0))
        
        result = tp.dtparse("2008-02-31")
        assertTrue(isinstance(result, datetime.datetime))
        assertEqual(result, tp_datetime(2008, 3, 2, 0, 0, 0))

        # Empty string defaults to now
        now = datetime.datetime.utcnow()
        result = tp.dtparse("")
        assertTrue(isinstance(result, datetime.datetime))
        assertEqual(result.year, now.year)
        assertEqual(result.month, now.month)
        assertEqual(result.day, now.day)
        assertEqual(result.hour, now.hour)
        assertEqual(result.minute, now.minute)

        # None defaults to now
        now = datetime.datetime.utcnow()
        result = tp.dtparse(None)
        assertTrue(isinstance(result, datetime.datetime))
        assertEqual(result.year, now.year)
        assertEqual(result.month, now.month)
        assertEqual(result.day, now.day)
        assertEqual(result.hour, now.hour)
        assertEqual(result.minute, now.minute)

        assertRaises(ValueError, tp.dtparse, "1985-13")
        assertRaises(ValueError, tp.dtparse, "68532")
        assertRaises(ValueError, tp.dtparse, "invalid")
示例#6
0
文件: s3timeplot.py 项目: bmajz/eden
    def testExtend(self):
        """ Test correct grouping of events into intervals """

        # Create event frame and add events
        ef = S3TimePlotEventFrame(tp_datetime(2012,1,1),
                                  tp_datetime(2012,12,15),
                                  slots="3 months")
        ef.extend(self.events)

        # Expected result (start, end, previous, current, results)
        expected = [
            ((2012, 1, 1), (2012, 4, 1), [8], [1, 2, 4], (10, 5, 117)),
            ((2012, 4, 1), (2012, 7, 1), [8], [1, 2, 3, 4, 5], (20, 8, 150)),
            ((2012, 7, 1), (2012, 10, 1), [8, 2, 4], [1, 3, 5, 6], (13, 8, 176)),
            ((2012, 10, 1), (2012, 12, 15), [8, 2, 4, 5], [1, 3, 6, 7], (20, 9, 211)),
        ]

        # Check
        assertEqual = self.assertEqual
        for i, period in enumerate(ef):
            start, end, previous, current, expected_result = expected[i]

            # Check start/end date of period
            assertEqual(period.start, tp_datetime(*start))
            assertEqual(period.end, tp_datetime(*end))

            # Check current events in period
            event_ids = [event.event_id for event in period.current_events("A")]
            assertEqual(set(event_ids), set(current))

            # Check previous events in period
            event_ids = [event.event_id for event in period.previous_events("A")]
            assertEqual(set(event_ids), set(previous))

            # Check aggregation
            result = period.aggregate("sum",
                                      fields=["test"],
                                      event_type="A")
            assertEqual(result, expected_result[0])
            
            result = period.aggregate("max",
                                      fields=["test"],
                                      event_type="A")
            assertEqual(result, expected_result[1])
            
            result = period.aggregate("cumulate",
                                      fields=["test"],
                                      arguments=["months"],
                                      event_type="A")
            assertEqual(result, expected_result[2])
示例#7
0
    def setUp(self):

        data = [
            # Always
            (1, None, None, {
                "test": 2
            }, "A"),
            # First two quarters
            (2, None, (2012, 6, 19), {
                "test": 5
            }, "A"),
            # Last three quarters
            (3, (2012, 5, 1), None, {
                "test": 8
            }, "A"),
            # First and Second Quarter
            (4, (2012, 1, 14), (2012, 5, 7), {
                "test": 3
            }, "A"),
            # Second and Third Quarter
            (5, (2012, 5, 1), (2012, 7, 21), {
                "test": 2
            }, "A"),
            # Third and Fourth Quarter
            (6, (2012, 8, 8), (2012, 11, 3), {
                "test": 1
            }, "A"),
            # Only Fourth Quarter
            (7, (2012, 10, 18), (2013, 5, 27), {
                "test": 9
            }, "A"),
            # Ended before Event Frame
            (8, (2011, 1, 1), (2011, 12, 6), {
                "test": 9
            }, "A"),
            # Starting after Event Frame
            (9, (2013, 1, 18), (2013, 5, 27), {
                "test": 3
            }, "A"),
        ]

        events = []
        for event_id, start, end, values, event_type in data:
            events.append(
                S3TimePlotEvent(event_id,
                                start=tp_datetime(*start) if start else None,
                                end=tp_datetime(*end) if end else None,
                                values=values,
                                event_type=event_type))
        self.events = events
示例#8
0
    def testAutomaticInterval(self):
        """ Test automatic determination of interval start and end """

        assertEqual = self.assertEqual
        assertTrue = self.assertTrue
        is_now = self.is_now

        s3db = current.s3db
        resource = s3db.resource("tp_test_events")

        event_start = resource.resolve_selector("event_start")
        event_end = resource.resolve_selector("event_end")

        tp = S3TimePlot()

        query = FS("event_type") == "STARTEND"
        tp.resource = s3db.resource("tp_test_events", filter=query)
        ef = tp.create_event_frame(tp.resource, event_start, event_end)
        # falls back to first start date
        assertEqual(ef.start, tp_datetime(2011, 1, 3, 0, 0, 0))
        assertTrue(is_now(ef.end))

        query = FS("event_type") == "NOSTART"
        tp.resource = s3db.resource("tp_test_events", filter=query)
        ef = tp.create_event_frame(tp.resource, event_start, event_end)
        # falls back to first end date minus 1 day
        assertEqual(ef.start, tp_datetime(2012, 2, 12, 0, 0, 0))
        assertTrue(is_now(ef.end))

        query = FS("event_type") == "NOEND"
        tp.resource = s3db.resource("tp_test_events", filter=query)
        ef = tp.create_event_frame(tp.resource, event_start, event_end)
        # falls back to first start date
        assertEqual(ef.start, tp_datetime(2012, 7, 21, 0, 0, 0))
        assertTrue(is_now(ef.end))

        tp.resource = s3db.resource("tp_test_events")
        ef = tp.create_event_frame(tp.resource, event_start, event_end)
        # falls back to first start date
        assertEqual(ef.start, tp_datetime(2011, 1, 3, 0, 0, 0))
        assertTrue(is_now(ef.end))
示例#9
0
文件: s3timeplot.py 项目: bmajz/eden
    def testAutomaticInterval(self):
        """ Test automatic determination of interval start and end """

        assertEqual = self.assertEqual
        assertTrue = self.assertTrue
        is_now = self.is_now

        s3db = current.s3db
        resource = s3db.resource("tp_test_events")
        
        event_start = resource.resolve_selector("event_start")
        event_end =  resource.resolve_selector("event_end")

        tp = S3TimePlot()

        query = FS("event_type") == "STARTEND"
        tp.resource = s3db.resource("tp_test_events", filter = query)
        ef = tp.create_event_frame(tp.resource, event_start, event_end)
        # falls back to first start date
        assertEqual(ef.start, tp_datetime(2011, 1, 3, 0, 0, 0))
        assertTrue(is_now(ef.end))

        query = FS("event_type") == "NOSTART"
        tp.resource = s3db.resource("tp_test_events", filter = query)
        ef = tp.create_event_frame(tp.resource, event_start, event_end)
        # falls back to first end date minus 1 day
        assertEqual(ef.start, tp_datetime(2012, 2, 12, 0, 0, 0))
        assertTrue(is_now(ef.end))

        query = FS("event_type") == "NOEND"
        tp.resource = s3db.resource("tp_test_events", filter = query)
        ef = tp.create_event_frame(tp.resource, event_start, event_end)
        # falls back to first start date
        assertEqual(ef.start, tp_datetime(2012, 7, 21, 0, 0, 0))
        assertTrue(is_now(ef.end))

        tp.resource = s3db.resource("tp_test_events")
        ef = tp.create_event_frame(tp.resource, event_start, event_end)
        # falls back to first start date
        assertEqual(ef.start, tp_datetime(2011, 1, 3, 0, 0, 0))
        assertTrue(is_now(ef.end))
示例#10
0
文件: s3timeplot.py 项目: bmajz/eden
    def testConstruction(self):
        """ Test event construction """

        start = tp_datetime(2004, 1, 1)
        end = tp_datetime(2004, 3, 21)

        event_id = 1
        event_type = "test"
        values = {"test": 2}

        event = S3TimePlotEvent(event_id,
                                start=start,
                                end=end)

        self.assertEqual(event.event_id, event_id)
        self.assertEqual(event.event_type, None)
        self.assertTrue(isinstance(event.values, dict))
        self.assertEqual(event["test"], None)

        event = S3TimePlotEvent(event_id,
                                start=start,
                                end=end,
                                values=values)

        self.assertEqual(event.event_id, event_id)
        self.assertEqual(event.event_type, None)
        self.assertEqual(event.values, values)
        self.assertEqual(event["test"], 2)

        event = S3TimePlotEvent(event_id,
                                start=start,
                                end=end,
                                values=values,
                                event_type=event_type)

        self.assertEqual(event.event_id, event_id)
        self.assertEqual(event.event_type, event_type)
        self.assertEqual(event.values, values)
        self.assertEqual(event["test"], 2)
示例#11
0
文件: s3timeplot.py 项目: bmajz/eden
    def testDuration(self):
        """ Test computation of event duration before the end of a period """

        events = (
            ((2013, 1, 1, 0, 0, 0), (2013, 1, 31, 0, 0, 0), 31),
            ((2013, 3, 1, 0, 0, 0), (2013, 4, 2, 0, 0, 0), 33),
            ((2013, 3, 8, 0, 0, 0), (2013, 8, 5, 0, 0, 0), 116),
            ((2013, 5, 1, 0, 0, 0), (2013, 9, 21, 0, 0, 0), 62),
            ((2013, 5, 1, 0, 0, 0), (2013, 5, 5, 0, 0, 0), 5),
            ((2013, 8, 5, 0, 0, 0), (2013, 9, 16, 0, 0, 0), 0),
        )
        period = self.period
        
        for index, event in enumerate(events):
            start, end, duration = event
            tp_event = S3TimePlotEvent(index,
                                       start=tp_datetime(*start),
                                       end=tp_datetime(*end),
                                       event_type="TEST")
            d = period._duration(tp_event, "days")
            self.assertEqual(d, duration,
                             msg="Incorrect result for "
                                 "duration of event %s." % (index + 1))
示例#12
0
    def testDuration(self):
        """ Test computation of event duration before the end of a period """

        events = (
            ((2013, 1, 1, 0, 0, 0), (2013, 1, 31, 0, 0, 0), 31),
            ((2013, 3, 1, 0, 0, 0), (2013, 4, 2, 0, 0, 0), 33),
            ((2013, 3, 8, 0, 0, 0), (2013, 8, 5, 0, 0, 0), 116),
            ((2013, 5, 1, 0, 0, 0), (2013, 9, 21, 0, 0, 0), 62),
            ((2013, 5, 1, 0, 0, 0), (2013, 5, 5, 0, 0, 0), 5),
            ((2013, 8, 5, 0, 0, 0), (2013, 9, 16, 0, 0, 0), 0),
        )
        period = self.period

        for index, event in enumerate(events):
            start, end, duration = event
            tp_event = S3TimePlotEvent(index,
                                       start=tp_datetime(*start),
                                       end=tp_datetime(*end),
                                       event_type="TEST")
            d = period._duration(tp_event, "days")
            self.assertEqual(d,
                             duration,
                             msg="Incorrect result for "
                             "duration of event %s." % (index + 1))
示例#13
0
文件: s3timeplot.py 项目: bmajz/eden
    def setUp(self):

        # Period
        start = tp_datetime(2013,4,1)
        end = tp_datetime(2013,7,1)
        period = S3TimePlotPeriod(start=start, end=end)

        # Add current events
        events = [
            (2, (2013,4,1), (2013,4,21), {"test3": 6.2, "test4": [31]}, "B"),
            (6, (2013,4,14), (2013,5,7), {"test3": 8.1, "test4": [37, 91]}, "B"),
            (8, (2013,1,12), (2013,9,19), None, "B"),
            (1, (2013,4,1), (2013,4,21), {"test1": 2, "test2": [13]}, "A"),
            (2, (2013,4,14), (2013,5,7), {"test1": 3, "test2": [17, 21]}, "A"),
            (3, (2013,4,21), (2013,6,3), {"test1": 1, "test2": [14, None, 11]}, "A"),
            (4, (2013,4,18), (2013,5,27), {"test1": 9}, "A"),
        ]
        for event_id, start, end, values, event_type in events:
            event = S3TimePlotEvent(event_id,
                                    start=tp_datetime(*start),
                                    end=tp_datetime(*end),
                                    values=values,
                                    event_type=event_type)
            period.add_current(event)

        # Add previous events
        events = [
            (1, (2012,4,1), (2012,4,21), {"test3": 1.7, "test4": [31]}, "B"),
            (5, (2012,4,14), (2012,5,7), {"test1": 4, "test2": [17, 21]}, "A"),
        ]
        for event_id, start, end, values, event_type in events:
            event = S3TimePlotEvent(event_id,
                                    start=tp_datetime(*start),
                                    end=tp_datetime(*end),
                                    values=values,
                                    event_type=event_type)
            period.add_previous(event)

        # Store period
        self.period = period
示例#14
0
文件: s3timeplot.py 项目: bmajz/eden
    def testPeriodsMonths(self):
        """ Test iteration over periods (months) """

        assertEqual = self.assertEqual

        ef = S3TimePlotEventFrame(tp_datetime(2011, 1, 5),
                                  tp_datetime(2011, 4, 28),
                                  slots="months")
        expected = [(tp_datetime(2011, 1, 5), tp_datetime(2011, 2, 5)),
                    (tp_datetime(2011, 2, 5), tp_datetime(2011, 3, 5)),
                    (tp_datetime(2011, 3, 5), tp_datetime(2011, 4, 5)),
                    (tp_datetime(2011, 4, 5), tp_datetime(2011, 4, 28))]
        for i, period in enumerate(ef):
            assertEqual(period.start, expected[i][0])
            assertEqual(period.end, expected[i][1])

        ef = S3TimePlotEventFrame(tp_datetime(2011, 1, 5),
                                  tp_datetime(2011, 8, 16),
                                  slots="3 months")
        expected = [(tp_datetime(2011, 1, 5), tp_datetime(2011, 4, 5)),
                    (tp_datetime(2011, 4, 5), tp_datetime(2011, 7, 5)),
                    (tp_datetime(2011, 7, 5), tp_datetime(2011, 8, 16))]
        for i, period in enumerate(ef):
            assertEqual(period.start, expected[i][0])
            assertEqual(period.end, expected[i][1])
示例#15
0
文件: s3timeplot.py 项目: bmajz/eden
    def testPeriodsWeeks(self):
        """ Test iteration over periods (weeks) """

        assertEqual = self.assertEqual

        ef = S3TimePlotEventFrame(tp_datetime(2011, 1, 5),
                                  tp_datetime(2011, 1, 28),
                                  slots="weeks")
        expected = [(tp_datetime(2011, 1, 5), tp_datetime(2011, 1, 12)),
                    (tp_datetime(2011, 1, 12), tp_datetime(2011, 1, 19)),
                    (tp_datetime(2011, 1, 19), tp_datetime(2011, 1, 26)),
                    (tp_datetime(2011, 1, 26), tp_datetime(2011, 1, 28))]
        for i, period in enumerate(ef):
            assertEqual(period.start, expected[i][0])
            assertEqual(period.end, expected[i][1])

        ef = S3TimePlotEventFrame(tp_datetime(2011, 1, 5),
                                  tp_datetime(2011, 2, 16),
                                  slots="2 weeks")
        expected = [(tp_datetime(2011, 1, 5), tp_datetime(2011, 1, 19)),
                    (tp_datetime(2011, 1, 19), tp_datetime(2011, 2, 2)),
                    (tp_datetime(2011, 2, 2), tp_datetime(2011, 2, 16))]
        for i, period in enumerate(ef):
            assertEqual(period.start, expected[i][0])
            assertEqual(period.end, expected[i][1])
示例#16
0
文件: s3timeplot.py 项目: bmajz/eden
    def testPeriodsDays(self):
        """ Test iteration over periods (days) """

        assertEqual = self.assertEqual
        
        ef = S3TimePlotEventFrame(tp_datetime(2011, 1, 5),
                                  tp_datetime(2011, 1, 8),
                                  slots="days")
        expected = [(tp_datetime(2011, 1, 5), tp_datetime(2011, 1, 6)),
                    (tp_datetime(2011, 1, 6), tp_datetime(2011, 1, 7)),
                    (tp_datetime(2011, 1, 7), tp_datetime(2011, 1, 8))]

        for i, period in enumerate(ef):
            assertEqual(period.start, expected[i][0])
            assertEqual(period.end, expected[i][1])

        ef = S3TimePlotEventFrame(tp_datetime(2011, 1, 5),
                                  tp_datetime(2011, 1, 16),
                                  slots="4 days")
        expected = [(tp_datetime(2011, 1, 5), tp_datetime(2011, 1, 9)),
                    (tp_datetime(2011, 1, 9), tp_datetime(2011, 1, 13)),
                    (tp_datetime(2011, 1, 13), tp_datetime(2011, 1, 16))]
        for i, period in enumerate(ef):
            assertEqual(period.start, expected[i][0])
            assertEqual(period.end, expected[i][1])
示例#17
0
    def testPeriodsDays(self):
        """ Test iteration over periods (days) """

        assertEqual = self.assertEqual

        ef = S3TimePlotEventFrame(tp_datetime(2011, 1, 5),
                                  tp_datetime(2011, 1, 8),
                                  slots="days")
        expected = [(tp_datetime(2011, 1, 5), tp_datetime(2011, 1, 6)),
                    (tp_datetime(2011, 1, 6), tp_datetime(2011, 1, 7)),
                    (tp_datetime(2011, 1, 7), tp_datetime(2011, 1, 8))]

        for i, period in enumerate(ef):
            assertEqual(period.start, expected[i][0])
            assertEqual(period.end, expected[i][1])

        ef = S3TimePlotEventFrame(tp_datetime(2011, 1, 5),
                                  tp_datetime(2011, 1, 16),
                                  slots="4 days")
        expected = [(tp_datetime(2011, 1, 5), tp_datetime(2011, 1, 9)),
                    (tp_datetime(2011, 1, 9), tp_datetime(2011, 1, 13)),
                    (tp_datetime(2011, 1, 13), tp_datetime(2011, 1, 16))]
        for i, period in enumerate(ef):
            assertEqual(period.start, expected[i][0])
            assertEqual(period.end, expected[i][1])
示例#18
0
    def testPeriodsWeeks(self):
        """ Test iteration over periods (weeks) """

        assertEqual = self.assertEqual

        ef = S3TimePlotEventFrame(tp_datetime(2011, 1, 5),
                                  tp_datetime(2011, 1, 28),
                                  slots="weeks")
        expected = [(tp_datetime(2011, 1, 5), tp_datetime(2011, 1, 12)),
                    (tp_datetime(2011, 1, 12), tp_datetime(2011, 1, 19)),
                    (tp_datetime(2011, 1, 19), tp_datetime(2011, 1, 26)),
                    (tp_datetime(2011, 1, 26), tp_datetime(2011, 1, 28))]
        for i, period in enumerate(ef):
            assertEqual(period.start, expected[i][0])
            assertEqual(period.end, expected[i][1])

        ef = S3TimePlotEventFrame(tp_datetime(2011, 1, 5),
                                  tp_datetime(2011, 2, 16),
                                  slots="2 weeks")
        expected = [(tp_datetime(2011, 1, 5), tp_datetime(2011, 1, 19)),
                    (tp_datetime(2011, 1, 19), tp_datetime(2011, 2, 2)),
                    (tp_datetime(2011, 2, 2), tp_datetime(2011, 2, 16))]
        for i, period in enumerate(ef):
            assertEqual(period.start, expected[i][0])
            assertEqual(period.end, expected[i][1])
示例#19
0
文件: s3timeplot.py 项目: bmajz/eden
    def testEventDataAggregation(self):
        """ Test aggregation of event data """
        
        s3db = current.s3db
        resource = s3db.resource("tp_test_events")

        tp = S3TimePlot()
        tp.resource = resource
        
        event_start = resource.resolve_selector("event_start")
        event_end =  resource.resolve_selector("event_end")
        fact1 = resource.resolve_selector("parameter1")
        fact2 = resource.resolve_selector("parameter2")
        
        end = "2013-01-01"
        ef = tp.create_event_frame(tp.resource, 
                                   event_start,
                                   event_end,
                                   end=end,
                                   slots="months")
        tp.add_event_data(ef, resource, event_start, event_end, [fact1, fact2])

        expected = [
            ((2011,1,3), (2011,2,3), 15),        # 00 P NS1 NS2 NS3 SE1
            ((2011,2,3), (2011,3,3), 15),        # 01 P NS1 NS2 NS3 SE1
            ((2011,3,3), (2011,4,3), 15),        # 02 P NS1 NS2 NS3 SE1
            ((2011,4,3), (2011,5,3), 18),        # 03 P NS1 NS2 NS3 SE1 SE2
            ((2011,5,3), (2011,6,3), 18),        # 04 P NS1 NS2 NS3 SE1 SE2
            ((2011,6,3), (2011,7,3), 15),        # 05 P NS1 NS2 NS3 SE2
            ((2011,7,3), (2011,8,3), 18),        # 06 P NS1 NS2 NS3 SE2 SE3
            ((2011,8,3), (2011,9,3), 18),        # 07 P NS1 NS2 NS3 SE2 SE3
            ((2011,9,3), (2011,10,3), 15),       # 08 P NS1 NS2 NS3 SE3
            ((2011,10,3), (2011,11,3), 15),      # 09 P NS1 NS2 NS3 SE3
            ((2011,11,3), (2011,12,3), 15),      # 10 P NS1 NS2 NS3 SE3
            ((2011,12,3), (2012,1,3), 12),       # 11 P NS1 NS2 NS3
            ((2012,1,3), (2012,2,3), 12),        # 12 P NS1 NS2 NS3
            ((2012,2,3), (2012,3,3), 12),        # 13 P NS1 NS2 NS3
            ((2012,3,3), (2012,4,3), 9),         # 14 P NS2 NS3
            ((2012,4,3), (2012,5,3), 9),         # 15 P NS2 NS3
            ((2012,5,3), (2012,6,3), 9),         # 16 P NS2 NS3
            ((2012,6,3), (2012,7,3), 6),         # 17 P NS3
            ((2012,7,3), (2012,8,3), 9),         # 18 P NS3 NE1
            ((2012,8,3), (2012,9,3), 9),         # 19 P NS3 NE1
            ((2012,9,3), (2012,10,3), 6),        # 20 P NE1
            ((2012,10,3), (2012,11,3), 9),       # 21 P NE1 NE2
            ((2012,11,3), (2012,12,3), 9),       # 22 P NE1 NE2
            ((2012,12,3), (2013,1,1), 9),        # 23 P NE1 NE2
        ]
        
        assertEqual = self.assertEqual

        assertEqual(ef.slots, "months")
        for i, period in enumerate(ef):
            expected_start, expected_end, expected_value = expected[i]
            expected_start = tp_datetime(*expected_start)
            expected_end = tp_datetime(*expected_end)

            assertEqual(period.start, expected_start,
                        msg="Period %s start should be %s, but is %s" %
                        (i, expected_start, period.start))
            assertEqual(period.end, expected_end,
                        msg="Period %s end should be %s, but is %s" %
                        (i, expected_end, period.end))
            value1 = period.aggregate(method="sum",
                                      fields=[fact1.colname],
                                      event_type=resource.tablename)
            assertEqual(value1, expected_value,
                        msg="Period %s sum should be %s, but is %s" %
                        (i, expected_value, value1))

            # Indirect count-check: average should be constant
            value2 = period.aggregate(method="avg",
                                      fields=[fact2.colname],
                                      event_type=resource.tablename)
            assertEqual(value2, 0.5)
示例#20
0
    def setUpClass(cls):

        db = current.db
        db.define_table(
            "tp_test_events",
            Field("event_start", "datetime"),
            Field("event_end", "datetime"),
            Field("parameter1", "integer"),
            Field("parameter2", "double"),
            Field("event_type"),
        )
        event_table = db["tp_test_events"]

        events = (
            (
                "STARTEND",
                (2011, 1, 3, 0, 0, 0),
                (2011, 5, 4, 0, 0, 0),
            ),
            (
                "STARTEND",
                (2011, 4, 6, 0, 0, 0),
                (2011, 8, 7, 0, 0, 0),
            ),
            (
                "STARTEND",
                (2011, 7, 9, 0, 0, 0),
                (2011, 11, 10, 0, 0, 0),
            ),
            (
                "NOSTART",
                None,
                (2012, 2, 13, 0, 0, 0),
            ),
            (
                "NOSTART",
                None,
                (2012, 5, 16, 0, 0, 0),
            ),
            (
                "NOSTART",
                None,
                (2012, 8, 19, 0, 0, 0),
            ),
            (
                "NOEND",
                (2012, 7, 21, 0, 0, 0),
                None,
            ),
            (
                "NOEND",
                (2012, 10, 24, 0, 0, 0),
                None,
            ),
            (
                "NOEND",
                (2013, 1, 27, 0, 0, 0),
                None,
            ),
            (
                "PERMANENT",
                None,
                None,
            ),
        )

        for event_type, start, end in events:
            event_start = tp_datetime(*start) if start else None
            event_end = tp_datetime(*end) if end else None
            record = {
                "event_type": event_type,
                "event_start": event_start,
                "event_end": event_end,
                "parameter1": 3,
                "parameter2": 0.5,
            }
            event_table.insert(**record)
示例#21
0
    def testPeriodsMonths(self):
        """ Test iteration over periods (months) """

        assertEqual = self.assertEqual

        ef = S3TimePlotEventFrame(tp_datetime(2011, 1, 5),
                                  tp_datetime(2011, 4, 28),
                                  slots="months")
        expected = [(tp_datetime(2011, 1, 5), tp_datetime(2011, 2, 5)),
                    (tp_datetime(2011, 2, 5), tp_datetime(2011, 3, 5)),
                    (tp_datetime(2011, 3, 5), tp_datetime(2011, 4, 5)),
                    (tp_datetime(2011, 4, 5), tp_datetime(2011, 4, 28))]
        for i, period in enumerate(ef):
            assertEqual(period.start, expected[i][0])
            assertEqual(period.end, expected[i][1])

        ef = S3TimePlotEventFrame(tp_datetime(2011, 1, 5),
                                  tp_datetime(2011, 8, 16),
                                  slots="3 months")
        expected = [(tp_datetime(2011, 1, 5), tp_datetime(2011, 4, 5)),
                    (tp_datetime(2011, 4, 5), tp_datetime(2011, 7, 5)),
                    (tp_datetime(2011, 7, 5), tp_datetime(2011, 8, 16))]
        for i, period in enumerate(ef):
            assertEqual(period.start, expected[i][0])
            assertEqual(period.end, expected[i][1])
示例#22
0
    def setUp(self):

        # Period
        start = tp_datetime(2013, 4, 1)
        end = tp_datetime(2013, 7, 1)
        period = S3TimePlotPeriod(start=start, end=end)

        # Add current events
        events = [
            (2, (2013, 4, 1), (2013, 4, 21), {
                "test3": 6.2,
                "test4": [31]
            }, "B"),
            (6, (2013, 4, 14), (2013, 5, 7), {
                "test3": 8.1,
                "test4": [37, 91]
            }, "B"),
            (8, (2013, 1, 12), (2013, 9, 19), None, "B"),
            (1, (2013, 4, 1), (2013, 4, 21), {
                "test1": 2,
                "test2": [13]
            }, "A"),
            (2, (2013, 4, 14), (2013, 5, 7), {
                "test1": 3,
                "test2": [17, 21]
            }, "A"),
            (3, (2013, 4, 21), (2013, 6, 3), {
                "test1": 1,
                "test2": [14, None, 11]
            }, "A"),
            (4, (2013, 4, 18), (2013, 5, 27), {
                "test1": 9
            }, "A"),
        ]
        for event_id, start, end, values, event_type in events:
            event = S3TimePlotEvent(event_id,
                                    start=tp_datetime(*start),
                                    end=tp_datetime(*end),
                                    values=values,
                                    event_type=event_type)
            period.add_current(event)

        # Add previous events
        events = [
            (1, (2012, 4, 1), (2012, 4, 21), {
                "test3": 1.7,
                "test4": [31]
            }, "B"),
            (5, (2012, 4, 14), (2012, 5, 7), {
                "test1": 4,
                "test2": [17, 21]
            }, "A"),
        ]
        for event_id, start, end, values, event_type in events:
            event = S3TimePlotEvent(event_id,
                                    start=tp_datetime(*start),
                                    end=tp_datetime(*end),
                                    values=values,
                                    event_type=event_type)
            period.add_previous(event)

        # Store period
        self.period = period
示例#23
0
文件: s3timeplot.py 项目: bmajz/eden
    def setUpClass(cls):

        db = current.db
        db.define_table("tp_test_events",
                        Field("event_start", "datetime"),
                        Field("event_end", "datetime"),
                        Field("parameter1", "integer"),
                        Field("parameter2", "double"),
                        Field("event_type"),
                        )
        event_table = db["tp_test_events"]

        events = (("STARTEND",
                   (2011, 1, 3, 0, 0, 0),
                   (2011, 5, 4, 0, 0, 0),
                   ),
                  ("STARTEND",
                   (2011, 4, 6, 0, 0, 0),
                   (2011, 8, 7, 0, 0, 0),
                   ),
                  ("STARTEND",
                   (2011, 7, 9, 0, 0, 0),
                   (2011, 11, 10, 0, 0, 0),
                   ),
                  ("NOSTART",
                   None,
                   (2012, 2, 13, 0, 0, 0),
                   ),
                  ("NOSTART",
                   None,
                   (2012, 5, 16, 0, 0, 0),
                   ),
                  ("NOSTART",
                   None,
                   (2012, 8, 19, 0, 0, 0),
                   ),
                  ("NOEND",
                   (2012, 7, 21, 0, 0, 0),
                   None,
                   ),
                  ("NOEND",
                   (2012, 10, 24, 0, 0, 0),
                   None,
                   ),
                  ("NOEND",
                   (2013, 1, 27, 0, 0, 0),
                   None,
                   ),
                  ("PERMANENT",
                   None,
                   None,
                   ),
        )
        
        for event_type, start, end in events:
            event_start = tp_datetime(*start) if start else None
            event_end = tp_datetime(*end) if end else None
            record = {
                "event_type": event_type,
                "event_start": event_start,
                "event_end": event_end,
                "parameter1": 3,
                "parameter2": 0.5,
            }
            event_table.insert(**record)
示例#24
0
    def testAutomaticSlotLength(self):
        """ Test automatic determination of reasonable aggregation time slot """

        assertEqual = self.assertEqual

        s3db = current.s3db
        resource = s3db.resource("tp_test_events")

        event_start = resource.resolve_selector("event_start")
        event_end = resource.resolve_selector("event_end")

        tp = S3TimePlot()

        end = "2011-03-01"
        query = FS("event_type") == "STARTEND"
        tp.resource = s3db.resource("tp_test_events", filter=query)
        ef = tp.create_event_frame(tp.resource,
                                   event_start,
                                   event_end,
                                   end=end)
        # falls back to first start date
        assertEqual(ef.start, tp_datetime(2011, 1, 3, 0, 0, 0))
        assertEqual(ef.end, tp_datetime(2011, 3, 1, 0, 0, 0))
        # ~8 weeks => reasonable intervall length: weeks
        assertEqual(ef.slots, "weeks")

        end = "2013-01-01"
        query = FS("event_type") == "NOSTART"
        tp.resource = s3db.resource("tp_test_events", filter=query)
        ef = tp.create_event_frame(tp.resource,
                                   event_start,
                                   event_end,
                                   end=end)
        # falls back to first end date minus 1 day
        assertEqual(ef.start, tp_datetime(2012, 2, 12, 0, 0, 0))
        assertEqual(ef.end, tp_datetime(2013, 1, 1, 0, 0))
        # ~11 months => reasonable intervall length: months
        assertEqual(ef.slots, "months")

        end = "2016-06-01"
        query = FS("event_type") == "NOEND"
        tp.resource = s3db.resource("tp_test_events", filter=query)
        ef = tp.create_event_frame(tp.resource,
                                   event_start,
                                   event_end,
                                   end=end)
        # falls back to first start date
        assertEqual(ef.start, tp_datetime(2012, 7, 21, 0, 0, 0))
        assertEqual(ef.end, tp_datetime(2016, 6, 1, 0, 0))
        # ~4 years => reasonable intervall length: 3 months
        assertEqual(ef.slots, "3 months")

        end = "2011-01-15"
        tp.resource = s3db.resource("tp_test_events")
        ef = tp.create_event_frame(tp.resource,
                                   event_start,
                                   event_end,
                                   end=end)
        # falls back to first start date
        assertEqual(ef.start, tp_datetime(2011, 1, 3, 0, 0, 0))
        assertEqual(ef.end, tp_datetime(2011, 1, 15, 0, 0))
        # ~12 days => reasonable intervall length: days
        assertEqual(ef.slots, "days")

        # Check with manual slot length
        end = "2016-06-01"
        query = FS("event_type") == "NOEND"
        tp.resource = s3db.resource("tp_test_events", filter=query)
        ef = tp.create_event_frame(tp.resource,
                                   event_start,
                                   event_end,
                                   end=end,
                                   slots="years")
        # falls back to first start date
        assertEqual(ef.start, tp_datetime(2012, 7, 21, 0, 0, 0))
        assertEqual(ef.end, tp_datetime(2016, 6, 1, 0, 0))
        assertEqual(ef.slots, "years")

        # Check with manual start date
        start = "2011-02-15"
        end = "2011-03-01"
        query = FS("event_type") == "STARTEND"
        tp.resource = s3db.resource("tp_test_events", filter=query)
        ef = tp.create_event_frame(tp.resource,
                                   event_start,
                                   event_end,
                                   start=start,
                                   end=end)
        # falls back to first start date
        assertEqual(ef.start, tp_datetime(2011, 2, 15, 0, 0, 0))
        assertEqual(ef.end, tp_datetime(2011, 3, 1, 0, 0, 0))
        # ~14 days => reasonable intervall length: days
        assertEqual(ef.slots, "days")
示例#25
0
文件: s3timeplot.py 项目: bmajz/eden
    def testAutomaticSlotLength(self):
        """ Test automatic determination of reasonable aggregation time slot """

        assertEqual = self.assertEqual
        
        s3db = current.s3db
        resource = s3db.resource("tp_test_events")

        event_start = resource.resolve_selector("event_start")
        event_end =  resource.resolve_selector("event_end")

        tp = S3TimePlot()

        end = "2011-03-01"
        query = FS("event_type") == "STARTEND"
        tp.resource = s3db.resource("tp_test_events", filter = query)
        ef = tp.create_event_frame(tp.resource, event_start, event_end, end=end)
        # falls back to first start date
        assertEqual(ef.start, tp_datetime(2011, 1, 3, 0, 0, 0))
        assertEqual(ef.end, tp_datetime(2011, 3, 1, 0, 0, 0))
        # ~8 weeks => reasonable intervall length: weeks
        assertEqual(ef.slots, "weeks")

        end = "2013-01-01"
        query = FS("event_type") == "NOSTART"
        tp.resource = s3db.resource("tp_test_events", filter = query)
        ef = tp.create_event_frame(tp.resource, event_start, event_end, end=end)
        # falls back to first end date minus 1 day
        assertEqual(ef.start, tp_datetime(2012, 2, 12, 0, 0, 0))
        assertEqual(ef.end, tp_datetime(2013, 1, 1, 0, 0))
        # ~11 months => reasonable intervall length: months
        assertEqual(ef.slots, "months")

        end = "2016-06-01"
        query = FS("event_type") == "NOEND"
        tp.resource = s3db.resource("tp_test_events", filter = query)
        ef = tp.create_event_frame(tp.resource, event_start, event_end, end=end)
        # falls back to first start date
        assertEqual(ef.start, tp_datetime(2012, 7, 21, 0, 0, 0))
        assertEqual(ef.end, tp_datetime(2016, 6, 1, 0, 0))
        # ~4 years => reasonable intervall length: 3 months
        assertEqual(ef.slots, "3 months")

        end = "2011-01-15"
        tp.resource = s3db.resource("tp_test_events")
        ef = tp.create_event_frame(tp.resource, event_start, event_end, end=end)
        # falls back to first start date
        assertEqual(ef.start, tp_datetime(2011, 1, 3, 0, 0, 0))
        assertEqual(ef.end, tp_datetime(2011, 1, 15, 0, 0))
        # ~12 days => reasonable intervall length: days
        assertEqual(ef.slots, "days")

        # Check with manual slot length
        end = "2016-06-01"
        query = FS("event_type") == "NOEND"
        tp.resource = s3db.resource("tp_test_events", filter = query)
        ef = tp.create_event_frame(tp.resource, event_start, event_end, end=end, slots="years")
        # falls back to first start date
        assertEqual(ef.start, tp_datetime(2012, 7, 21, 0, 0, 0))
        assertEqual(ef.end, tp_datetime(2016, 6, 1, 0, 0))
        assertEqual(ef.slots, "years")

        # Check with manual start date
        start = "2011-02-15"
        end = "2011-03-01"
        query = FS("event_type") == "STARTEND"
        tp.resource = s3db.resource("tp_test_events", filter = query)
        ef = tp.create_event_frame(tp.resource, event_start, event_end, start=start, end=end)
        # falls back to first start date
        assertEqual(ef.start, tp_datetime(2011, 2, 15, 0, 0, 0))
        assertEqual(ef.end, tp_datetime(2011, 3, 1, 0, 0, 0))
        # ~14 days => reasonable intervall length: days
        assertEqual(ef.slots, "days")
示例#26
0
    def testEventDataAggregation(self):
        """ Test aggregation of event data """

        s3db = current.s3db
        resource = s3db.resource("tp_test_events")

        tp = S3TimePlot()
        tp.resource = resource

        event_start = resource.resolve_selector("event_start")
        event_end = resource.resolve_selector("event_end")
        fact1 = resource.resolve_selector("parameter1")
        fact2 = resource.resolve_selector("parameter2")

        end = "2013-01-01"
        ef = tp.create_event_frame(tp.resource,
                                   event_start,
                                   event_end,
                                   end=end,
                                   slots="months")
        tp.add_event_data(ef, resource, event_start, event_end, [fact1, fact2])

        expected = [
            ((2011, 1, 3), (2011, 2, 3), 15),  # 00 P NS1 NS2 NS3 SE1
            ((2011, 2, 3), (2011, 3, 3), 15),  # 01 P NS1 NS2 NS3 SE1
            ((2011, 3, 3), (2011, 4, 3), 15),  # 02 P NS1 NS2 NS3 SE1
            ((2011, 4, 3), (2011, 5, 3), 18),  # 03 P NS1 NS2 NS3 SE1 SE2
            ((2011, 5, 3), (2011, 6, 3), 18),  # 04 P NS1 NS2 NS3 SE1 SE2
            ((2011, 6, 3), (2011, 7, 3), 15),  # 05 P NS1 NS2 NS3 SE2
            ((2011, 7, 3), (2011, 8, 3), 18),  # 06 P NS1 NS2 NS3 SE2 SE3
            ((2011, 8, 3), (2011, 9, 3), 18),  # 07 P NS1 NS2 NS3 SE2 SE3
            ((2011, 9, 3), (2011, 10, 3), 15),  # 08 P NS1 NS2 NS3 SE3
            ((2011, 10, 3), (2011, 11, 3), 15),  # 09 P NS1 NS2 NS3 SE3
            ((2011, 11, 3), (2011, 12, 3), 15),  # 10 P NS1 NS2 NS3 SE3
            ((2011, 12, 3), (2012, 1, 3), 12),  # 11 P NS1 NS2 NS3
            ((2012, 1, 3), (2012, 2, 3), 12),  # 12 P NS1 NS2 NS3
            ((2012, 2, 3), (2012, 3, 3), 12),  # 13 P NS1 NS2 NS3
            ((2012, 3, 3), (2012, 4, 3), 9),  # 14 P NS2 NS3
            ((2012, 4, 3), (2012, 5, 3), 9),  # 15 P NS2 NS3
            ((2012, 5, 3), (2012, 6, 3), 9),  # 16 P NS2 NS3
            ((2012, 6, 3), (2012, 7, 3), 6),  # 17 P NS3
            ((2012, 7, 3), (2012, 8, 3), 9),  # 18 P NS3 NE1
            ((2012, 8, 3), (2012, 9, 3), 9),  # 19 P NS3 NE1
            ((2012, 9, 3), (2012, 10, 3), 6),  # 20 P NE1
            ((2012, 10, 3), (2012, 11, 3), 9),  # 21 P NE1 NE2
            ((2012, 11, 3), (2012, 12, 3), 9),  # 22 P NE1 NE2
            ((2012, 12, 3), (2013, 1, 1), 9),  # 23 P NE1 NE2
        ]

        assertEqual = self.assertEqual

        assertEqual(ef.slots, "months")
        for i, period in enumerate(ef):
            expected_start, expected_end, expected_value = expected[i]
            expected_start = tp_datetime(*expected_start)
            expected_end = tp_datetime(*expected_end)

            assertEqual(period.start,
                        expected_start,
                        msg="Period %s start should be %s, but is %s" %
                        (i, expected_start, period.start))
            assertEqual(period.end,
                        expected_end,
                        msg="Period %s end should be %s, but is %s" %
                        (i, expected_end, period.end))
            value1 = period.aggregate(method="sum",
                                      fields=[fact1.colname],
                                      event_type=resource.tablename)
            assertEqual(value1,
                        expected_value,
                        msg="Period %s sum should be %s, but is %s" %
                        (i, expected_value, value1))

            # Indirect count-check: average should be constant
            value2 = period.aggregate(method="avg",
                                      fields=[fact2.colname],
                                      event_type=resource.tablename)
            assertEqual(value2, 0.5)
示例#27
0
文件: s3timeplot.py 项目: bmajz/eden
    def testEventDataCumulativeAggregation(self):
        """ Test aggregation of event data, cumulative """

        s3db = current.s3db
        resource = s3db.resource("tp_test_events")

        tp = S3TimePlot()
        tp.resource = resource

        event_start = resource.resolve_selector("event_start")
        event_end =  resource.resolve_selector("event_end")
        fact1 = resource.resolve_selector("parameter1")
        fact2 = resource.resolve_selector("parameter2")

        start = "2012-01-01"
        end = "2013-01-01"
        ef = tp.create_event_frame(tp.resource,
                                   event_start,
                                   event_end,
                                   start=start,
                                   end=end,
                                   slots="months")
        tp.add_event_data(ef,
                          resource,
                          event_start,
                          event_end,
                          [fact1, fact2],
                          cumulative=True,
                          )

        expected = [
            ((2012,1,1), (2012,2,1), 45, 12),       # 01 P NS1 NS2 NS3 (SE1 SE2 SE3)
            ((2012,2,1), (2012,3,1), 45, 12),       # 02 P NS1 NS2 NS3 (SE1 SE2 SE3)
            ((2012,3,1), (2012,4,1), 45, 9),        # 03 P NS2 NS3 (SE1 SE2 SE3)
            ((2012,4,1), (2012,5,1), 45, 9),        # 04 P NS2 NS3 (SE1 SE2 SE3)
            ((2012,5,1), (2012,6,1), 45, 9),        # 05 P NS2 NS3 (SE1 SE2 SE3)
            ((2012,6,1), (2012,7,1), 45, 6),        # 06 P NS3 (SE1 SE2 SE3)
            ((2012,7,1), (2012,8,1), 48, 9),        # 07 P NS3 (SE1 SE2 SE3) NE1
            ((2012,8,1), (2012,9,1), 51, 9),        # 08 P NS3 (SE1 SE2 SE3) NE1
            ((2012,9,1), (2012,10,1), 54, 6),       # 09 P (SE1 SE2 SE3) NE1
            ((2012,10,1), (2012,11,1), 60, 9),      # 10 P (SE1 SE2 SE3) NE1 NE2
            ((2012,11,1), (2012,12,1), 66, 9),      # 11 P (SE1 SE2 SE3) NE1 NE2
            ((2012,12,1), (2013,1,1), 72, 9),       # 12 P (SE1 SE2 SE3) NE1 NE2
        ]

        assertEqual = self.assertEqual

        assertEqual(ef.slots, "months")
        for i, period in enumerate(ef):
            expected_start, expected_end, expected_cumulative, expected_sum = expected[i]
            expected_start = tp_datetime(*expected_start)
            expected_end = tp_datetime(*expected_end)

            # Verify period start and end
            assertEqual(period.start, expected_start,
                        msg="Period %s start should be %s, but is %s" %
                        (i, expected_start, period.start))
            assertEqual(period.end, expected_end,
                        msg="Period %s end should be %s, but is %s" %
                        (i, expected_end, period.end))

            # Verify cumulative value
            value1 = period.aggregate(method="cumulate",
                                      fields=[fact1.colname],
                                      arguments=["months"],
                                      event_type=resource.tablename)
            assertEqual(value1, expected_cumulative,
                        msg="Period %s cumulative sum should be %s, but is %s" %
                        (i, expected_cumulative, value1))

            value1 = period.aggregate(method="sum",
                                      fields=[fact1.colname],
                                      event_type=resource.tablename)
            assertEqual(value1, expected_sum,
                        msg="Period %s sum should be %s, but is %s" %
                        (i, expected_sum, value1))
                        
            # Indirect count-check: average should be constant
            value2 = period.aggregate(method="avg",
                                      fields=[fact2.colname],
                                      event_type=resource.tablename)
            assertEqual(value2, 0.5)
示例#28
0
    def testEventDataCumulativeAggregation(self):
        """ Test aggregation of event data, cumulative """

        s3db = current.s3db
        resource = s3db.resource("tp_test_events")

        tp = S3TimePlot()
        tp.resource = resource

        event_start = resource.resolve_selector("event_start")
        event_end = resource.resolve_selector("event_end")
        fact1 = resource.resolve_selector("parameter1")
        fact2 = resource.resolve_selector("parameter2")

        start = "2012-01-01"
        end = "2013-01-01"
        ef = tp.create_event_frame(tp.resource,
                                   event_start,
                                   event_end,
                                   start=start,
                                   end=end,
                                   slots="months")
        tp.add_event_data(
            ef,
            resource,
            event_start,
            event_end,
            [fact1, fact2],
            cumulative=True,
        )

        expected = [
            ((2012, 1, 1), (2012, 2, 1), 45,
             12),  # 01 P NS1 NS2 NS3 (SE1 SE2 SE3)
            ((2012, 2, 1), (2012, 3, 1), 45,
             12),  # 02 P NS1 NS2 NS3 (SE1 SE2 SE3)
            ((2012, 3, 1), (2012, 4, 1), 45, 9),  # 03 P NS2 NS3 (SE1 SE2 SE3)
            ((2012, 4, 1), (2012, 5, 1), 45, 9),  # 04 P NS2 NS3 (SE1 SE2 SE3)
            ((2012, 5, 1), (2012, 6, 1), 45, 9),  # 05 P NS2 NS3 (SE1 SE2 SE3)
            ((2012, 6, 1), (2012, 7, 1), 45, 6),  # 06 P NS3 (SE1 SE2 SE3)
            ((2012, 7, 1), (2012, 8, 1), 48, 9),  # 07 P NS3 (SE1 SE2 SE3) NE1
            ((2012, 8, 1), (2012, 9, 1), 51, 9),  # 08 P NS3 (SE1 SE2 SE3) NE1
            ((2012, 9, 1), (2012, 10, 1), 54, 6),  # 09 P (SE1 SE2 SE3) NE1
            ((2012, 10, 1), (2012, 11, 1), 60,
             9),  # 10 P (SE1 SE2 SE3) NE1 NE2
            ((2012, 11, 1), (2012, 12, 1), 66,
             9),  # 11 P (SE1 SE2 SE3) NE1 NE2
            ((2012, 12, 1), (2013, 1, 1), 72, 9),  # 12 P (SE1 SE2 SE3) NE1 NE2
        ]

        assertEqual = self.assertEqual

        assertEqual(ef.slots, "months")
        for i, period in enumerate(ef):
            expected_start, expected_end, expected_cumulative, expected_sum = expected[
                i]
            expected_start = tp_datetime(*expected_start)
            expected_end = tp_datetime(*expected_end)

            # Verify period start and end
            assertEqual(period.start,
                        expected_start,
                        msg="Period %s start should be %s, but is %s" %
                        (i, expected_start, period.start))
            assertEqual(period.end,
                        expected_end,
                        msg="Period %s end should be %s, but is %s" %
                        (i, expected_end, period.end))

            # Verify cumulative value
            value1 = period.aggregate(method="cumulate",
                                      fields=[fact1.colname],
                                      arguments=["months"],
                                      event_type=resource.tablename)
            assertEqual(
                value1,
                expected_cumulative,
                msg="Period %s cumulative sum should be %s, but is %s" %
                (i, expected_cumulative, value1))

            value1 = period.aggregate(method="sum",
                                      fields=[fact1.colname],
                                      event_type=resource.tablename)
            assertEqual(value1,
                        expected_sum,
                        msg="Period %s sum should be %s, but is %s" %
                        (i, expected_sum, value1))

            # Indirect count-check: average should be constant
            value2 = period.aggregate(method="avg",
                                      fields=[fact2.colname],
                                      event_type=resource.tablename)
            assertEqual(value2, 0.5)