10
votes

Traitement d'un simple flux de travail dans Python

Je travaille sur un code qui prend un jeu de données et exécute des algorithmes sur elle.

Utilisateur télécharge un jeu de données, puis sélectionne quels algorithmes seront exécutés sur ce jeu de données et crée un flux de travail comme celui-ci: xxx

ce qui signifie que je vais prendre workflow [0] comme mon jeu de données, et je vais exécuter algorithme1 dessus. Ensuite, je prendrai ses résultats et je vais exécuter algorithme2 sur ces résultats comme mon nouveau jeu de données. Et je vais prendre les nouveaux résultats et exécuter algorithm3 dessus. Cela va comme ça jusqu'au dernier article et il n'y a pas de limite de longueur pour ce flux de travail.

J'écris ceci en python. Pouvez-vous suggérer des stratégies sur le traitement de ce flux de travail?


0 commentaires

5 Réponses :


2
votes

La façon dont vous voulez le faire semble être sonore pour moi, ou vous devez publier plus d'informations sur ce que vous essayez d'accomplir.

et conseil: je mettrais la structure de flux de travail dans une liste avec des tuples plutôt que Dictionnaire xxx


0 commentaires

4
votes

Si chaque algorithme code> fonctionne sur chaque élément sur code> DataSet code>, mappe () code> serait une option élégante:

>>> algo1=lambda x:0 if x%2==0 else x
>>> algo2=lambda x:x*x
>>> dataset=range(10)
>>> workflow=(dataset, algo1, algo2)
>>> for algo in workflow[1:]:
    dataset=map(algo, dataset)
>>> dataset
[0, 1, 0, 9, 0, 25, 0, 49, 0, 81]


1 commentaires

Moins concis et élégant peut-être que la réponse marquée la plus élevée, mais j'aurais tendance à la préférer à la lisibilité et à une utilisation supplémentaire par d'autres utilisateurs.



2
votes

Définir un DataSet Classe qui suit ... Données ... pour votre ensemble. Définir des méthodes dans cette classe. Quelque chose comme ça: XXX

Maintenant, itérale sur votre dicte "Workflow". Pour la première entrée, instanciez simplement votre catégorie . xxx

pour chaque entrée ultérieure ...

  • extraire la clé / valeur d'une manière ou d'une autre (je vous recommanderais de modifier votre structure de données de flux de travail si possible, dict est gênant ici)
  • Analysez la chaîne de param param. sur un tuple d'arguments (cette étape est à vous).
  • supposant que vous avez maintenant la chaîne algorithme et le tuple paramètres pour l'itération actuelle ...

    getattr (myDataset, algorithme) (* parames)

  • Ceci appellera la fonction sur myDataset avec le nom spécifié par "algorithme" avec la liste d'arguments contenue dans "Params".


0 commentaires

10
votes

Vous voulez exécuter un pipeline sur un jeu de données. Cela ressemble à une opération réduite (plier dans certaines langues). Pas besoin de quelque chose de compliqué: xxx pré>

Ceci assume le flux de travail ressemble (orienté texte afin que vous puissiez le charger avec YAML / JSON): P>

def algo_by_name(name):
    return {'algo0': algo0, 'algo1': algo1, }[name]


3 commentaires

Désolé d'être que Newbie, mais je ne pouvais pas faire fonctionner le code. Est-ce que je retournerai des noms d'algorithme de la fonction algo_by_name?


Algo_by_name (aname) doit être une fonction, de sorte que vous puissiez passer (p, données) à elle. J'ai écrit un exemple.


Merci pour l'exemple, je l'apprécie.



1
votes

Voici comment je ferais cela (tout le code non testé):

Étape 1: Vous devez créer les algorithmes. Le jeu de données pourrait ressembler à ceci: xxx

Notez que vous faites un itérateur de celui-ci, de sorte que vous ithérez-vous un élément à la fois. Il y a une raison pour cela, vous verrez plus tard:

Un autre algorithme pourrait ressembler à ceci: xxx

étape 2

Votre utilisateur aurait alors besoin de faire une chaîne de cela en quelque sorte. Maintenant s'il avait accès à Python directement, vous pouvez simplement faire cela: xxx

puis obtenir les résultats par: xxx < p> Et il demanderait au multiplicateur d'une seule pièce de données à la fois et le multiplicateur serait à son tour en tant que jeu de données. Si vous avez une chaîne, cela signifie qu'une seule pièce de données est traitée à la fois. Cela signifie que vous pouvez gérer d'énormes quantités de données sans utiliser beaucoup de mémoire.

étape 3

Vous voulez probablement spécifier les étapes d'une autre manière. Par exemple, un fichier texte ou une chaîne (on sonne comme celui-ci peut être basé sur le Web?). Ensuite, vous avez besoin d'un registre sur les algorithmes. Le moyen le plus simple est de simplement créer un module appelé "registre.py" comme ceci: xxx

facile, hein? Vous alliez enregistrer un nouvel algorithme comme si: xxx

Vous auriez également besoin d'une méthode qui crée la chaîne de spécifications dans un fichier texte ou quelque chose. Je vais laisser ça à toi. ;)

(J'utiliserais probablement l'architecture de composants Zope et effectuerions des composants d'algorithmes et les enregistrer dans le registre des composants. Mais c'est tout surkill à la strictement parlant).


0 commentaires