Esempio n. 1
0
    def score_to_hundred(self, project: scoring_base.ScoringProject) -> float:
        """Compute a score for the given ScoringProject."""

        area_type = project.details.area_type

        if not area_type:
            raise scoring_base.NotEnoughDataException()

        if not project.imt_proto().yearly_avg_offers_per_10_candidates:
            raise scoring_base.NotEnoughDataException()

        num_better_departements = project.local_diagnosis(
        ).num_less_stressful_departements

        # User is already in one of the top 3 départements.
        if num_better_departements < 3:
            raise scoring_base.NotEnoughDataException()

        # Give a score centered around 50 corresponding to the user's mobility.
        # The worse the current département is, the more extreme we set the
        # score.

        score_range = min(num_better_departements * 1.5, 100) / 2

        if area_type >= geo_pb2.COUNTRY:
            return 50 + score_range

        if area_type >= geo_pb2.REGION:
            return 50

        if area_type >= geo_pb2.DEPARTEMENT:
            return 50 - score_range / 2

        return 50 - score_range
    def get_close_jobs(self, project: scoring_base.ScoringProject) \
            -> reorient_to_close_pb2.ReorientCloseJobs:
        """Get the jobs close to a job group."""

        recommended_jobs = reorient_to_close_pb2.ReorientCloseJobs()
        local_diagnosis = project.local_diagnosis()
        market_score = local_diagnosis.imt.yearly_avg_offers_per_10_candidates
        if not market_score:
            return recommended_jobs
        reorientation_jobs = local_diagnosis.less_stressful_job_groups
        close_jobs = [
            job for job in reorientation_jobs
            if job.mobility_type == job_pb2.CLOSE
        ]
        evolution_jobs = [
            job for job in reorientation_jobs
            if job.mobility_type == job_pb2.EVOLUTION
        ]
        database = project.database
        recommended_jobs.close_jobs.extend(
            self._convert_to_reorient_jobs(database, close_jobs, market_score,
                                           project))
        recommended_jobs.evolution_jobs.extend(
            self._convert_to_reorient_jobs(database, evolution_jobs,
                                           market_score, project))
        return recommended_jobs
Esempio n. 3
0
 def score_to_hundred(self, project: scoring_base.ScoringProject) -> float:
     local_diagnosis = project.local_diagnosis()
     offers_change = local_diagnosis.job_offers_change
     if local_diagnosis.num_job_offers_previous_year < 5\
             and local_diagnosis.num_job_offers_last_year < 5:
         raise scoring_base.NotEnoughDataException()
     if offers_change < 0:
         return 0
     # rescale offers: >=0 -> 50, >=10 -> 100
     return offers_change * 5 + 50
Esempio n. 4
0
    def score_to_hundred(self, project: scoring_base.ScoringProject) -> float:
        """Compute a percentage score for the given ScoringProject."""

        local_diagnosis = project.local_diagnosis()
        if not local_diagnosis.unemployment_duration.days:
            raise scoring_base.NotEnoughDataException()
        # Rescale unemployment_duration: 0 -> 100, >= 12 months -> 0
        # As unemployment_duration has much more low values in DB, use ** .7 to have more variance
        # in high scores (50% -> 136 ~= median).
        return 100 * (1 -
                      (local_diagnosis.unemployment_duration.days / 365)**.7)
Esempio n. 5
0
    def score_and_explain(self, project: scoring_base.ScoringProject) \
            -> scoring_base.ExplainedScore:
        """Compute a score for the given ScoringProject."""

        reasons = []
        if project.details.area_type < geo_pb2.COUNTRY:
            return scoring_base.NULL_EXPLAINED_SCORE
        reasons.append(
            project.populate_template(
                project.translate_static_string(
                    'vous nous avez dit être prêt%eFeminine à déménager')))

        local_stats = project.local_diagnosis()
        if local_stats.imt.yearly_avg_offers_per_10_candidates and \
                local_stats.num_less_stressful_departements:
            reasons.append(
                project.translate_static_string(
                    "il y a beaucoup plus d'offres par habitants dans d'autres villes"
                ))
            return scoring_base.ExplainedScore(2, reasons)
        return scoring_base.NULL_EXPLAINED_SCORE
Esempio n. 6
0
 def score_to_hundred(self, project: scoring_base.ScoringProject) -> int:
     bmo = project.local_diagnosis().bmo
     if not bmo.percent_difficult:
         raise scoring_base.NotEnoughDataException()
     return bmo.percent_difficult