예제 #1
0
    def upload_all_groups(self, ):
        """
        upload AffinityPropagation model for to define a users' group and updating all users
        :return None:
        """
        dataset = []
        users = []
        count = Users.select().count()
        for i in range(0, count, 100):
            usrs = Users.select().offset(i).limit(100).execute()
            for u in usrs:
                users.append(model_to_dict(u))

        for u in users:
            dataset.append(self.user_preparation(u))

        from sklearn.cluster import AffinityPropagation

        clustering = AffinityPropagation(affinity='euclidean',
                                         convergence_iter=15,
                                         copy=True,
                                         damping=0.5,
                                         max_iter=200,
                                         preference=None,
                                         verbose=False).fit(dataset)

        all_users = Users.select().execute()
        for u in all_users:
            u.group = self.get_group(u)

        with db.atomic() as txn:
            try:
                Users.bulk_update(all_users, fields=[Users.group])
            except peewee.Error as e:
                logger.error(str(e))
                db.rollback()

            @test
            def unsave():
                txn.rollback()

        @not_test
        def save():
            import pickle
            pickle.dump(clustering, open(PATH_TO_DIR + "clustering", "wb"))