def test_analysis_with_empty_df(self):
        "Empty dataframes should not raise errors"

        anls = analysis.DailyAgg(df=pd.DataFrame(), agg='max')
        self.assertIsInstance(anls.result, pd.DataFrame)

        js = anls.to_json()
        self.assertIsInstance(pd.read_json(js), pd.DataFrame)
    def test_init_DailyAgg(self):
        "Initialize a DailyAgg, check attributes of result"
        index = pd.DatetimeIndex(start='20160101 00:51:15',
                                 freq='h',
                                 periods=80)
        df = pd.DataFrame(index=index, data=np.arange(0, 80, 1), columns=['A'])

        anls = analysis.DailyAgg(df, agg='min')
        self.assertTrue(hasattr(anls, 'result'))
    def test_json(self):
        "Verify the to_json method"
        index = pd.DatetimeIndex(start='20160101 00:51:15',
                                 freq='h',
                                 periods=80)
        df = pd.DataFrame(index=index,
                          data={
                              'A': np.arange(0, 80, 1),
                              'B': np.zeros(80)
                          })

        js = analysis.DailyAgg(df,
                               agg='min',
                               starttime=dt.time(hour=3, minute=34),
                               endtime=dt.time(hour=22, minute=55)).to_json()
        self.assertIsInstance(pd.read_json(js), pd.DataFrame)
    def test_DailyAgg_analysis(self):
        "Verify result of analyses"
        index = pd.DatetimeIndex(start='20160101 00:51:15',
                                 freq='h',
                                 periods=80)
        df = pd.DataFrame(index=index,
                          data={
                              'A': np.arange(0, 80, 1),
                              'B': np.zeros(80)
                          })

        anls = analysis.DailyAgg(df, agg='min')
        dayindex = pd.DatetimeIndex(start='20160101', freq='D', periods=4)
        self.assertTrue((anls.result.index == dayindex).all())
        self.assertTrue((anls.result['A'] == pd.Series(data=[0, 24, 48, 72],
                                                       index=dayindex)).all())
    def test_DailyAgg_analysis_with_timelimits(self):
        "Check results when limiting the hours for the analysis"
        index = pd.DatetimeIndex(start='20160101 00:51:15',
                                 freq='h',
                                 periods=80)
        df = pd.DataFrame(index=index,
                          data={
                              'A': np.arange(0, 80, 1),
                              'B': np.zeros(80)
                          })

        anls = analysis.DailyAgg(df,
                                 agg='min',
                                 starttime=dt.time(hour=3, minute=34),
                                 endtime=dt.time(hour=22, minute=55))
        dayindex = pd.DatetimeIndex(start='20160101', freq='D', periods=4)
        self.assertTrue((anls.result.index == dayindex).all())
        self.assertTrue((anls.result['A'] == pd.Series(data=[3, 27, 51, 75],
                                                       index=dayindex)).all())
    def test_run_analysis_twice_different_args(self):
        "Running an analysis twice should give same result"
        index = pd.DatetimeIndex(start='20160101 00:51:15',
                                 freq='h',
                                 periods=80)
        df = pd.DataFrame(index=index,
                          data={
                              'A': np.arange(0, 80, 1),
                              'B': np.zeros(80)
                          })

        anls = analysis.DailyAgg(df,
                                 agg='min',
                                 starttime=dt.time(hour=3, minute=34),
                                 endtime=dt.time(hour=22, minute=55))
        result1 = anls.result.copy()
        anls.do_analysis(agg='max',
                         starttime=dt.time(hour=3, minute=34),
                         endtime=dt.time(hour=22, minute=55))
        result2 = anls.result.copy()
        self.assertFalse((result1 == result2).all().all())