@Marleb: Um Daten aus Listen auszulesen und zu verändern müssen sie keineswegs als Arrays gespeichert werden. Wobei ich jetzt mal annehme mit Array meinst Du Numpy-Array-Datentypen.
Zu der Mittelwert-Frage: Du müsstest halt den Mittelwert berechnen und dann die Liste durchgehen. Dabei stellen sich ein paar Fragen für Randfälle. Was passiert wenn schon der erste Wert mehr als 15% abweicht? Was soll passieren wenn mehrere aufeinander folgende Werte mehr als 15% abweichen? Was passiert wenn ein Wert mehr als 15% abweicht wo im vorhergehenden Element 'empty' steht?
Bezüglich des 'empty': Statt so einen speziellen Wert zu nehmen der eher nach Darstellung als nach Bedeutung aussieht, würde ich `None` als Wert für „nichts” nehmen. Dafür ist dieses Objekt gedacht. Beziehungsweise wenn das aus irgend welchen Gründen doch noch als Numpy-Array repräsentiert werden soll, dann müsste man dort `numpy.nan` verwenden, denn man kann in einem Array nur einen Typ für alle Elemente haben. (Record-Arrays mal aussen vor gelassen.)
Bei dem ``numpy.mean(values)`` sollte Dir eigenlich eine Ausnahme um die Ohren fliegen, denn in `values` sind Zeichenketten gespeichert. Davon kann man keinen Durchschnittswert berechnen. Wenn Du das dann mit Zahlen machst, solltest Du sicherstellen dass das Verhalten der Funktion bei „leeren” Zellen stimmt.
Die Klammern bei den ``if``-Bedingungen sind unnötig.
Der Test auf leere Zellen wird so oft gemacht und jedes mal mit enem Kommentar erklärt, dass man dafür vielleicht eine kleine Funktion schreiben sollte, die durch den Namen dann selbsterklärend ist, auch ohne einen Kommentar, und das ganze leichter lesbar macht.
Vielleicht könnte man auch die Werte erst mal aus der Tabelle holen, also Zahlenwerte und `None` für leere Zellen, und dann auf dem Ergebnis erst operieren. Mir schwebt da so eine Funktion wie `get_absolute_value()` vor, die ungefähr so aussehen könnte:
Code: Alles auswählen
def get_absolute_value(sheet, row, column):
cell = sheet.cell(row, column)
return None if cell.ctype == XL_CELL_EMPTY else abs(cell.value)
Es ist deutlich zu tief eingerückt. Zusammen mit den überlangen Kommentaren an den Zeilenenden wird das schnell sehr unübersichtlich umgebrochen, so dass man deutlich schwerer die Struktur des Programms erkennen kann. Wirf mal einen Blick in den
Style Guide for Python Code.
Der Name `s` ist zu kurz, weil nichtssagend.