Daten aus Ordner ziehen und bearbeiten

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
Basti128
User
Beiträge: 10
Registriert: Mittwoch 26. August 2009, 09:10

Hi,
habe folgendes Problem, habe folgenden Code (ich poste mal alles damit auch nix fehlt):
'''

from GoogleFinance import GoogleFinance
import sys
import datetime
import pytz
import os
import time

def script(j):
# US Eastern time zone
uset = pytz.timezone("US/Eastern")

# google finance account
# for i in range(1,11):


# list of US holidays
# see: http://www.rightline.net/calendar/market-holidays.html
holidays = [datetime.date(2009,1,1),datetime.date(2009,1,19), \
datetime.date(2009,2,16),datetime.date(2009,4,10), \
datetime.date(2009,5,25), datetime.date(2009,7,3), \
datetime.date(2009,9,7), datetime.date(2009,11,26), \
datetime.date(2009,12,25)]

# US markets start and stop times
startTime = datetime.time(9,30)
stopTime = datetime.time(16,00)

# Check that it is trading time
def CheckTime(nowdatetime):
if ((nowdatetime.time() >= startTime) and \
(nowdatetime.time() <= stopTime)) and \
(nowdatetime.date().weekday() <= 4) and \
not (nowdatetime.date() in holidays):
return True
else:
return False

# this loop runs forever
while 1:
# if CheckTime(datetime.datetime.now(uset)):
# time.sleep(30)
for i in range(1,11):
email = '******' + str(i) + '@gmail.com'
password = '******'

dt = str(datetime.datetime.now(uset).date())
path = '' + dt + '/'
if not(os.path.exists(path)):
os.mkdir(path)

# log into Google Finance account and get portfolios
# record the datetime of fetch
# keep trying until there is no error
while 1:
try:
gfi = GoogleFinance(email, password)

# keep fetching data until markets close
# while CheckTime(datetime.datetime.now(uset)):

# get list of portfolios
# keep trying to success
while 1:
try:
pfl_list = gfi.portfolios.get()
except:
pass
else:
break

# loop through all portfolios
for pfl in pfl_list:
for pos in pfl.positions:
filename = path + pos.ticker_id.split(':')[1] + '_' + dt + '.csv'
if not(os.path.exists(filename)):
f = open(filename,'w')
f.write('DateTime,Price\n')
else:
f = open(filename,'a')
f.write(str(pos.updated) + ',' + str(pos.market_value/pos.shares) + '\n')
f.close()

# pause
# time.sleep(120)
except:
pass
else:
break

time.sleep(30)
if __name__ == '__main__':
script(1)


Wie ziehe ich jetzt die Preise meiner Positionen meiner Portfolios aus den Ordnern, in denen sie im obigen Code ja abgespeichert werden, heraus und berechne Bsp den aktuellen oder den Tagesreturn?

Vielen Dank für die Mühe, würde nicht sowas spezielles hier reinposten wenns nicht dringend und wichtig wäre.
Beste Grüße
Basti
Edit (Leonidas): Werbung aus Signatur gelöscht.
problembär

Bitte benutze Code-Tags in Deinem Posting: [code=python ... [/code

Von Python weißt Du wohl nicht viel? Die Einrückungen sind, anders als in anderen Sprachen, von Bedeutung!

Gruß
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

ohne Code-Tags wird die Einrückung 'vernichtet'
the more they change the more they stay the same
Basti128
User
Beiträge: 10
Registriert: Mittwoch 26. August 2009, 09:10

das mit der Einrückung ist mir bekannt, habe nicht aufgepasst sorry

Code: Alles auswählen

'''

from GoogleFinance import GoogleFinance
import sys
import datetime
import pytz
import os
import time

def script(j):
    # US Eastern time zone
        uset = pytz.timezone("US/Eastern")

    # google finance account
#    for i in range(1,11):


    # list of US holidays
    # see: http://www.rightline.net/calendar/market-holidays.html
        holidays = [datetime.date(2009,1,1),datetime.date(2009,1,19), \
                datetime.date(2009,2,16),datetime.date(2009,4,10), \
                datetime.date(2009,5,25), datetime.date(2009,7,3), \
                datetime.date(2009,9,7), datetime.date(2009,11,26), \
                datetime.date(2009,12,25)]

    # US markets start and stop times
        startTime = datetime.time(9,30)
        stopTime = datetime.time(16,00)  
  
    # Check that it is trading time
        def CheckTime(nowdatetime):
            if ((nowdatetime.time() >= startTime) and \
            (nowdatetime.time() <= stopTime)) and \
            (nowdatetime.date().weekday() <= 4) and \
                not (nowdatetime.date() in holidays):
                return True
            else:
                return False
  
    # this loop runs forever
        while 1:
#           if CheckTime(datetime.datetime.now(uset)):
#            time.sleep(30)
            for i in range(1,11):
                email = '******' + str(i) + '@gmail.com'
                password = '******'                            
                    
                dt = str(datetime.datetime.now(uset).date())
                path = '' + dt + '/'  
                if not(os.path.exists(path)):
                    os.mkdir(path)

            # log into Google Finance account and get portfolios
            # record the datetime of fetch
            # keep trying until there is no error
                while 1:
                    try:    
                            gfi = GoogleFinance(email, password)
      
                    # keep fetching data until markets close  
#                        while CheckTime(datetime.datetime.now(uset)):  
                        
                        # get list of portfolios
                        # keep trying to success
                            while 1:
                                try:
                                    pfl_list = gfi.portfolios.get()    
                                except:
                                    pass
                                else:
                                    break    
            
                        # loop through all portfolios
                            for pfl in pfl_list: 
                                for pos in pfl.positions: 
                                    filename = path + pos.ticker_id.split(':')[1] + '_' + dt + '.csv'
                                    if not(os.path.exists(filename)):
                                        f = open(filename,'w')
                                        f.write('DateTime,Price\n')
                                    else:
                                        f = open(filename,'a')
                                    f.write(str(pos.updated) + ',' + str(pos.market_value/pos.shares) + '\n')
                                    f.close()   
                        
                        # pause
#                            time.sleep(120)    
                    except:
                        pass
                    else:
                        break 
            
            time.sleep(30)
if __name__ == '__main__':
    script(1)
weiß jemand wie ich mein oben beschriebenes problem lösen kann?
Edit (Leonidas): Werbung aus Signatur gelöscht.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Für so lange Code-Schnipsel könnte man sich auch überlegen, die in ein Paste-bin auszulagern, z.B. paste.pocoo.org, das hier sehr beliebt ist.

Generell sollte man das Markup setzen -

Code: Alles auswählen

 -  wurde hier ja auch schon genannt. Das Syntax Highlighting hilft doch ungemein.

Bitte schildere Dein Problem doch noch einmal ein wenig präziser. Ich glaube die wenigsten wollen sich in undokumentierten Code einarbeiten, der zudem viele Auskommentierungen enthält, die nicht gerade zur Übersichtlichkeit beitragen.

Schildere doch einfach mal kurz, was Du für Datenstrukturen hast und welche Info da wie drin verpackt ist. Dann poste ggf. einmal den entscheidenen Ausschnitt des Codes oder ein minimales Beispiel, bei dem es hapert.

So bekommst Du sicherlich schneller Hilfe :-)
problembär

Basti128 hat geschrieben:Wie ziehe ich jetzt die Preise meiner Positionen meiner Portfolios aus den Ordnern, in denen sie im obigen Code ja abgespeichert werden, heraus und berechne Bsp den aktuellen oder den Tagesreturn?
Guck doch mal in Deiner Schleife, was so alles in "pfl" ist:

Code: Alles auswählen

for pfl in pfl_list:
    print dir(pfl)
Ebenso in "pos":

Code: Alles auswählen

for pos in pfl.positions:
    print dir(pos)
Gruß
Basti128
User
Beiträge: 10
Registriert: Mittwoch 26. August 2009, 09:10

Hey,
und was bedeutet das dir nach print im code? Ich will das eig nicht "printen", sondern eher einzeln abspeichern oder aufrufen, weil ich damit dann weiterarbeiten will indem ich mithilfe des Preises und des Returns eine Stop-Loss-Funktion berechne.

Ich denke der entscheidene Code-Schnipsel sollte dieser sein:

Code: Alles auswählen

loop through all portfolios
                            for pfl in pfl_list:
                                for pos in pfl.positions:
                                    filename = path + pos.ticker_id.split(':')[1] + '_' + dt + '.csv'
                                    if not(os.path.exists(filename)):
                                        f = open(filename,'w')
                                        f.write('DateTime,Price\n')
                                    else:
                                        f = open(filename,'a')
                                    f.write(str(pos.updated) + ',' + str(pos.market_value/pos.shares) + '\n')
                                    f.close()    
Hier werden die einzelnen Portfolios und Positionen abgefragt und in csv-files abgespeichert. Aber wie komm ich nun an bestimmte Daten in diesen Files heran?Wie rufe ich bspw eine bestimmte Zeile oder Zelle auf?
bzw kann ich statt die Daten in Ordnern abzuspeichern auch einfach 2 Variablen einführen und da die neusten Preise speichern? (sollte gehen, aber ich weiß nicht wie, also schon wie man die Variablen einführt und mit ihnen arbeitet, aber nicht wie man genau die Daten in die Variable "zieht".) Die Daten sind nebenbei immer Paare aus Datum und Preis.
Edit (Leonidas): Werbung aus Signatur gelöscht.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Basti128 hat geschrieben:Hey,
und was bedeutet das dir nach print im code?
Du hättest es einfach ausprobieren können ;-)
Ich will das eig nicht "printen", sondern eher einzeln abspeichern oder aufrufen, weil ich damit dann weiterarbeiten will indem ich mithilfe des Preises und des Returns eine Stop-Loss-Funktion berechne.
Ich glaube das sollte nur ein Hinweis sein, wie man etwas debuggen kann ;-)
Aber wie komm ich nun an bestimmte Daten in diesen Files heran?Wie rufe ich bspw eine bestimmte Zeile oder Zelle auf?
Naja, Du öffnest eine Datei wieder, und iterierst über die Zeilen. Geht mit dem CSV-Modul recht einfach.
bzw kann ich statt die Daten in Ordnern abzuspeichern auch einfach 2 Variablen einführen und da die neusten Preise speichern?
Das sind doch zwei vollkommen lösgelöste Probleme! Ich habe das Gefühl, Du hast einfach viel zu wenig Ahnung von Python und Du beschreibst leider Dein Problem immer noch nicht gut!

Versuche mal diese Fragen zu beantworten:
Wie sehen die Datenstrukturen aus? Sind das Listen, Dictionaries, was anderes? Wo innerhalb der Strukuren sind Infos, die Du benötigst? Was muss gespeichert werden? Wo kommen die Daten her?

Ohne diese Infos kommen wir nicht weiter.
problembär

Basti128 hat geschrieben:Hier werden die einzelnen Portfolios und Positionen abgefragt und in csv-files abgespeichert. Aber wie komm ich nun an bestimmte Daten in diesen Files heran?Wie rufe ich bspw eine bestimmte Zeile oder Zelle auf?
In dem Hauptskript sind die Daten irgendwo in den Objekten "pfl" und "pos".
Mit "dir()" kann man die Namen der Attribute und Methoden eines Objekts abfragen, siehe

Code: Alles auswählen

pydoc dir
Z.B. dürfte "pos.ticker_id" so ein Attributsname sein. Über diesen kann man auf den Wert des Attributs zugreifen.
Ich dachte, Du wolltest das direkt im Hauptskript machen.
Man kann die Daten aber auch aus der geschriebenen Datei wieder herausziehen, entweder ebenfalls im Hauptskript oder mit einem zweiten Skript. Dazu muß man natürlich anders vorgehen (siehe Hyperions Posting). Allgemein, wenn Du z.B. so eine Datei "dat.txt" hast

Code: Alles auswählen

1 2 3 4 5
5 4 3 2 1
könntest Du sie (bei nicht allzu großen Dateien) z.B. so auslesen ("readlines()" ist hier im Forum umstritten):

Code: Alles auswählen

import os

fh = file("dat.txt", "r")
a = fh.readlines()
fh.close()

for i in a:
    print i

    b = i.split(" ")
    print b[2]
Am Ende siehst Du, daß "str.split()" dabei ganz hilfreich sein kann.

Gruß
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

@problembär: du brauchst hier kein "readlines" ;-)

Code: Alles auswählen

with open("dat.txt", "r") as fp:
    for line in fp:
        print line.split()
Das Leben ist wie ein Tennisball.
Antworten