Tabelle in Summenwerte zusammenfassen

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
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

Guten Tag,
ich mächte eine CSV-Datei gerne in verschiedenen Summen zusammenfassen. In meinem letzten Thread wurde mir numpy und pandas empfolhen, ich habe mir beides angeschaut. Wirklich ähnlichkeit mit der Sprache Python haben diese ja nicht. Ich möchte daher versuchen meine Probleme mit Hausmitteln von Python zu lösen.
Hier ist ein Bild der CSV Datei
Bild
Die Spalten A,B und C sind die in urspünglichen Spalten, ich möchte für ein Diagramm die Werte zusammenfassen Spalten D, E und F.

Meine Idee wäre die Datei Zeilenweise einlesen.
Dann per Schleife durch z. B. 5 Zeilen, den Wert summieren.
Dann ich die 5 Zeile schreiben. Davor noch das Datum und die Zeit.
Ab der 6 Zeile das gleiche, u.s.w....

Mein Probleme sind,
Wie bekomme ich das mit dem Datum und der Zeit hin?
Ist das realtiv einfach mit Python, oder muss man numpy pandas nehmen ?

Gruß Kai
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Warum willst du denn numpy und pandas nicht nehmen? Das ist damit grundsaetzlich einfacher, denn "zu Fuss" musst du dich mit vielen Dingen rumplagen, die dir so geschenkt werden. ZB Typkonvertierung (also genau Datum und Zeit), Summen auf Teilen der Tabelle, erweitern der Tabelle um Spalten, etc.

Und da sie in Python geschrieben sind (im weitesten Sinne), sind sie auch "pythonisch" - somit verstehe ich dein Argument die waeren Python nicht aehnlich nicht so richtig.

Aber wenn du selbst basteln willst, dann nimm dir das csv-Modul her, und fang an, dir das selbst zusammen zu bauen. Schau dir das Modul datetime an fuer die Datumskonvertierung.
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

Ok, hast du einen "geheim Tipp" für eine Seite zu Numpy auf deutsch ?
Ich habe nur welche in englisch gefunden.

Gruß Kai

edit: Ich versuche mal anzufangen und melde mich wieder.
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da ich des englischen maechtig bin - nein. Generell wirst du da Probleme haben, beim programmieren ist Englisch gewissermassen eine Vorraussetzung, wenn man die Dokumentation von Paketen dritter verstehen will. Den Aufwand, fuer tausende Projekte die teilweise auch nur von wenigen Entwicklern die natuerlich nicht deutsch sprechen, treibt halt keiner.

Aber da es eher technisches Englisch ist, kannst du sicher gut mit google oder deepl Uebersetzungen arbeiten.
ArtooDetoo
User
Beiträge: 60
Registriert: Dienstag 4. Dezember 2018, 16:57

Wenn man bei Google nach "numpy tutorial deutsch" sucht, findet man schon ein paar Ergebnisse. Aber grundsätzlich stimme ich deets zu: mangelnde Englischkenntnisse erschweren das Programmieren schon recht stark.
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

Ich habe auch ein paar Seiten gefunden. Es geht aber auch mit einem Übersetzer. Es wird ganz langsam. Unten ist mein code

Code: Alles auswählen

import numpy as np

entries0 = np.genfromtxt("test.csv",dtype=(str), skip_header=1,usecols=(0),delimiter=";")
entries1 = np.genfromtxt("test.csv",dtype=(str), skip_header=1,usecols=(1),delimiter=";")
entries2 = np.genfromtxt("test.csv", skip_header=1,usecols=(2),delimiter=";")

#print(entries1[1])

#print(len(entries2))

sum = []*5
i=0

for i in range(0,50):
    for j in range(0,5):
        print("i:",i , "j:",j , "Wert:" , entries2[i+j])
    i = i + 5
    print("i am Ende:" , i)
Die Ausgabe meiner Testdatei lautet wie folgt,

Code: Alles auswählen

i: 0 j: 0 Wert: 2.0
i: 0 j: 1 Wert: 1.0
i: 0 j: 2 Wert: 4.0
i: 0 j: 3 Wert: 3.0
i: 0 j: 4 Wert: 8.0
i am Ende: 5
i: 1 j: 0 Wert: 1.0
i: 1 j: 1 Wert: 4.0
i: 1 j: 2 Wert: 3.0
i: 1 j: 3 Wert: 8.0
i: 1 j: 4 Wert: 3.0
i am Ende: 6
i: 2 j: 0 Wert: 4.0
i: 2 j: 1 Wert: 3.0
i: 2 j: 2 Wert: 8.0
i: 2 j: 3 Wert: 3.0
i: 2 j: 4 Wert: 1.0
i am Ende: 7
i: 3 j: 0 Wert: 3.0
i: 3 j: 1 Wert: 8.0
i: 3 j: 2 Wert: 3.0
i: 3 j: 3 Wert: 1.0
i: 3 j: 4 Wert: 2.0
i am Ende: 8
i: 4 j: 0 Wert: 8.0
i: 4 j: 1 Wert: 3.0
i: 4 j: 2 Wert: 1.0
i: 4 j: 3 Wert: 2.0
i: 4 j: 4 Wert: 12.0
i am Ende: 9
Das ist meine Testdatei
Datum Zeit Rad
01.01.2016 00:00:00 2
01.01.2016 00:01:00 1
01.01.2016 00:02:00 4
01.01.2016 00:03:00 3
01.01.2016 00:04:00 8
01.01.2016 00:05:00 3
01.01.2016 00:06:00 1
01.01.2016 00:07:00 2
01.01.2016 00:08:00 12
01.01.2016 00:09:00 23
01.01.2016 00:10:00 2
01.01.2016 00:11:00 0
01.01.2016 00:12:00 2
01.01.2016 00:13:00 4
01.01.2016 00:14:00 0
01.01.2016 00:15:00 0
01.01.2016 00:16:00 2

Warum wird die Laufvariable i nach dem ersten Durchgang, wenn i am Ende: 5 ist, im nächsten Durchgang wieder auf 1 zurück gesetzt ?
Was soll das ?

Gruß Kai


edit:
Ich habe es geschafft.
Mit der Schrittweite, weiterhin werden jetzt die 5 Einträge in ein Array geschrieben und addiert :).

Code: Alles auswählen

import numpy as np

entries0 = np.genfromtxt("test.csv",dtype=(str), skip_header=1,usecols=(0),delimiter=";")
entries1 = np.genfromtxt("test.csv",dtype=(str), skip_header=1,usecols=(1),delimiter=";")
entries2 = np.genfromtxt("test.csv", skip_header=1,usecols=(2),delimiter=";")

#print(entries1[1])

#print(len(entries2))

sum = [0]*5
i=0

for i in range(0,50,5):
    for j in range(0,5):
        print("i:",i , "j:",j , "Wert:" , entries2[i+j])
        sum[j] = entries2[i+j]
    i = i + 5
    print(np.sum(sum[:]))
    print("i am Ende:" , i)
Meine Frage bleibt trotzdem, warum kann ich nicht einfach am Ende der Schleife i = i +5 rechnen ?

Gruß Kai
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kahnbein.Kai: Ich würde ja Pandas für dieses Problem nehmen, das ist genau für solche Sachen gedacht. Numpy eher für Arrays bei denen alle Elemente den gleichen Datentyp haben. Damit muss man die Datei deswegen drei mal laden statt nur einmal.

Die Zuweisung an `sum` ist unnötig umständlich, denn ``[] * 5`` ist das selbe wie einfach nur eine leere Liste, also ``[]``. `sum` ist zudem der Name einer eingebauten Funktion. Den sollte man nicht an andere Werte binden, das führt nur zu Verwirrung beim Leser.

`i` vor der Schleife an einen Wert zu binden macht keinen Sinn, und am Ende der Schleife `i` an einen Wert zu binden ist auch nicht sinnvoll, weil der beim nächsten Schleifendurchlauf ja gleich wieder an den nächsten Wert aus dem iterierbaren Objekt vom `range`-Objekt gebunden wird.

Wenn man bei Numpy ``for``-Schleifen in Python schreibt, macht man in 90% der Fälle etwas falsch. Für Deinen Fall suchst Du wahrscheinlich `numpy.add.reduceat()`. In Pandas wäre es die `groubby()`-Methode gefolgt von `aggregate()`/`agg()`.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Weil das nunmal die Art und Weise ist, wie die for-schleife funktioniert. Die Laufvariable nimmt die Werte aus dem Generator "range" an. Uebersetzt ist

Code: Alles auswählen

for i in irgendwas
gleich zu setzen mit

Code: Alles auswählen

_iterator = iter(irgendwas)
while True:
     try:
            i = next(_iterator)
     except StopIteration:
           break
     else:
            ... #rest der Schleife
Wenn du das nicht willst, dann musst du selbst eine while-Schleife schreiben, dann hast du die volle Kontrolle.

Und wenn du als dtype str angibst, dann bekommst du genau NICHT die Vorteile von numpy oder Pandas. Da du gemischte Datentypen hast, musst du wohl pandas benutzen, denn das hat eine heuristik, die auch unterschiedliche Datentypen per Spalte erlaubt.
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

@Blackjack und deets
Danke für deine Antwort. Ich werde es in meinen Code aufnehmen. Ich habe nen Tutorial für Pandas gefunden, ich werde mich mal dran versuchen.

Gruß Kai
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kahnbein.Kai: die Schleifenvariable wird bei jedem Start der Schleife auf den neuen Wert gesetzt, da ist es egal, was Du irgendwo anders in die Variable schreibst.
Wenn Du drei Spalten benutzen willst, dann gib für usecols eine Liste an und lade die Datei nicht drei mal.
Bei eine Liste, die sum heißt, erwarte ich, dass da Summen drin stehen, und nicht werde die summiert werden sollen. Warum erzeugst Du eine Kopie der Liste, die Du dann mit np.sum summierst? Listen füllt man in Python nicht erst mit Dummywerten und überschreibt die dann, sondern generiert bei Bedarf einfach eine neue Liste.
Du nutzt jetzt auch gar nicht die Vorteile von numpy, mit Vektoren zu rechnen. Da ja anscheinend die Anzahl ein Vielfaches von 5 ist:

Code: Alles auswählen

entries = np.genfromtxt("xx.csv", usecols=(0, 1, 2), delimiter=";", names=True, dtype=None)
summen = entries['Rad'].reshape(-1,5).sum(axis=1)
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

__blackjack__ hat geschrieben: Donnerstag 20. Dezember 2018, 15:57 In Pandas wäre es die `groubby()`-Methode gefolgt von `aggregate()`/`agg()`.
Schmunzel, kleiner Typo; gemeint ist die pandas.DataFrame.groupby() Methode https://pandas.pydata.org/pandas-docs/s ... oupby.html
Nicht das Kai nach groubby sucht und nur sowas hier findet :lol: https://pubg.op.gg/user/Groubby?server=pc-as&hl=en
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Kahnbein.Kai
User
Beiträge: 104
Registriert: Mittwoch 24. Juni 2015, 14:12
Wohnort: Bochum

Ich habe jetzt nochmal eine Frage zur Durchführung mit Pandas. Soweit bin ich jetzt,
Bild
Die Daten sind urpsrünglich Minutenwerte und ich möchte daraus Tagessummenwerte machen.
Das heißt Pythonm oder Pandas muss die Zeilen von 0 bis 86400 addieren, und das Datum was in der 86399 Zeile steht davor schreiben.
Das ganze soll das so aussehen:
01.01.2016 152
02.01.2016 352
03.01.2016 255
...

Ich finde nur Beipspiele in denen ganze Spalten summiert werden, aber nicht abschnittsweise.
Wie soll ich vorgehen, mit einer Schleife oder geht bei dem tollen Pandas auch ohne ?

Gruß Kai
Benutzeravatar
__blackjack__
User
Beiträge: 13111
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kahnbein.Kai: Wie schon gesagt: `groupby()` und dann mit `agg()` aggregieren.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten