2017-07-26 2 views
0

Mit der tabellarischen Datenbibliothek von Python agate Ich möchte eine Berechnung Formula definieren, die auf den Zeilenindex zugreift. Ich habe versucht,Wie greife ich auf den Zeilenindex in einer Achatformel zu?

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

aber das funktioniert nicht, weil das Objekt bietet keinen (Zeile) Index (im Gegensatz zum Column-Objekt!). Gibt es eine Möglichkeit, auf den Zeilenindex innerhalb der Formel zuzugreifen?

(Ich brauche das, um eine neue Spalte mit Werten einzigartig für jede Zeile zu erstellen.)

Antwort

0

Aus meiner Forschung folgerte ich, dass theer keine Möglichkeit, die Zeilennummer in der Funktion eines Standard Formula zuzugreifen. (Natürlich bin ich glücklich als falsch erwiesen werden!)

Um jedoch zu erreichen, was in der Frage gestellt ist ich Formula Unterklasse kann, ändern Sie die Signatur der aufgerufenen Funktion in die Zeilennummer als Parameter hinzu:

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 

Damit kann ich einen COMPUTE-Ausdruck schreiben, die für jede Zeile eine neue Spalte mit eindeutigen Werten erzeugen einzigartige:

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

Dies ist aus der Funktion __doc__:

muss einen gültigen Wert für den angegebenen Datentyp zurück. : param cast: Wenn: code: True, wird jeder Rückgabewert in das angegebene \ n: code: data_type umgewandelt, um sicherzustellen, dass er gültig ist.

Die vom offitial Tutorial:

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) 
]) 

von diesen beiden zu urteilen, würde ich sagen, dass Ihr Datentyp falsch ist, die index() Funktion gibt einen Objekttyp int deine ist text(). Versuchen Sie mit dem einen von den Docks agate.Number(). Die Tutorials i verwendet wird, ist http://agate.readthedocs.io/en/1.6.0/cookbook/excel.html#simple-formulas

+0

der (output) Datentyp der Formel * * nicht das Problem. Wie in der Frage erwähnt, ist meine Codezeile nicht gültig, weil 'r' keinen Zeilenindex hat, aber das genau meine Frage: Wie greife ich auf den Zeilenindex * innerhalb * der Formel zu? Deine Antwort spricht das überhaupt nicht an. – halloleo

+0

Ich werde die Antwort aktualisieren. In der Zwischenzeit habe ich angefangen, die Bibliothek zu benutzen. –

Verwandte Themen