Example #1
0
 def get_live_report(cls, entities):
     base_directory = cls.get_entity_base_directory()
     report = {}
     live_headers = cls.live_csv_headers if cls.live_csv_headers else cls.csv_headers
     for index, header in enumerate(live_headers):
         report[header] = copy.deepcopy(cls.csv_default_values[index])
     times = []
     live_report_paths = []
     for entity in entities:
         entity_directory = os.path.join(base_directory, entity)
         reports_directory = os.path.join(entity_directory, "reports",
                                          cls.reports_folder)
         file_path = os.path.join(reports_directory, "live.csv")
         if not os.path.exists(file_path):
             continue
         live_report_paths.append(file_path)
         with open(file_path, "r") as live_file:
             lastest_entry = deque(csv.DictReader(live_file), 1)[0]
             times.append(
                 datetime.strptime(lastest_entry["Time"],
                                   "%Y-%m-%d %H:%M:%S"))
             for header in live_headers:
                 if lastest_entry[header][0].isdigit():
                     report[header] += int(
                         ast.literal_eval(lastest_entry[header]))
                 else:  # It's a list
                     entry = ast.literal_eval(lastest_entry[header])
                     if is_list_recursively_empty(report[header]):
                         report[header] = entry
                     else:
                         report[header] = [
                             a + b for a, b in zip(report[header], entry)
                         ]
     report["Time"] = ""
     report["Trend"] = 0
     if times:
         report["Time"] = str(min(times))
     trend_live_values = cls.get_trend_live_values(live_report_paths)
     if trend_live_values:
         report["Trend"] = cls.calculate_trend_value(trend_live_values)
     return report
 def get_hourly_report(cls, entities: List[str], report_date: date) -> Dict:
     base_directory = cls.get_entity_base_directory()
     hours = list(range(0, 24))
     results = {}
     for index, header in enumerate(cls.csv_headers):
         if cls.csv_default_values[index] == 0:
             results[header] = np.zeros(24)
         else:
             results[header] = []
     for entity in entities:
         entity_directory = os.path.join(base_directory, entity)
         reports_directory = os.path.join(entity_directory, "reports",
                                          cls.reports_folder)
         file_path = os.path.join(reports_directory,
                                  f"report_{report_date}.csv")
         if os.path.exists(file_path):
             df = pd.read_csv(file_path)
             for header in cls.csv_headers:
                 if is_numeric_dtype(df[header]):
                     results[header] += np.pad(
                         df[header].to_numpy(),
                         (0, 24 - df[header].to_numpy().size),
                         mode="constant")
                 else:  # It's a list
                     values = df[header].apply(ast.literal_eval).tolist()
                     entry = np.pad(values, (0, 24 - len(values)),
                                    mode="constant").tolist()
                     if is_list_recursively_empty(results[header]):
                         results[header] = entry
                     else:
                         results[header] = [[
                             c + d for c, d in zip(a, b)
                         ] for a, b in zip(results[header], entry)]
     for metric in results:
         results[metric] = list(results[metric])
     results["Hours"] = hours
     return results
Example #3
0
    def get_weekly_report(cls,
                          entities: List[str],
                          number_of_weeks: int = 0,
                          from_date: date = None,
                          to_date: date = None) -> Dict:
        # The In/Out metric cannot be fully aggregated using "sum"
        weekly_report_data = cls.generate_weekly_report_data(
            entities, number_of_weeks, from_date, to_date)
        report = {
            "Weeks": [],
            "InMax": [],
            "OutMax": [],
            "InAvg": [],
            "OutAvg": [],
        }
        for header in cls.csv_headers:
            report[header] = []
        for week, week_data in weekly_report_data.items():
            estimated_max_occ = max(
                week_data["EstimatedMaxOccupancy"]
            ) if week_data["EstimatedMaxOccupancy"] else 0
            estimated_avg_occ = round(
                mean(week_data["EstimatedAverageOccupancy"]),
                2) if week_data["EstimatedAverageOccupancy"] else 0
            estimated_latest_occ = round(
                week_data["EstimatedLatestOccupancy"]
                [-1]) if week_data["EstimatedLatestOccupancy"] else 0
            in_sum = sum(week_data["In"])
            out_sum = sum(week_data["Out"])
            in_max = max(week_data["In"]) if week_data["In"] else 0
            out_max = max(week_data["Out"]) if week_data["Out"] else 0
            in_avg = round(mean(week_data["In"]), 2) if week_data["In"] else 0
            out_avg = round(mean(week_data["Out"]),
                            2) if week_data["Out"] else 0
            report["Weeks"].append(week)
            report["In"].append(in_sum)
            report["Out"].append(out_sum)
            report["InMax"].append(in_max)
            report["OutMax"].append(out_max)
            report["InAvg"].append(in_avg)
            report["OutAvg"].append(out_avg)
            report["EstimatedMaxOccupancy"].append(estimated_max_occ)
            report["EstimatedAverageOccupancy"].append(estimated_avg_occ)
            report["EstimatedLatestOccupancy"].append(estimated_latest_occ)
            if is_list_recursively_empty(week_data["Summary"]):
                boundary_name = []
                weekly_in = []
                weekly_out = []
            else:
                boundary_names, weekly_in, weekly_out = list(
                    zip(*week_data["Summary"]))
                boundary_name = next(x for x in boundary_names
                                     if not is_list_recursively_empty(x))
                weekly_in = _fill_partially_empty_result(weekly_in, 0)
                weekly_out = _fill_partially_empty_result(weekly_out, 0)

            report["Summary"].append([
                boundary_name, [sum(x) for x in zip(*weekly_in)],
                [sum(x) for x in zip(*weekly_out)]
            ])
        return report