Esempio n. 1
0
 def test_csv_file_to_data(self):
     try:
         data_return_path = RESOURCES_DIR + "/" + 'temp2.csv'
         initial_data_path = RESOURCES_DIR + "/" + 'temp.csv'
         test_csv_write3 = CsvWriter(self.host, self.port, self.username, self.password, self.database)
         test_csv_write3.csv_file_to_db()
         test_csv_write3.data_to_csv_file('select * from per15min', new_csv_file_name=data_return_path, fillGaps=False)
         self.assertTrue(self.compare_csv_files(data_return_path, initial_data_path),
                         "Integration test failed, file is not the same")
         os.remove(data_return_path)
     except ConnectionError as error:
         print("Test: Failed - {0}\n".format(error))
class Generator:
    def __init__(self, config_object=None):
        if isinstance(config_object, GeneratorConfig):
            self._Config = config_object
        else:
            self._Config = GeneratorConfig()
        self._Columns = 'avg_hrcrx_max_byt'
        self._data_writer = CsvWriter(host=db_config.host,
                                      port=db_config.port,
                                      username=db_config.username,
                                      password=db_config.password,
                                      database=self._Config.Database)
        self.Dist_Array = self._Config.Func_Type.generate()

    def nparray_to_dataframe(self):
        indexes = pd.DataFrame(self.Dist_Array[:, 0])
        indexes[0] = pd.to_datetime(indexes[0], format='%Y-%m-%d %H:%M:%S')
        cols = [self._Columns]
        df = pd.DataFrame(data=self.Dist_Array[0:, 1:],
                          index=indexes[0],
                          columns=cols)
        return df

    def write_data_to_csv(self):
        df = self.nparray_to_dataframe()
        model_name = self._Config.Func_Type.Name
        if not isinstance(df, pd.DataFrame):
            print("Error reading the data from database.")
        df.to_csv(path.join(RESOURCES_DIR, model_name + "_generated.csv"))

    def write_data_to_database(self):
        df = self.nparray_to_dataframe()
        model_name = self._Config.Func_Type.Name
        df.to_csv(path.join(RESOURCES_DIR, model_name + "_generated.csv"))
        self._data_writer.csv_file_to_db(
            measurement_to_use=model_name + '_generated',
            new_csv_file_name=path.join(RESOURCES_DIR,
                                        model_name + "_generated.csv"))
        remove(path.join(RESOURCES_DIR, model_name + "_generated.csv"))
class TrafficPredictor:
    _default_stride = None
    _num_of_series = None
    _selected_model = None
    _data_writer = None

    def __init__(self, database="predicted_data"):
        self._default_stride = Stride.WEEKLY
        self._num_of_series = 8
        self._selected_model = None
        self._data_writer = CsvWriter(host=db_config.host,
                                      port=db_config.port,
                                      username=db_config.username,
                                      password=db_config.password,
                                      database=database)

    def main(self):
        print("Welcome to the Traffic Predictor!")
        print("Please choose your model (enter its index):")
        for model in models:
            x = models.index(model)
            print("{0}: {1}".format(x, model))
        print("-: Exit")

        selection = input("Prompt: ")

        if selection == '-':
            return
        else:
            try:
                model = models[int(selection)]
                print("Please, wait...")
                np = self.call_model(model)
                df = self.nparray_to_dataframe(np)
                print("Finished prediction")
                print(
                    "Would you like to run Error analysis on the predicted data? [y]/[n]"
                )
                selection = input("Prompt: ")
                if selection.lower() == 'y':
                    err_analysis = ErrorAnalysis(np)
                    err_analysis.compute_error()
                print(
                    "Would you like to write predicted data to database? [y]/[n]"
                    "\nIf selected [n] the data will be written to local csv file"
                )
                selection = input("Prompt: ")
                if selection.lower() == 'y':
                    self.write_data_to_database(model, df)
                else:
                    self.write_data_to_csv(model, df)

            except IndexError:
                print("There's no model under index: {}".format(selection))
            except TypeError:
                print(
                    "ERROR: The model import failed. Please make sure to properly add/choose your model."
                )
                raise TypeError

    def call_model(self, model_name):
        model_root = 'PModules.' + model_name + "." + model_name + "." + model_name
        model = locate(model_root)
        self._selected_model = model()
        # Your model class instance
        self._selected_model.set_parameters()
        result = self._selected_model.call_model()

        return result

    def write_data_to_csv(self, model_name, df):
        if not isinstance(df, pd.DataFrame):
            print(
                "Error reading the data from database. Please test this query in Chronograf/Grafana."
            )
        df.to_csv(path.join(RESOURCES_DIR, model_name + "_predicted.csv"))

    def write_data_to_database(self, model_name, df):
        df.to_csv(path.join(RESOURCES_DIR, model_name + "_predicted.csv"))
        self._data_writer.csv_file_to_db(
            measurement_to_use=model_name + '_predicted',
            new_csv_file_name=path.join(RESOURCES_DIR,
                                        model_name + "_predicted.csv"))
        remove(path.join(RESOURCES_DIR, model_name + "_predicted.csv"))

    def nparray_to_dataframe(self, nparray_data):
        indexes = pd.DataFrame(nparray_data[:, 0])
        indexes[0] = pd.to_datetime(indexes[0], format='%Y-%m-%d %H:%M:%S')
        cols = [self._selected_model.get_data_column_name()]
        df = pd.DataFrame(data=nparray_data[0:, 1:],
                          index=indexes[0],
                          columns=cols)
        return df