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: P> ce qui signifie que je vais prendre J'écris ceci en python. Pouvez-vous suggérer des stratégies sur le traitement de ce flux de travail? P> P> workflow [0] code> comme mon jeu de données, et je vais exécuter
algorithme1 code> dessus. Ensuite, je prendrai ses résultats et je vais exécuter
algorithme2 code> sur ces résultats comme mon nouveau jeu de données. Et je vais prendre les nouveaux résultats et exécuter
algorithm3 code> dessus. Cela va comme ça jusqu'au dernier article et il n'y a pas de limite de longueur pour ce flux de travail. P>
5 Réponses :
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 p>
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]
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.
Définir un Maintenant, itérale sur votre dicte "Workflow". Pour la première entrée, instanciez simplement votre catégorie code> code>. P> pour chaque entrée ultérieure ... p> supposant que vous avez maintenant la chaîne getattr (myDataset, algorithme) (* parames) p> li>
Ceci appellera la fonction sur DataSet Code> Classe qui suit ... Données ... pour votre ensemble. Définir des méthodes dans cette classe. Quelque chose comme ça:
dict code> est gênant ici) li>
algorithme code> et le tuple
paramètres code> pour l'itération actuelle ... p>
myDataset code> avec le nom spécifié par "algorithme" avec la liste d'arguments contenue dans "Params". p> li>
ul> p>
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é: 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]
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.
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: p> 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: p> Un autre algorithme pourrait ressembler à ceci: p> étape 2 p> 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: p> puis obtenir les résultats par: p> étape 3 p> 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: p> facile, hein? Vous alliez enregistrer un nouvel algorithme comme si: p> 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. ;) p> (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). P> P>