Schleife für eine Fetchall-Statement

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
123GuteLaune
User
Beiträge: 27
Registriert: Mittwoch 2. November 2016, 22:35

Hallo zusammen,

ich sitze vor einen Problem und weiß leider nicht wie ich es lösen kann :shock: ...
Programmdaten: Python 2.7.12 (32-Bit), pyodbc (32-Bit), Windows 7 enterprise (64-Bit), Access (32-Bit), Excel (32-Bit)

Ich würde gerne einen dynamischen Select-Befehl (Schleife) generieren, der das Abfrageergebniss in einer Variable speichert. Im Anschluss werde ich einige Berechnungen machen dafür werden die Daten transformiert vor der Berechnung und wieder rücktransformiert nach der Berechnung. Das Ergebniss soll mit den gleichen Relation wie für den fetchall-Befehl zurück geschrieben werden.

Meine Daten sind über ein gewisse Zeitfenster (Jahre 2000-2016) verteilt und Stellen Umsatzmengen dar. Ich würde gerne mit den fetchall Befehl alle Jahre einspielen mit gewissen Parametern und dann eine Berechnung machen und diese Daten in eine anderen Spalte, aber gleiche Tabelle und Zeile zurückspielen -> sprich ich habe einen eindeutigen primary key.

Mit diesem Code hole ich mir den Index für mein Where-Statement

Code: Alles auswählen

import openpyxl
wb = openpyxl.load_workbook('C:\XXX\Beisspieldatensatz.xlsx')
sheet1 = wb.get_sheet_by_name('A')

for i in range(1,72,1):
        print(sheet1.cell (row=i, column=1).value)
        
sheet2 = wb.get_sheet_by_name('B')

for i in range(1,52,1):
        print(sheet2.cell (row=i, column=1).value)
Das ist mein Code zum Einlesen der

Code: Alles auswählen

import pyodbc as py

#Connection string to access
cnxn = py.connect("DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};UID=admin;UserCommitSync=Yes#;Threads=3;SafeTransactions=0;PageTimeout=5;MaxScanRows=8;MaxBufferSize=2048;FIL={MS Access};DriverId=25;DefaultDir=C:\XXX\Desktop;DBQ=C:\XXX\Desktop\DatabaseMA_Test.mdb")

cursor = cnxn.cursor()

#Load Data out of MS Access
cursor.execute(
                """
                SELECT Y,F,D, Primary Key)
                FROM [TW-DS]
                WHERE A = ? 
                and B= ?
                 """, 
                 ['Blub', 'Sepp']) hier würde ich gerne meine Variablen Daten einspielen lassen

rows = cursor.fetchall()
print(rows)
Im nächsten Schritt würde ich gerne meine Berechnung machen mit dem Array row.
Dafür muss ich die Access-Daten transformieren mit Hilfe von panda (Hab ich aber noch keine code)

Und in desem Schritt will ich die Daten wieder zurück spielen anhand des Primary keys

Code: Alles auswählen

import pyodbc as py

#Connection string to access
cnxn = py.connect("DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};UID=admin;UserCommitSync=Yes#;Threads=3;SafeTransactions=0;PageTimeout=5;MaxScanRows=8;MaxBufferSize=2048;FIL={MS Access};DriverId=25;DefaultDir=C:\XXX\Desktop;DBQ=C:\XXX\Desktop\DatabaseMA_Test.mdb")

cursor = cnxn.cursor()

#Write data back in MS Access
cursor.execute(
               """insert into [TW-DS]
               Where Primary Key = XX Hier müsste der Key dynamisch eingespielt werden
               (
               Wert,
               Menge
               )
               values 
               (
               X1, 
               Y2
               )
               """)
cnxn.commit()
Ich hoffe jemand kann mir einen Tipp geben.

Gruß 123GuteLaune
Zuletzt geändert von Anonymous am Mittwoch 16. November 2016, 21:43, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@123GuteLaune: Fang an das konkret zu machen und komm dann mit *konkreten* Problemen wieder. Es macht nicht wirklich Sinn sich da irgendwelchen halbgaren Code zusammen zu raten den man nicht mal laufen lassen hat.

Teil Dein Problem auf Teilprobleme auf und löse die einzeln in Funktionen. Wenn das jeweilige Teilproblem noch zu gross ist um es in einer Funktion in ein paar Zeilen Code zu lösen, dann teil es in weitere Teilprobleme auf. Solange bis es einfach lösbar ist. Diese Teillösungen dann testen und zu grösseren Lösungen zusammensetzen und die dann wieder testen. Erst mit der nächsten Teillösung weitermachen wenn die aktuelle wie gewünscht funktioniert.

Dein Beitrag besteht aus Bechreibungen im Text die teilweise nicht wirklich Sinn machen und Code der auch nicht überall Sinn macht oder gar lauffähig ist.

Das SQL ist in beiden Fällen kein gültiges SQL.

Im Text steht was von einem Array `row` was es im Code nicht gibt, und was ziemlich sicher auch kein Array ist.

Die Namen sind teilweise schlecht gewählt. `py`? `cnxn`?

Beim zurückspielen der Daten geht kein INSERT, denn den Primärschlüssel gibt es ja schon, da muss man ein UPDATE machen. Ausserdem braucht man da dann entweder eine Schleife, oder besser die `executemany()`-Methode.
123GuteLaune
User
Beiträge: 27
Registriert: Mittwoch 2. November 2016, 22:35

Hallo,

Tut mir leid, ich steh derzeit vor sovielen Problem und ich hab keinen Plan die alle zu lösen.
Ich versteh nicht mal grundsätzlich wie ich eine Schleifen mäßige SQL-Abfrage machen könnte.

Teilfrage:
Das ist mein Excel-Import-Code,

Code: Alles auswählen

import openpyxl

#Conncetion to Excel Workbook
wb = openpyxl.load_workbook('C:\xxx\Desktop\Beisspieldatensatz.xlsx')

#Open a specific Workbook sheet
ws1 = wb.get_sheet_by_name('Methodentest')

#Estimate Array
tuple(ws1['A2':'C55'])

#Fill up Array
for rowOfCellObjects in ws1['A2':'C55']:
       for cellObj in rowOfCellObjects:
               print(cellObj.coordinate, cellObj.value)
       print('--- END OF ROW ---')
leider bekomme ich immer diesen Fehler, ich habe schon andere Schleifen versucht oder mir nur die Zeilen einzeln einzulesen, des Fehler bleibt der gleiche... Ich mach also irgendwas grundstätzliches falsch...

Code: Alles auswählen

File "C:\XXX\Anaconda2\lib\zipfile.py", line 684, in read1
    max(n - len_readbuffer, self.MIN_READ_SIZE)
MemoryError
Nach dem Import der Daten sollte die Cell Values aus Excel in einem Array gespeichert sein, das ich dann formatieren kann und eine Berechnung durchführen lassen kann.

Leider finde ich keine Ähnlichen Fehler im Internet.

Gruß
Zuletzt geändert von Anonymous am Freitag 18. November 2016, 18:13, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@123GuteLaune: Deswegen teilt man Probleme ja in kleinere Teilprobleme auf die man dann, wenn sie klein genug sind, auch einfach lösen kann. Statt alles auf einmal zu betrachten, kann man sich auf einen kleinen Ausschnitt des Gesamtproblems befassen ohne den Überblick zu verlieren.

Die Kommentare sind alle ein bisschen irreführend. Zu einer Excel-Arbeitsmappe erstellt man keine Verbindung, die wird geladen. In den Speicher. Davon gibt es nur begrenzt viel pro Prozess.

Die Tabelle wird nicht geöffnet, sondern es wird einfach das Tabellen-Objekt von der Arbeitsmappe abgefragt.

Was mit ”Estimate Array” gemeint ist, verstehe ich nicht. Ausser Rechenzeit und Speicher zu verbrauchen macht Zeile 10 auch nichts. Also letztendlich nichts sinnvolles.

``#Fill up Array`` macht nicht das was der Kommentar sagt. Da gibt es nirgends ein Array, also kann auch keins gefüllt werden.

Du zeigst nicht den gesamten Traceback, also muss man raten wo der Auslöser in Deinem Quelltext her kommt. Ich rate jetzt mal es ist Zeile 4‽ Dann ist einfach nicht genug Speicher vorhanden um die Arbeitsmappe zu laden. Oder anders herum: Das Ding ist zu gross.

Das Du keinen mit ähnlichem Fehler an der Stelle findest, liegt hoffentlich daran das die Leute üblicherweise keine irrwitzig grossen Excel-Dokumente erstellen. :-)

Was meinst Du mit „Array“? Und in dem Zusammenhang dann „formatieren“?
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

mal eine grundsätzliche Frage: Excel und Access können doch auch "so" miteinander kommunizieren, d.h. du kannst aus Excel AFAIK auch direkt auf Access Datenbanken zugreifen, ggf. brauchst du ein bisschen VBA.

Gibt es eine Grund, warum du als "glue code" Python haben willst? Python ist zwar bei vielen (sehr) gut, aber hier IMHO nicht die ideale Lösung.

Gruß, noisefloor
123GuteLaune
User
Beiträge: 27
Registriert: Mittwoch 2. November 2016, 22:35

Hallo,

erstmal vielen Dank für die Antworten.

@noisfloor:Ich nutze Excel als eine Art Lager um den nachfolgenden SQL String zusammenzubauen. Zusätzlich wollte ich Excel vorab als kleinen Versuchen nutzen um meine mathematischen Methoden zu testen und welchen Datenformatierung sie als Input brauchen... (ich bin Anfänger, sorry wenn der weg umständlich ist)
Nur als Info: meine Datenbank wird am Ende in Access sein und etwa 10 GB groß sein und rein aus Daten bestehen. Ich will Excel als Grundlage für meine Schleifen nutzen. Aus Excel soll meine Indexwerte kommen um die Schleife durchlaufen zu können. Ich nutze Excel deswegen da andere Benutzer eher wenig ahnung haben von SQL und ich so Ihnen einfach sagen kann, spielt die spezifischen Werte in Excel und den rest macht das Programm... so der Plan

@Blackjack: Ok verstehe, ich dachte, ich habe genau das programmiert was ich kommentiert habe, ich werde das nochmal verbessern
OK ich denke ich verstehe deine Einwende bzgl. der Größe meiner Exceldatei (ist nur 20 MB mit 10 Blättern). Wenn ich eine einfache Abfrage nur über eine Spalte über eine kleiner Datei (sagen wir 19 KB ein Blatt mache funktioniert der Code einwandfrei ohne Tupel..
Stimmt vielleicht was nicht mit der Blatterkennung, das er zuviel aufeinmal einließt ins Memory und nicht nur das eine Blatt mit meinen Grenzen?
Den Code mit dem Tuple erzeugen nutze ich um alle Spalten und Zeilen genau wie im Arbeitsblatt angeordnet werden (A1,B1,C1)(A2,B2,C2) usw., sonst werden alle Werte nur untereinander gespeichert zumindest so mein Verständnis (siehe hier https://automatetheboringstuff.com/chapter12/)
Ich hab im Inet gelesen, dass Leute Datein mit 350 MB öffnen konnten ???
Ich habe heute meinen Code an meinen Mac getestet in einer VM mit Windows 8 und da hat das ganze einwandfrei funktioniert, nachdem ich den Zielpfad mit einen r versehen habe open.XX(r'...'). Das Problem habe ich häufiger in der VM, das mein Pfad nicht als String erkannt wurde...
Aber auf meinen Arbeitsrechner funktioniert es immer noch nicht, ich teste weiter

Gruß
GuteLaune
BlackJack

@123GuteLaune: Wo genau hast Du da das mit dem Tupel her? (Das ist mir jetzt ein bisschen zu lang zum suchen. :-))

Die Dateigrösse ist ja nicht 1:1 abbildbar auf den Speicherbedarf, weil das ja eine komprimierte Archivdatei ist und wenn man mit den Daten arbeiten möchte, dann müssen die natürlich unkomprimiert vorliegen. Allerdings erscheint mir 20 MB jetzt nicht so besonders gross. Da wäre dann die Frage wie die unkomprimierten Grössen aussehen.

Wie führst Du das denn aus? Wirklich unabhängig als Programm oder aus einer IDE heraus, oder gar so etwas wie Spyder?

Du hast kein Problem damit das Dein Pfad nicht als String erkannt wird, sondern anscheinend sind Escapesequenzen enthalten und der String enthält nicht das was Du denkst was er enthält. 'C:\test.txt' enthält nicht das Laufwerk 'C:\' und den Dateinamen 'test.txt' sondern 'C:' dann ein Tabulatorzeichen und dann 'est.txt'. Weil '\t' eben nicht zwei Zeichen sind, sondern der Code für ein Tabulatorzeichen. Das sind aber Grundlagen.
123GuteLaune
User
Beiträge: 27
Registriert: Mittwoch 2. November 2016, 22:35

Ich habe keine Ahnung von den Grundlagen, deswegen meine Fragen im Forum und wahrscheinlich meine komische Fragenstellungen :(

Meine Excel-Datei ist unkompirmiert 16 MB groß und hat mehrere Blätter.

Das mit dem Tupel hab ich von hier https://automatetheboringstuff.com/chapter12/ unter dem Absatz "Getting Rows and Columns from the Sheets"

Wenn ich das r davor schreib wird alles, als das erkannt was ich als path eingeben habe oder?
Wenn ich nicht mit openpyxl sondern mit pandas das ganze öffnen funktioniert es zumindest die Header ausgabe...

Ich nutze das GUI von Spyder aus dem Anaconda Packet...
BlackJack

@123GuteLaune: Dort wird das Tupel aber in einer interaktiven Python-Shell erzeugt, also so dass der Benutzer das Ergebnis davon auch sieht. In Deinem Programm wird es erstellt, aber dann nichts damit gemacht, also macht es dort keinen Sinn.

Spyder könnte das/ein Problem sein. Diese IDE führt Module, die man als Programm ausführt, nicht unabhängig aus, sondern alles was man dort ausführt wird vom ein und dem selben, laufenden Python-Interpreter ausgeführt. Namen die auf Modulebene gebunden werden, stehen auch nach dem Programmablauf noch zur Verfügung. Das heisst der Speicher für diese Objekte wird nicht wieder freigegeben solange man über die IDE noch darauf zugreifen kann. Solange man also Spyder nicht neu startet, oder zumindest den Python-Kernel mit dem alles ausgeführt wird, kann sich ”Datenmüll” ansammeln. Und Programme können auf Namen zugreifen die es nicht geben würde, wenn man sie normal starten würde. Alleine das wäre für mich ein Grund diese IDE nicht für normale Programmentwicklung zu verwenden.

Überprüfen könntest Du das in dem Du das Programm mit dem `MemoryError` mal in einer neu gestarteten Spyder-IDE ausführst, oder am besten ganz ohne IDE. Falls es dann immer noch einen `MemoryError` gibt, wäre der komplette Traceback interessant und falls das keinen Aufschluss gibt, die Exceldatei selbst.
123GuteLaune
User
Beiträge: 27
Registriert: Mittwoch 2. November 2016, 22:35

Vielen Dank fürs helfen

Habs nochmal getestet und wenn ich ganz neu starte bekomme ich andere Fehler und nach dem 2. starten wieder der memory fehler... :shock:

Mit pandas funktioniert alles ich glaub ich lasse die finger von openpyxl! :K

Code: Alles auswählen

import pandas as pd

#Adjustmend of Data for Date funtioniert nicht?
#parsen = lambda x: pd.datetime.strptime(x, '%Y-%m')

#Open new file object
xl = pd.ExcelFile('C:\xxx\Desktop\Methodentest.xlsx')
#parse_dates={'Zeit': ['Jahr', 'Monat']}, index_col = 0,  date_parser=parsen)

#Link to specific sheet
df = xl.parse('Methodentest')

#Narrow the data input
df2 = df[['Jahr', 'Monat', 'Umsatzmenge']]

#Establishment values under the year 2015 
df3 = df2[(df2['Jahr']<2015)]

#Execute gleitender Mittelwert History 36 Month or 36 rows          
moving_avg = pd.rolling_mean(df3["Umsatzmenge"],36)
print (moving_avg.head())

#Create a pandas excel writer
writer = pd.ExcelWriter(r'C:\xxx\Desktop\Methodentest.xlsx', engine='xlsxwriter')

# Convert the dataframe to an XlsxWriter Excel object.
moving_avg.to_frame().to_excel(writer, sheet_name='Methodentest', startcol=12, startrow=38)

# Close the Pandas Excel writer and output the Excel file.
writer.save()
Problem hier ist das beim Speichern der berechneten Werte, werden die alten Werte des Excel-Files gelöscht sowie der Header und der Primarykey wird angezeigt.

Ich will die errechneten Werte nur in eine bestimmte Spalte/zeile speichern, ab ohne den bisherigen Inhalt zu überschreiben. Leider funktioniert das Parsen meiner Monats und Jahreswerte auch nicht, vielleicht kann mir da auch jemand helfen.
Könnte mir hier jemand helfen bei diesen Problemen?
Zuletzt geändert von Anonymous am Dienstag 22. November 2016, 11:55, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@123GuteLaune: Ich denke das was Du im ersten Satz beschreibst liegt an Spyder. Eben weil sich dort Namen und Werte über Programmabläufe hinweg gemerkt werden. Vielleicht solltest Du lieber die Finger von Spyder als von `openpyxl` lassen. ;-)

`ExcelWriter` ist eben genau das was der Name sagt: Etwas zum schreiben von Exceldateien. Man kann damit keine bestehenden verändern.

Du könntest alle Blätter aus dem Dokument laden und dann am Ende auch alle wieder schreiben. Wobei dabei Informationen verloren gehen können.

Ich finde ja den Ansatz das alles über Exceldateien laufen zu lassen schon nicht so wirklich sinnvoll. Oder zumindest viel zu komplex.
123GuteLaune
User
Beiträge: 27
Registriert: Mittwoch 2. November 2016, 22:35

Excel ist nur eine Krücke die in meinen BWLer Kopf besser rein geht als andere Wege...
Ich könnte auch nur auf meine Datenbank in Access zugreifen und alles dort herausziehen und manipulieren und wieder zurückspielen, bloß leider checke ich nicht wie ich das hinkriegen soll :?

Zusätzlich weiß ich nicht wie ich sonst überprüfen kann, ob ich meine mathematischen Modelle richtig anwende (füttern mit den richtigen Werten, Einstellung der parameter usw.). Alles ein bischen trail and error approach von mir bin kein Programmierer oder hab tieferer programmierungserfahrungen... :oops:

Die Umsetzung mit python ist der einzige ansatz, wo alle mathematische methoden abgedeckt werden und spyder ist für mich eine schöne benutzer oberfläche für meinen Code....
ich werde am Ende den Code sowieso nur über python direkt aufrufen, aber bis alles funktioniert wollte ich es so testen...

Ich wusste nicht das der Writer den kompletten Inhalt löscht? FUCK
Ich wollte Ecxel als storage benutzen für meinen Primary key und dann die neuberechneten Werte in die Richtigen zeilen mit dem Primary key packen. Im nächsten Schritt die neuen Daten anhand des Primary key zurückschreiben in meine Access datenbank um eine 1:1 relation zu haben. Aber das funktioniert so anscheinend nicht (Oh gott ich brauch jemand der mir das programmiert sonst wird meine Arbeit niemals fertig... :K )

Was wäre denn ein besserer Ansatz die Werte hardcoden und dann meine Methoden testen und im nächten Schritt die Hardcode-Werte durch Variablen austauschen?
BlackJack

Also Spyder mag eine schöne Oberfläche haben, aber es ist IMHO kein gutes Werkzeug um Programme darin zu schreiben. Eben aus den bereits beschriebenem Verhalten. Solche Werkzeuge sind gut geeignet um explorativ Sachen mit Werten/Daten anzustellen, also zum Beispiel zu erforschen was man mit den Daten machen kann, oder interaktiv Operationen darauf anzuwenden. So etwas wie eine Werkbank mit Daten als Arbeitsmittel und den Funktionen/Methoden von den üblichen mathematischen Bibliotheken als Werkzeuge mit denen man die Daten ”live” bearbeitet.

Das kann Vorarbeit zu einem Programm sein, und man kann Programmteile die man fertig hat damit an verschiedenen Daten ausprobieren und testen, aber zum Entwickeln und Testen des Gesamtprogramms würde ich das nicht verwenden. Denn wenn man erst am Ende merkt das etwas nicht so funktioniert wie in Spyder als Ablaufumgebung muss man in viel mehr Code den oder die Fehler suchen, als wenn man nicht beim Entwickeln eine IDE verwendet die sich beim Ablauf von Programmen nicht so verhält wie das gleiche Programm ohne die IDE.

Muss das Ergebnis denn unbedingt im gleichen Dokument landen wo die Ausgangsdaten herkommen?

Was meinst Du mit Werte hardcoden und später durch Variablen ersetzen? Du schreibst Funktionen und denen ist dann egal wo die Werte herkommen die Du da rein fütterst. Ob die irgendwo als Werte im Quelltext stehen, aus einer Exceltabelle kommen, aus einer SQL-Datenbank, oder einer HDF5-Datei, sollte der/den verarbeitenden Funktionen egal sein. Ebenso was mit den Ergebnissen passiert.

Wenn Du Programme schreibst, dann steht auf Modulebene nur Code der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. Und ”echte” Funktionen bekommen Werte als Argumente übergeben und liefern Ergebnisse als Rückgabewert. Eingabe, Verarbeitung, und Ausgabe sollten nicht gemischt werden. Das sollte in jeweils eigenen Funktionen abgehandelt werden. Denn dann kann man die drei Teilebereiche einfacher Testen und auch austauschen.
123GuteLaune
User
Beiträge: 27
Registriert: Mittwoch 2. November 2016, 22:35

Vielen Dank das du dir soviel Zeit nimmst meine Fragen zu beantworten.
Ich versuche das mit dem __main__ zur berücksichtigen...

Ich schreibe gerade an meiner Masterarbeit und kann die Datenmengen in Excel nicht mehr händeln, geschweigeden das Excel komplizierter mathematische Methoden zur Prognose Berechnung von Nachfragen kennt.

Die Basisdaten kommen aus SAP. Diese Daten waren mehrdimensional zumindest der Extrakt den ich bekommen habe. Aus den Extrakten habe ich dann relationsbasiert 2 dimensionale Daten gemacht und in meine Access-Datenbank geladen. Die Access-Daten würde ich erweitern um meine Methodenergebenisse der Prognose und wieder zurückspielen in Access. Access dient nur als Datenlager und hat eine forumlarbasierte Paramterabfrage (für Endbenutzerbedinung), wo ich dann nur einen Teil der Datenbank durch die Selektion im Formular wieder an Excel übergebe. Gründe für Rückgabe an Excel sind schönere Darstellung, Graphen usw. zu machen. :mrgreen:

Folgende Schritte würde ich gerne Programmieren:
1. Schnittstelle zu Access (habe das mit pyodbc gelöst und funtioniert für die einzele Abfragen) :idea:
2. Eine Schleife programmieren nach gewissen Kritierien für eine dynamische Abfragestringzusammensetzung (Das sind die Scheiben die ich für meine Berechnungen brauche, die Grenzen für die Schleife wollte ich durch einen Excelimport lösen, das iterative von oben nach unten durchgegangen wird und so meinen Stringvariablen zusammensetzt) -> Ich benötige zwei verschachtelte Schleifen für die String zusammensetzung (Eine Innere und eine Äußere Schleife) :cry:
3. Ergebnis der Abfrage soll transformiert werden damit die Prognosemethoden damit rechnen können
4. Programmierung meiner Prognosemethoden (Ich weiß, welche Methoden ich nutzen will, nur weiß ich nicht wie die Daten in diese Methoden eingespielt werden müssen, damit das Ergebnis stimmt) -> Bin mir noch unschlüssig, ob ich gleich alle Methoden berechnen lassen und dann die Ergebnis rückspiele?? :roll:
5. Speicherung der Prognosemethodenergebnisse in richtiger Form, damit die Daten zurückgespielt werden können.
6. Rückspielen der Daten in Access mit den richtigen Relationen

Dieses starre Programm wird etwa eine Million Schleifen durchlaufen, sprich das Ganze wird ne zeitlang brauchen (habe eine kleinere Beispieldatenbank gemacht zum Testen mit Fehlern usw.), aber das ist ok, sprich das Programm muss nicht mege performant sein, da die Schleifen nur einmalig durchlaufen werden, bis sich was an den Basisdaten ändert und das ist max. 1 mal im Jahr. :!:

Nein, die Daten müssen nicht in die gleiche Tabelle gespeichert werden. Ich dachte so könnte ich meine neuen Berechnung gleich mit meinen Importierten Primary Key aus Access verbinden -> gleiche Zeile wie Primary nur andere Spalte. Den Primary Key lass ich mir bei meiner Abfrage mit übergeben und wollte diesen in Excel speichern.

Tut mir leid, wegen meiner Ausdrucksweise. bzgl. Hardcoden und Variablen. Da ich derzeit noch keine Funktion programmierte habe, denen es egal ist woher die Daten kommen, habe ich nur kleine Programmausschnitt die einmalig mit einer festen Abfolge auf Werte zurückgreifen. Ich denk bei mir ist hopfen und malz verloren, weil das wahrscheinlich die absoluten Basics sind... :K
BlackJack

@123GuteLaune: Das klingt alles nach geschlossener Microsoftwelt. Ich denke da solltest Du dann auch mit Microsofttechnologie rangehen. Alleine Access ist ja schon ein Killer. (Relationale) Datenbanken die nicht von SQLAlchemy unterstützt werden, würde ich ja schon von vornherein ausschliessen, weil ich eigentlich immer SQLAlchemy für Datenbankzugriffe verwende. Deine Beschreibung vom zusammensetzen der SQL-Abfrage finde ich in dem Zusammenhang schon gruselig. So etwas würde ich lieber mit einer Bibliothek machen statt auf Zeichenketten mit SQL zu operieren und mir am Ende noch SQL-Injections einzuhandeln.

Ich weiss auch nicht ob ich das mit dem Excel wirklich begriffen habe. Du machst Abfragen und die landen in einer Exceltabelle. Änderst Du in Excel dann noch etwas an den Daten? Bevor sie verarbeitet werden? Und/Oder nachdem sie verarbeitet wurden? Wenn nein, dann verstehe ich diesen Schritt nicht, das ist doch dann einfach nur ein Transport von der Datenbank zu Deiner Verarbeitung und zurück. Ein Transport den man auch durch den direkten Zugriff auf die Datenbank erledigen könnte.
123GuteLaune
User
Beiträge: 27
Registriert: Mittwoch 2. November 2016, 22:35

Leider lässt das UN, wo ich die Arbeit schreibe, nur Excel, Access und Python zu ->Datenschutzgründe
Aber ansich ist die Abfrage sehr einfach, ein Beispiel

Code: Alles auswählen

SELECT Frucht FROM Obstkorb WHERE Grün AND Unverdorben
Der Select-Parameter und From-Parameter bleiben gleich nur die Where Bedingung ändern sich oder sollte sich in der Schleife anpassen.
Für die WHERE (A- Variable) Attribute gilt nur die Regel Grün ist ein Oberattribute von Unverdorben, Weiteres Beispiel

Code: Alles auswählen

 A = [ [Grün[Unverdorben; Schlecht; unreif]; [Blau[Unverdorben1; Schlecht1; unreif1]];Rot[Unverdorben2; Schlecht2; unreif2]]]
Diese Möglichkeiten müssen in zwei Schleife nach einander in einer äußeren Schleife mit Grün und einer Inneren Schleife (Unverdorben usw.) durchlaufen werden.

Die Daten für den Inhalt der Schleifenattribute wollte ich durch eine Excel-Tabelle hochladen, sprich die Möglichen Kombinationen (Die Daten wären auch schon in der Datenbank enthalten, aber ich weiß nicht wie ich an diese infos kommen, da die Spalten näturlich Doppelung haben und ich nicht weiß, wie ich python sag, lade die gesamte Spalte und lösche alle Doppelung raus und dann nutze diesen Inhalt)

Nach dem ein Datensatz ausgewählt wurde in Access und in Python ist wollte ich mir den Primary key mit geben lassen und diesen mit den Werten in Excel speichern. Die Werte wollte ich dann mit verschiedenen Methoden als Basis nehmen für meine Prognose und diese Prognose ebenfalls zurück nach Excel schreiben in eine andere Spalte aber in gleiche Zeile für den Primary key. Danach wollte ich Python sagen schreib mir die Werte zurück in Access, wo der Primary key gleich ist und speichere Ihn in Spalte X.

Aber ich habe gehört das man auch Biblotheken nutzen könnte für solche Fälle, aber da kenn ich das Prinzip nicht?

P.S. Wie viel würde sowas kosten wenn ich jemanden darum beten würde sowas entgeltlich zu Programmieren?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@123GuteLaune: trotz dreimal durchlesen, habe ich immer noch nicht verstanden, welche Struktur Deine Daten haben, welche Operationen Du darauf ausführen willst, warum Du überhaupt Python verwenden willst. Kannst Du nicht alles in Access machen? Nach Excel mußt Du auch nichts exportieren, weil man Accessdaten per Datenquelle einfügen kann.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

was ich überhaupt nicht verstehe ist die Datenstruktur. In SAP ist es "mehrdimensional" (wie viele Dimensionen denn?), die reduzierst es auf zwei in Access, der SQL-Query ist aber total simpel, da sind noch nicht mal Relationen im Spiel.

Wie ich oben schon mal gesagt habe sehe ich - wie Sirius3 auch - keine wirklichen Grund für Python. Oder man macht direkt alles in Python, wenn z.B. Pandas ein gangbarer Weg wäre.

Gruß, noisefloor
123GuteLaune
User
Beiträge: 27
Registriert: Mittwoch 2. November 2016, 22:35

Ich hatte gestern ein Gespräch mit einem Informatiker in Spee.

Folgendes kann ich jetzt sagen:
Ich nutze meine Rechner nur als eine auführende Supertaschenrechner.
Excel-Auslagerung ist nicht nötig und eine Berechnung in Access ist nicht möglich auf Grund der komplexität der Prognose-Methoden (z.B. einen Support-Vektor-Analyse).
Man kann alles nur in Python lösen und Python holt sich den Input aus Access. Eine Rückschreibung der Daten durch meinen Primary Key ist auch möglich.

@Sirius:Was meinst du mit Struktur?
Die Daten sind Umsatzmengen und Umsatzwerte über einen Zeitraum von mehreren Jahren in Monatsscheiben. Auf diese Daten will ich meine Prognosen ausführen.

@noisfloor:
Die Daten in der SAP-Datenbank sind natürlich 2-Dimensional, aber auf diese Daten konnte ich nicht direkt zugreifen (Firmenpolicy). Ich konnte nur mit einem Art Extractor (Analyzer) die Daten aus SAP ziehen. Da immer nur einen bestimmte Sicht (Parametrisierte Abfrage an SAP mit Analyzer) im Extractor angezeigt werden konnte, hätte ich so jede Variante durchgespielt, die mich interresierte, hätte ich das ungefähr 500.000 mal machen müssen. Eine Automatisierung davon war nicht möglich. Deswegen habe ich bestimmte Sichten übereinandergelegt um meine Extraction zu beschleunigen (ca. 30 mal). Dadurch hab ich eine 4-Dimensional Ansicht bekommen
Beispiel:

Code: Alles auswählen

						Umsatzmenge	Umsatzmenge 	...	Umsatz	Umsatz	Umsatz
						Zeit1				Zeit2		Zeit...	Zeit1		Zeit2		Zeit...
Obstkorb     Apfel	Umsatzmenge	Umsatzmenge	...	Umsatz	Umsatz	...
Obstkorb     Banane	Umsatzmenge	Umsatzmenge	...	Umsatz	Umsatz	...
Obstteller     Kiwi	Umsatzmenge	Umsatzmenge	...	Umsatz	Umsatz	...
...
Um meine Berechnung zu machen hab ich die Daten-Struktur so ungeformt um die Daten in Access zu lagern (Access ist nur ein schnelles und riesiges Lager für mich)

Code: Alles auswählen

Obstkorb	Apfel		Zeit1	Umsatzmenge	Umsatz
Obstkorb	Apfel	Zeit2	Umsatzmenge	Umsatz
Obstkorb	Apfel	Zeit...	Umsatzmenge	Umsatz
Obstkorb	Banane		Zeit1	Umsatzmenge	Umsatz
Obstkorb	Banane	Zeit2	Umsatzmenge	Umsatz
Obstkorb	Banane	Zeit...	Umsatzmenge	Umsatz
Obstteller	Apfel		Zeit1	Umsatzmenge	Umsatz
Obstteller	Apfel	Zeit2	Umsatzmenge	Umsatz
Obstteller	Apfel	Zeit...	Umsatzmenge	Umsatz
Ich denke ich werde Pandas nutzen und eine Art Biblothek anlegen die geparst ist, die ich mit meinem Input aus Access fülle. Danach werde ich meine Berechnungen machen und meine neuen Ergebnisse durch einen Update Befehl in Access speichern (Primary key). Danach Speicher leeren...
Die Schleife wird dann 1 Millionmal ausgeführt und fertig... (so der Plan)

Meint Ihr sowas ist möglich?

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

@123GuteLaune: für diese Art Daten eine Datenbank zu benutzen, ist vielleicht nicht die beste Wahl. Du hast ja in Wirklichkeit 3-dimensionale Daten (Art, Zeit, Umsatzmenge/Umsatz). Dafür kennt Excel Pivot-Tabellen.

Wieviele Inputdaten hast Du? Wieviele Analysedaten? Wievieldimensional sind diese Analysedaten? Willst Du auf Inputdaten später noch zugreifen oder nur auf die Analysedaten?
Antworten