def setUpClass(cls):
        cls.db_helper = DefinitionsDatabaseManager(
            cls.DB_FILE_PATH, cls.DB_CREATION_SCRIPT_PATH,
            cls.DEFAULT_DATA_TYPES_SCRIPT_PATH,
            cls.DEFAULT_DATA_SOURCE_TYPES_SCRIPT_PATH,
            cls.DEFAULT_OPERATIONS_SCRIPT_PATH)

        cls.ds_aosp_email = DataSource('Application',
                                       {'package_name': 'com.android.email'})
        cls.ds_facebook = DataSource('Application',
                                     {'package_name': 'com.facebook.katana'})
        cls.ds_aosp_sms = DataSource(
            'Application', {'package_name': 'com.android.providers.telephony'})
        cls.bad_ds = DataSource('Application', {})
        cls.dv_info = DeviceInfo('3.0.0', 'GT-I9300')

        cls.op_info_email_aosp_email = OperationInfo('EmailMessageAOSPEmail',
                                                     'EmailMessage',
                                                     cls.ds_aosp_email,
                                                     ['GT-I9300'],
                                                     [('2.3.7', '5.1.1')])
        cls.op_info_image_aosp_email = OperationInfo('ImageFileAOSPEmail',
                                                     'ImageFile',
                                                     cls.ds_aosp_email,
                                                     ['GT-I9300'],
                                                     [('2.3.7', '5.1.1')])
        cls.op_info_image_facebook = OperationInfo('ImageFileFacebook',
                                                   'ImageFile',
                                                   cls.ds_facebook,
                                                   ['GT-I9300', 'XT1053'],
                                                   [('2.3.7', '5.1.1')])
        cls.op_info_sms_aosp_sms = OperationInfo('SmsMessageAOSPSms',
                                                 'SmsMessage', cls.ds_aosp_sms,
                                                 ['GT-I9300', 'LG-D820'],
                                                 [('2.0', '4.4.4')])
    def get_operation_info_by_id(self, id_):
        """
        :param id_: int
        :rtype: OperationInfo

        """
        with sqlite3.connect(self.db_file_path) as conn:
            conn.row_factory = sqlite3.Row
            c = conn.cursor()
            c.execute(
                """
                SELECT dt.name AS dt_name, dst.name AS dst_name, o.name AS o_name
                FROM operations AS o, data_types AS dt, data_source_types AS dst
                WHERE o.data_type_id = dt.id AND o.data_source_type_id = dst.id AND o.id = ?
                """, [id_])

            res = c.fetchone()
            data_type = res['dt_name']
            data_source_type = res['dst_name']
            op_name = res['o_name']

            c.execute(
                """
                SELECT param_name, param_value
                FROM data_source_params_values dspv
                WHERE dspv.operation_id = ?
                """, [id_])

            param_values = {}
            for pv in c:
                param_values[pv['param_name']] = pv['param_value']

            c.execute(
                'SELECT model_number FROM device_models WHERE operation_id = ?',
                [id_])

            supported_models = []
            for dm in c:
                supported_models.append(dm['model_number'])

            c.execute(
                'SELECT from_version, to_version FROM android_versions WHERE operation_id = ?',
                [id_])

            supported_os_versions = []
            for av in c:
                supported_os_versions.append(
                    (av['from_version'], av['to_version']))

            c.close()

            return OperationInfo(op_name, data_type,
                                 DataSource(data_source_type, param_values),
                                 supported_models, supported_os_versions)
Beispiel #3
0
    def parse_list_args(self, arg_line):
        """
        :type arg_line: string
        :rtype: (string, DataSource, DeviceInfo)
        """
        dt = None
        ds = None
        di = None

        parser = ArgumentParser()
        parser.add_argument('--data_type', '-dt')
        parser.add_argument('--source_type', '-st')
        parser.add_argument('--source_params', '-sp', nargs='*')
        parser.add_argument('--model', '-m')
        parser.add_argument('--version', '-v')

        args, unknown = parser.parse_known_args(shlex.split(arg_line))

        if args.data_type:
            dt = args.data_type

        if args.source_type:
            ds = DataSource(args.source_type, {})

        if args.source_params:
            params = {}

            for p in args.source_params:
                if ':' not in p:
                    raise ValueError(
                        "The parameter 'source_params' is a whitespace separated list of pairs param_name:param_value."
                    )

                p_split = re.search('(.*):(.*)', p)
                params[p_split.group(1)] = p_split.group(2)

            ds.info = params

        if args.model and args.version:
            if not self.android_version_pattern.match(args.version):
                raise ValueError('The Android version is not valid.')

            di = DeviceInfo(args.version, args.model)
            di.os_version = args.version

        return dt, ds, di
    def test_add_operation(self):
        op_name = 'newOperation'
        dt_name = 'EmailMessage'
        dst_name = 'Application'
        param_values = {'package': 'com.example.email'}
        inspector_name = 'new_op_inspector'
        dev_models = ['GT-i9300']
        os_versions = [('2.2.0', '4.4.4')]

        ds = DataSource(dst_name, param_values)
        dev_info = DeviceInfo('4.3', dev_models[0])

        self.db_helper.add_operation(op_name, dt_name, dst_name,
                                     inspector_name, param_values, dev_models,
                                     os_versions)

        result = self.db_helper.query_operations_info(dt_name, ds, dev_info)

        self.assertEqualList(
            result,
            [OperationInfo(op_name, dt_name, ds, dev_models, os_versions)])
 def test_query_operation_for_data_source_with_missing_params(self):
     self.assertFalse(
         self.db_helper.has_all_required_param_values(
             DataSource('Application', None)))
def get_and_predict():
    print("Get and predict for ebola")

    engine = create_engine(DATABASE_URL)
    Session = sessionmaker(bind=engine)
    session = Session()
    data = pd.read_csv(data_url,
                       skiprows=[1],
                       parse_dates=["report_date", "publication_date"])
    cases_by_time = data.groupby("report_date").sum()

    cases_by_time.to_sql("cases_by_time", engine, if_exists="replace")

    latest_update_date = data["publication_date"].max()

    incidence, result_dates = get_incidence(cases_by_time["total_cases"])

    ebola_gamma_params = {"a": 2.41975308641975, "scale": 4.74428571428571}
    ebola_gamma = disease_model.discrete_prob(stats.gamma, ebola_gamma_params)
    force_of_infection = disease_model.force_of_infection_time(
        incidence, ebola_gamma)

    mean_r, lower_r, upper_r, post_a, post_b = disease_model.estimated_r(
        incidence, force_of_infection, ebola_gamma)

    n_pred = 21
    sims = disease_model.simulate_from_end_N(
        incidence,
        ebola_gamma,
        n_pred,
        lambda x: stats.gamma.mean(a=post_a[-1], scale=post_b[-1]),
        N=100)
    cum_sims = np.cumsum(sims, axis=1)

    results = pd.DataFrame()
    results["date"] = result_dates
    results["incidence"] = incidence
    results["cumulative_incidence"] = np.cumsum(incidence)
    results["estimated_r"] = [0] * 9 + mean_r
    results["estimated_r_lower"] = [0] * 9 + lower_r
    results["estimated_r_upper"] = [0] * 9 + upper_r

    predictions = pd.DataFrame()

    predictions["date"] = [
        result_dates[0] + datetime.timedelta(days=i)
        for i in range(len(result_dates) + n_pred)
    ]
    predictions["incidence"] = np.mean(sims, axis=0)
    predictions["incidence_upper"] = np.quantile(sims, 0.95, axis=0)
    predictions["incidence_lower"] = np.quantile(sims, 0.05, axis=0)
    predictions["cumulative_incidence"] = np.mean(cum_sims, axis=0)
    predictions["cumulative_incidence_upper"] = np.quantile(cum_sims,
                                                            0.95,
                                                            axis=0)
    predictions["cumulative_incidence_lower"] = np.quantile(cum_sims,
                                                            0.05,
                                                            axis=0)

    results.to_sql("estimate_r", engine, if_exists="replace")
    predictions.to_sql("predictions", engine, if_exists="replace")

    session.add(
        DataSource(update_time=latest_update_date,
                   data=json.dumps({
                       "cases_by_time": "cases_by_time",
                       "estimate_r": "estimate_r",
                       "predictions": "predictions"
                   })))
    session.commit()