2017-07-26 1 views
0

Utilisation de la bibliothèque de données tabulaires de Python agate Je souhaite définir un calcul Formula, qui accède à l'index de ligne . J'ai essayéComment accéder à l'index de ligne dans une formule agate?

agate.Formula(agate.Text(), lambda r: r.index()) 

mais cela ne fonctionne pas, parce que l'objet ne fournit pas d'indice (ligne) (contrairement à l'objet de la colonne!). Y at-il un moyen d'accéder à l'index de ligne à l'intérieur de la formule?

(je besoin de cela pour créer une nouvelle colonne avec des valeurs uniques pour chaque ligne.)

Répondre

0

De mes recherches, je conclus que theer n'y a aucun moyen d'accéder au numéro de ligne dans la fonction d'un Formula standard. (Bien sûr, je suis heureux d'être démenties!)

Toutefois, afin d'obtenir ce qui est demandé dans la question que je peux sous-classe Formula, changer la signature de la fonction appelée ajouter le numéro de ligne en tant que paramètre dans:

class EnumeratedFormula(agate.Formula): 
    """ 
    An agate formula which provides a row index to its compute function 
    The function used has now the signature f(i,r) 
    """ 
    def run(self, table): 
     new_column = [] 

     for i, row in enumerate(table.rows): 
      v = self._func(i,row) 

      if self._cast: 
       v = self._data_type.cast(v) 

      new_column.append(v) 

     return new_column 

avec ce que je peux écrire une expression de calcul qui crée une nouvelle colonne avec des valeurs uniques uniques pour chaque ligne:

EnumeratedFormula(agate.Text(), lambda i, r: str(i))) 
0

Ceci est de la fonction __doc__:

doit retourner une valeur valide pour le type de données spécifié. : param cast: Si: code: True, chaque valeur de retour sera convertie au \ n: code spécifié: data_type pour s'assurer de sa validité.

Ce tutoriel est de offitial:

number_type = agate.Number() 

def five_year_total(row): 
    columns = ('2009', '2010', '2011', '2012', '2013') 

    return sum(tuple(row[c] for c in columns)] 

formula = agate.Formula(number_type, five_year_total) 

new_table = table.compute([ 
    ('five_year_total', formula) 
]) 

A en juger par ces deux, je dirais que votre type de données est erroné, la fonction retourne index() un type d'objet int est le vôtre text(). Essayez d'utiliser celui des quais agate.Number(). Les tutoriels que j'ai utilisé est http://agate.readthedocs.io/en/1.6.0/cookbook/excel.html#simple-formulas

+0

la (sortie) type de formule est * pas * la question des données. Comme mentionné dans la question ma ligne de code n'est pas valide, parce que 'r' n'a pas d'index de ligne, mais c'est exactement ma question: Comment accéder à l'index de ligne * dans * la formule? Votre réponse ne répond pas du tout à cela. – halloleo

+0

Je vais mettre à jour la réponse. En attendant, j'ai commencé à utiliser la bibliothèque. –