Cvs.datei in array speichern und dann verändern

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Marleb
User
Beiträge: 22
Registriert: Montag 5. August 2013, 11:00

Guten Morgen, ich habe letzte Woche angefangen mit Python zu arbeiten und habe eine Frage. Um Daten aus Listen einzulesen und zu verändern müssen sie als array gespeichert werden?Wie speichere ich also in ein array?
Ich möchte dass das Programm Fehlwerte mit "empty" belegt, dies funktioniert. Wie kann ich sagen, dass alle Werte in der Liste, die 15% vom Mittelwert abweichen durch eine Kopie des Vorwertes ersetzt werden?

Bisher sieht das bei mir so aus:

Code: Alles auswählen

if (s.cell(row,col).ctype == XL_CELL_EMPTY): 		#IF CELL empty?
				values.append(str(abs(s.cell(row-1,col).value)))
			else:
				values.append(str(abs(s.cell(row,col).value))) #Gets Absolute Value of number in cell
		print (','.join(values))
		
	for row in range(14,26):
		values = []
		for col in range(12,13):
			if (s.cell(row,col).ctype == XL_CELL_EMPTY): 		#IF CELL empty?
				if (s.cell(row+1,col).ctype == XL_CELL_EMPTY):  #is next CELL also empty?
					values.append('empty')						# 2 Empty cells together = EMPTY CELL
				elif (s.cell(row-1,col).ctype == XL_CELL_EMPTY ):#is Previous CELL also empty?
					values.append('empty')						# 2 Empty cells together = EMPTY CELL
				else:
					values.append(str(abs(s.cell(row-1,col).value)))	#otherwise, only one cell empty -> copy previous value
			else:
				values.append(str(abs(s.cell(row,col).value)))
		print (','.join(values))	
		print (numpy.mean(values))
Zuletzt geändert von Anonymous am Dienstag 6. August 2013, 08:46, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@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.
Marleb
User
Beiträge: 22
Registriert: Montag 5. August 2013, 11:00

Danke zunächst für den ausführlichen Kommentar

Ja, es handelt sich um Numpy-arrays.
Zur Mittelwert-Fragew. In meinem Fall handelt es sicuh um Messdaten, die linear steigen. Es fängt mit dem kleinsten Wert an und hört mit dem höchsten Wert auf. Wie das bei Messungen so ist gibt es aber Fehl-, bzw. falsche Werte. Ziel ist die zunächst die Fehlwerte aufzufüllen und dann erst die abweichenden Werte herauszuschmeißen.
Das empty soll am Ende ganz raus und durch Kopie Vorwert ersetzt werden.
Mit Funktionen kenne ich mich noch nicht so aus, aber am Ende soll es in Funktione stehen, ja.

Code: Alles auswählen

import csv
	
file = open("example.csv", "rb")
lines = []
for line in file.xreadlines():
	print line
lines.append(string.split(line, ','))

for row in range(0,10):
	values = []
	for col in range(1,2):			
		if (s.cell(row,col).ctype == XL_CELL_EMPTY): 		#IF CELL empty?
			if (s.cell(row+1,col).ctype == XL_CELL_EMPTY):  #is next CELL also empty?
				values.append('empty')						# 2 Empty cells together = EMPTY CELL
			elif (s.cell(row-1,col).ctype == XL_CELL_EMPTY ):#is Previous CELL also empty?
					values.append('empty')						# 2 Empty cells together = EMPTY CELL
			else:
					values.append(str(abs(s.cell(row-1,col).value)))	#otherwise, only one cell empty -> copy previous value
		else:
				values.append(str(abs(s.cell(row,col).value)))
	print (','.join(values))	
	print (numpy.mean(values))
print
Ich bekomme für Zeile 7 den Fehler, dass ‚string‘ nicht definiert ist. Wie mache ich das?
Außerdem funktioniert meine Datenmanipulation noch nicht (vorher auf import xlrd geschrieben). Was ist der Ansatzpunkt?
Zuletzt geändert von Anonymous am Dienstag 6. August 2013, 10:54, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

@Marleb:
Dann suchst Du aber nicht den Mittelwert, sondern eher den Erwartungswert für Messung x, bei linearem Anstieg quasi den Punkt auf der Regressionsgeraden. Wenn Du für die "DropOuts" einfach den vorherigen Wert übernimmst, verfälscht Du massiv die Daten, Bsp:
Gegeben - y wächst quadratisch zu x
Behauptung - Zwischen y und x besteht ein linearer Zusammenhang
Deine Vorgehensweise würde hier fälschlicherweise eine Gerade finden, da Du einfach alle y-Werte mit mehr als 15% Abweichung mit dem vorherigen ersetzt. Da y durch das quadratische Wachstum immer über den vermuteten linearen Zusammenhang hinauswächst, "schneidest" Du viele Werte ab.
Besser ist es, hier mit linearer Regression und Bestimmtheitsmaß zu arbeiten, um solche Fehleinschätzungen zu erkennen. Messwerte, welche völlig aus dem Rahmen schlagen (offensichtlich falsch sind), würde ich aus der Betrachtung rausnehmen. Diesen Fehler musst Du dann nochmal gesondert betrachten.
BlackJack

@Marleb: Du importierst das `csv`-Modul, verwendest es dann aber gar nicht.

Du überschreibst den eingebauten Typ `file` mit einem offenen Dateiexemplar.

Das es `xreadlines()` gibt, habe ich bereits vergessen — die Methode verwendet heute niemand mehr, denn man kann *direkt* über das Dateiobjekt iterieren, ohne eine Methode aufrufen zu müssen.

Dann überlege mal wie oft die Zeile mit dem `split()` aufgerufen wird und mit welche(r|n) Zeile(n).

`string.split()` wird nicht mehr verwendet. Alles aus dem Modul was es auch als Methode auf Zeichenkettenobjekten gibt, ist veraltet.

Der ganze Rest funktioniert nicht weil `s` nicht definiert ist, und Du ja anscheinend gar nicht mehr mit `xlrd` arbeitest, also die ganzen Typen, Konstanten, und Methoden die dort verwendet werden, nicht stimmen.

Die Klammern bei ``print`` sind unnötig und irreführend. Denn wenn es die `xreadlines()`-Methode auf Dateiobjekten gibt, dann verwendest Du Python 2.x und dann ist ``print`` eine Anweisung und keine Funktion.

Schmeiss den ganzen Kram weg. Und *entwickle* das Programm. Also nicht alles hinschreiben und erst *dann* testen, sondern Schritt für Schritt erweitern und nach jedem Schritt testen ob das bis dort hin läuft und das erwartete Zwischenergebnis liefert. Von dem vorhandenen Code kannst Du sowieso kaum etwas gebrauchen.

Wenn Du am Ende ein `numpy`-Array haben musst, dann könntest Du statt des `csv`-Moduls auch eine der Funktionen von Numpy zum laden von Tabellen in Textformat verwenden. Zum Beispiel `numpy.genfromtext()`.
Antworten