Example #1
0
    def week_to_date_plot(self):
        """Dial plot displaying the weather downtime for the seven days leading up to but excluding `self.date`.

        The weather downtime is displayed as a percentage relative to the night length. In addition its absolute value
        is displayed in minutes.

        Returns:
        --------
        app.plot.plot.DialPlot
            Plot displaying the weather downtime for the last seven days.
        """

        weather_downtime = value_last_week(df=self.df,
                                           date=self.date,
                                           date_column='Date',
                                           value_column='TimeLostToProblems')
        night_length = value_last_week(df=self.df,
                                       date=self.date,
                                       date_column='Date',
                                       value_column='NightLength')
        weather_downtime_percentage = 100 * weather_downtime / night_length

        dial_color_func = good_mediocre_bad_color_func(good_limit=3,
                                                       bad_limit=6)

        return DialPlot(values=[weather_downtime_percentage],
                        label_values=[0, 3, 6] +
                        [v for v in range(10, 101, 10)],
                        dial_color_func=dial_color_func,
                        display_values=[
                            '{:.1f}%'.format(weather_downtime_percentage),
                            '{:d}m'.format(int(weather_downtime / 60))
                        ],
                        **self.kwargs)
    def last_night_plot(self):
        """Dial plot displaying the weather downtime for the date preceding `self.date`.

        The weather downtime is displayed as a percentage relative to the night length. In addition its absolute value
        is displayed in minutes.

        Returns:
        --------
        app.plot.plot.DialPlot
            Plot displaying the weather downtime for last night.
        """

        weather_downtime = value_last_night(df=self.df,
                                            date=self.date,
                                            date_column='Date',
                                            value_column='TimeLostToWeather')
        night_length = value_last_night(df=self.df,
                                        date=self.date,
                                        date_column='Date',
                                        value_column='NightLength')
        weather_downtime_percentage = 100 * weather_downtime / night_length

        dial_color_func = good_mediocre_bad_color_func(good_limit=40,
                                                       bad_limit=45)

        return DialPlot(values=[weather_downtime_percentage],
                        label_values=[v for v in range(0, 41, 10)] + [45] +
                        [v for v in range(50, 101, 10)],
                        dial_color_func=dial_color_func,
                        display_values=[
                            '{:.1f}%'.format(weather_downtime_percentage),
                            '{:d}m'.format(int(weather_downtime / 60))
                        ],
                        **self.kwargs)
    def week_to_date_plot(self):
        """Dial plot displaying the weather downtime for the seven days leading up to but excluding `self.date`.

        The weather downtime is displayed as a percentage relative to the night length. In addition its absolute value
        is displayed in minutes.

        Returns:
        --------
        app.plot.plot.DialPlot
            Plot displaying the weather downtime for the last seven days.
        """

        weather_downtime = value_last_week(df=self.df,
                                           date=self.date,
                                           date_column='Date',
                                           value_column='TimeLostToProblems')
        night_length = value_last_week(df=self.df, date=self.date, date_column='Date', value_column='NightLength')
        weather_downtime_percentage = 100 * weather_downtime / night_length

        dial_color_func = good_mediocre_bad_color_func(good_limit=3, bad_limit=6)

        return DialPlot(values=[weather_downtime_percentage],
                        label_values=[0, 3, 6] + [v for v in range(10, 101, 10)],
                        dial_color_func=dial_color_func,
                        display_values=['{:.1f}%'.format(weather_downtime_percentage),
                                        '{:d}m'.format(int(weather_downtime / 60))],
                        **self.kwargs)
    def week_to_date_plot(self):
        """Dial plot displaying the operation efficiency for the seven days leading up to but excluding `self.date`.

        Returns:
        --------
        app.plot.plot.DialPlot
            Plot displaying the operation efficiency for the last seven days.
        """

        obs_time = value_last_week(df=self.df,
                                   date=self.date,
                                   date_column='Date',
                                   value_column='ObsTime')
        science_time = value_last_week(df=self.df,
                                       date=self.date,
                                       date_column='Date',
                                       value_column='ScienceTime')
        operation_efficiency = self._observation_efficiency(
            obs_time, science_time)

        dial_color_func = good_mediocre_bad_color_func(bad_limit=80,
                                                       good_limit=90)

        return DialPlot(
            values=[operation_efficiency],
            label_values=range(0, 151, 10),
            dial_color_func=dial_color_func,
            display_values=['{:.1f}%'.format(operation_efficiency)],
            **self.kwargs)
    def week_to_date_plot(self):
        """Dial plot displaying the science time for the seven days leading up to but excluding `self.date`.

        The science time is displayed as a percentage relative to the night length. In addition its absolute value
        is displayed in minutes.

        Returns:
        --------
        app.plot.plot.DialPlot
            Plot displaying the science time for the last seven days.
        """

        science_time = value_last_week(df=self.df,
                                       date=self.date,
                                       date_column='Date',
                                       value_column='ScienceTime')
        night_length = value_last_week(df=self.df,
                                       date=self.date,
                                       date_column='Date',
                                       value_column='NightLength')
        science_time_percentage = 100 * science_time / night_length

        dial_color_func = good_mediocre_bad_color_func(good_limit=47,
                                                       bad_limit=37)

        return DialPlot(
            values=[science_time_percentage],
            label_values=[0, 10, 20, 30, 37, 47, 60, 70, 80, 90, 100],
            dial_color_func=dial_color_func,
            display_values=[
                '{:.1f}%'.format(science_time_percentage),
                '{:d}m'.format(int(science_time / 60))
            ],
            **self.kwargs)
    def last_night_plot(self):
        """Dial plot displaying the operation efficiency for last night, i.e. for the date preceding `self.date`.

        Returns:
        --------
        app.plot.plot.DialPlot
            Plot displaying the operation efficiency for last night.
        """

        obs_time = value_last_night(df=self.df,
                                    date=self.date,
                                    date_column='Date',
                                    value_column='ObsTime')
        science_time = value_last_night(df=self.df,
                                        date=self.date,
                                        date_column='Date',
                                        value_column='ScienceTime')
        operation_efficiency = self._observation_efficiency(
            obs_time, science_time)

        dial_color_func = good_mediocre_bad_color_func(bad_limit=80,
                                                       good_limit=90)

        return DialPlot(
            values=[operation_efficiency],
            label_values=range(0, 151, 10),
            dial_color_func=dial_color_func,
            display_values=['{:.1f}%'.format(operation_efficiency)],
            **self.kwargs)
    def semester_to_date_plot(self):
        """Dial plot displaying the operation efficiency for the semester in which `self.date` lies.

        All dates in the semester up to but excluding `self.date` are included when calculating the operation
        efficiency.

        Returns:
        --------
        app.plot.plot.DialPlot
            Plot of the operation efficiency for the semester to date.
        """

        sem = semester(self.date)
        binned_df = bin_by_semester(df=self.df, cutoff_date=self.date, date_column='Date', semester_column='Semester')
        current_semester = binned_df[binned_df.Semester == sem]
        if len(current_semester):
            operation_efficiency = self._observation_efficiency(current_semester.ObsTime[0],
                                                                current_semester.ScienceTime[0])
        else:
            operation_efficiency = 0

        dial_color_func = good_mediocre_bad_color_func(good_limit=90, bad_limit=80)

        required_operation_efficiency = required_for_semester_average(date=self.date,
                                                                      average=operation_efficiency,
                                                                      target_average=90)

        return DialPlot(values=[operation_efficiency, required_operation_efficiency],
                        label_values=range(0, 101, 10),
                        dial_color_func=dial_color_func,
                        display_values=['{:.1f}%'.format(operation_efficiency)],
                        **self.kwargs)
    def last_night_plot(self):
        """Dial plot displaying the engineering time for the date preceding `self.date`.

        The engineering time is displayed as a percentage relative to the night length. In addition its absolute value
        is displayed in minutes.

        Returns:
        --------
        app.plot.plot.DialPlot
            Plot displaying the engineering time for last night.
        """

        engineering_time = value_last_night(df=self.df,
                                            date=self.date,
                                            date_column='Date',
                                            value_column='EngineeringTime')
        night_length = value_last_night(df=self.df, date=self.date, date_column='Date', value_column='NightLength')
        engineering_time_percentage = 100 * engineering_time / night_length

        dial_color_func = good_mediocre_bad_color_func(good_limit=13, bad_limit=18)

        return DialPlot(values=[engineering_time_percentage],
                        label_values=[0, 5, 13, 18] + [v for v in range(30, 101, 10)],
                        dial_color_func=dial_color_func,
                        display_values=['{:.1f}%'.format(engineering_time_percentage),
                                        '{:d}m'.format(int(engineering_time / 60))],
                        **self.kwargs)
    def semester_to_date_plot(self):
        """Dial plot displaying the weather downtime for the semester in which `self.date` lies.

        All dates in the semester up to but excluding `self.date` are included when calculating the shutter open
        efficiency.

        The weather downtime is displayed as a percentage relative to the night length. A second hand shows the average
        percentage which must be achieved in the remaining time of the semester in order to achieve the target
        percentage.

        In addition its absolute value is displayed in hours.

        Returns:
        --------
        app.plot.plot.DialPlot
            Plot of the shutter open efficiency for the semester to date.
        """

        sem = semester(self.date)
        binned_df = bin_by_semester(df=self.df,
                                    cutoff_date=self.date,
                                    date_column='Date',
                                    semester_column='Semester')
        current_semester = binned_df[binned_df.Semester == sem]
        target_percentage = 55
        if len(current_semester):
            weather_downtime_percentage = 100 * current_semester.TimeLostToWeather[
                0] / current_semester.NightLength[0]
            required_percentage = required_for_semester_average(
                self.date, weather_downtime_percentage, target_percentage)
            weather_downtime = current_semester.TimeLostToWeather[0] / 3600
        else:
            weather_downtime_percentage = 0
            required_percentage = target_percentage
            weather_downtime = 0

        dial_color_func = good_mediocre_bad_color_func(good_limit=49,
                                                       bad_limit=40)

        return DialPlot(
            values=[weather_downtime_percentage, required_percentage],
            label_values=[v for v in range(0, 41, 10)] + [45] +
            [v for v in range(50, 101, 10)],
            dial_color_func=dial_color_func,
            display_values=[
                '{:.1f}%'.format(weather_downtime_percentage),
                '{:.1f}h'.format(weather_downtime)
            ],
            **self.kwargs)
    def semester_to_date_plot(self):
        """Dial plot displaying the telescope downtime for the semester in which `self.date` lies.

        All dates in the semester up to but excluding `self.date` are included when calculating the shutter open
        efficiency.

        The telescope downtime is displayed as a percentage relative to the night length. A second hand shows the
        average percentage which must be achieved in the remaining time of the semester in order to achieve the target
        percentage.

        In addition its absolute value is displayed in hours.

        Returns:
        --------
        app.plot.plot.DialPlot
            Plot of the shutter open efficiency for the semester to date.
        """

        sem = semester(self.date)
        binned_df = bin_by_semester(df=self.df, cutoff_date=self.date, date_column='Date', semester_column='Semester')
        current_semester = binned_df[binned_df.Semester == sem]
        target_percentage = 3
        if len(current_semester):
            telescope_downtime_percentage =\
                100 * current_semester.TimeLostToProblems[0] / current_semester.NightLength[0]
            required_percentage = required_for_semester_average(self.date,
                                                                telescope_downtime_percentage,
                                                                target_percentage)
            telescope_downtime = current_semester.TimeLostToProblems[0] / 3600
        else:
            telescope_downtime_percentage = 0
            required_percentage = target_percentage
            telescope_downtime = 0

        dial_color_func = good_mediocre_bad_color_func(good_limit=3, bad_limit=6)

        return DialPlot(values=[telescope_downtime_percentage, required_percentage],
                        label_values=range(0, 16, 1),
                        dial_color_func=dial_color_func,
                        display_values=['{:.1f}%'.format(telescope_downtime_percentage),
                                        '{:.1f}h'.format(telescope_downtime)],
                        **self.kwargs)
    def week_to_date_plot(self):
        """Dial plot displaying the operation efficiency for the seven days leading up to but excluding `self.date`.

        Returns:
        --------
        app.plot.plot.DialPlot
            Plot displaying the operation efficiency for the last seven days.
        """

        obs_time = value_last_week(df=self.df, date=self.date, date_column='Date', value_column='ObsTime')
        science_time = value_last_week(df=self.df, date=self.date, date_column='Date', value_column='ScienceTime')
        operation_efficiency = self._observation_efficiency(obs_time, science_time)

        dial_color_func = good_mediocre_bad_color_func(bad_limit=80, good_limit=90)

        return DialPlot(values=[operation_efficiency],
                        label_values=range(0, 151, 10),
                        dial_color_func=dial_color_func,
                        display_values=['{:.1f}%'.format(operation_efficiency)],
                        **self.kwargs)
    def last_night_plot(self):
        """Dial plot displaying the operation efficiency for last night, i.e. for the date preceding `self.date`.

        Returns:
        --------
        app.plot.plot.DialPlot
            Plot displaying the operation efficiency for last night.
        """

        obs_time = value_last_night(df=self.df, date=self.date, date_column='Date', value_column='ObsTime')
        science_time = value_last_night(df=self.df, date=self.date, date_column='Date', value_column='ScienceTime')
        operation_efficiency = self._observation_efficiency(obs_time, science_time)

        dial_color_func = good_mediocre_bad_color_func(bad_limit=80, good_limit=90)

        return DialPlot(values=[operation_efficiency],
                        label_values=range(0, 151, 10),
                        dial_color_func=dial_color_func,
                        display_values=['{:.1f}%'.format(operation_efficiency)],
                        **self.kwargs)
    def week_to_date_plot(self):
        """Dial plot displaying the science time for the seven days leading up to but excluding `self.date`.

        The science time is displayed as a percentage relative to the night length. In addition its absolute value
        is displayed in minutes.

        Returns:
        --------
        app.plot.plot.DialPlot
            Plot displaying the science time for the last seven days.
        """

        science_time = value_last_week(df=self.df, date=self.date, date_column='Date', value_column='ScienceTime')
        night_length = value_last_week(df=self.df, date=self.date, date_column='Date', value_column='NightLength')
        science_time_percentage = 100 * science_time / night_length

        dial_color_func = good_mediocre_bad_color_func(good_limit=47, bad_limit=37)

        return DialPlot(values=[science_time_percentage],
                        label_values=[0, 10, 20, 30, 37, 47, 60, 70, 80, 90, 100],
                        dial_color_func=dial_color_func,
                        display_values=['{:.1f}%'.format(science_time_percentage),
                                        '{:d}m'.format(int(science_time / 60))],
                        **self.kwargs)
    def semester_to_date_plot(self):
        """Dial plot displaying the operation efficiency for the semester in which `self.date` lies.

        All dates in the semester up to but excluding `self.date` are included when calculating the operation
        efficiency.

        Returns:
        --------
        app.plot.plot.DialPlot
            Plot of the operation efficiency for the semester to date.
        """

        sem = semester(self.date)
        binned_df = bin_by_semester(df=self.df,
                                    cutoff_date=self.date,
                                    date_column='Date',
                                    semester_column='Semester')
        current_semester = binned_df[binned_df.Semester == sem]
        if len(current_semester):
            operation_efficiency = self._observation_efficiency(
                current_semester.ObsTime[0], current_semester.ScienceTime[0])
        else:
            operation_efficiency = 0

        dial_color_func = good_mediocre_bad_color_func(good_limit=90,
                                                       bad_limit=80)

        required_operation_efficiency = required_for_semester_average(
            date=self.date, average=operation_efficiency, target_average=90)

        return DialPlot(
            values=[operation_efficiency, required_operation_efficiency],
            label_values=range(0, 101, 10),
            dial_color_func=dial_color_func,
            display_values=['{:.1f}%'.format(operation_efficiency)],
            **self.kwargs)