2017-03-27 1 views
0

Ich habe ein Programm erstellt, das eine .txt-Datei liest, die aus einer Liste von Preisen besteht. Das Programm erstellt eine zweidimensionale Liste zum Speichern der Wochennummer, des Preises und der Änderung der vorherigen Woche. Der Benutzer gibt die gewünschte Start- und Endwoche ein.Falsche Ergebnisse bei dem Versuch, die durchschnittliche Änderungsrate aus einer zweidimensionalen Liste zu ermitteln (aus einer TXT-Datei)

Wenn der Benutzer der Eingabe war die ‚Startwoche‘ als ‚1‘ und die ‚Ende der Woche‘ als ‚6‘: die durchschnittliche Änderung sollte ‚-0,30‘ seine die höchste Veränderung ‚Woche 4‘ sein soll mit einem Wechsel von '2.80' sollte die niedrigste Änderung 'Woche 5' mit einer Änderung von '-4.93' sein

Allerdings sind meine Zahlen völlig falsch.

Hier ist mein Code:

# get two dimensional list 
priceList = [] 

#open the file 
priceFile = open ('MicrosoftPrices.txt', 'r') 

#create variable for start year 
week = 1 
price = float (priceFile.readline()) 

#special case for week 1 

#initialize loop counter 
i = 0 

while price != '': 
    priceList.append ([0,0,0]) 

    priceList [i][0] = week 
    priceList [i][1] = float (price) 

    if week == 1: 
     priceList [i][2] = 0 
    else: 
     priceList[i][2] = ((priceList[i][1] - priceList[i-1][1])/priceList[i-1][1]) 

    #read the next line 
    price = priceFile.readline() 

    #add to the counter 
    i += 1 

    #go to next week 
    week = week + 1 

#initialize start and end weeks 
startWeek = 0 
endWeek = 0 

#define start week validation 
def FirstValidation (startWeek): 

    startWeek = -1 

    while startWeek == -1: 
     startWeek = input ('What week would you like to start with?') 

     try: 
      if startWeek == '': 
       startWeek = 1 
       break 

      startWeek = int (startWeek) 

     except Exception: 
      print ('Year must be a valid integer between 1 and 52') 

     else: 
      if startWeek >= 1 and startWeek <= 52: 
       break 
      else: 
       startWeek = -1 
       print ('ERROR: Week must be a valid integer between 1 and 52! Please try again.') 

    return startWeek 

#define end week validation 
def LastValidation (endWeek): 
    endWeek = -1 

    while endWeek == -1: 
     endWeek = input ('What week would you like to end with?') 

     try: 
      if endWeek == '': 
       endWeek = 52 
       break 

      endWeek = int (endWeek) 

     except Exception: 
      print ('Year must be a valid integer between 1 and 52') 
     else: 
      if endWeek >= startWeek and endWeek <= 52: 
       break 
      else: 
       endWeek = -1 
       print ('ERROR: Week must be a valid integer between 1 and 52! Please try again.') 

    return endWeek 

def main(): 

    #call week validations 
    startWeekVal = FirstValidation ('Start Week') 
    endWeekVal = LastValidation ('End Week') 


    #initialize min and max 
    maxChange = 0 
    minChange = 100 
    maxIndex = 0 
    minIndex = 0 
    total = 0 
    count = 0 

    for j in range (startWeekVal, endWeekVal +1): 
     if priceList [j][2] > maxChange: 
      maxChange = priceList [j][2] 
      maxIndex = j 
     if priceList [j][2] < minChange: 
      minChange = priceList [j][2] 
      minIndex = j 

     #calc average 
     total += priceList [j][2] 
     count += 1 

     #compute average 
     average = total/count 

    print ('Start Week:', startWeekVal) 
    print ('End Week:', endWeekVal) 
    print ('The average change is ', average) 
    print ('The week with the highest change is week' , priceList [maxIndex][0], 'with $', format (maxChange, '.2f')) 
    print ('The week with the lowest change is week' , priceList [minIndex][0], 'with $', format (minChange, '.2f')) 

    #close the file 
    priceFile.close() 

#call main 
main() 

Als Referenz ist hier die .txt-Datei:

52.33 
50.99 
52.29 
55.09 
50.16 
50.50 
51.82 
51.30 
52.03 
53.07 
53.49 
54.21 
55.57 
54.42 
55.65 
51.78 
49.87 
50.39 
51.08 
50.62 
52.32 
51.79 
51.48 
50.13 
49.83 
51.16 
52.30 
53.70 
56.57 
56.68 
57.96 
57.94 
57.62 
58.03 
57.67 
56.21 
57.25 
57.43 
57.60 
57.80 
57.42 
59.66 
59.87 
58.71 
59.02 
60.35 
60.53 
59.25 
61.97 
62.30 
63.24 
62.14 
+0

Sollte nicht der Wechsel zwischen zwei Wochen die Differenz der Werte empfehlen? Warum teilst du dich? –

+0

Sie haben Recht, ich habe das gerade behoben. Ich bekomme jetzt die korrekten Minimal- und Maximalwerte. Immer noch nicht die richtige durchschnittliche Änderungsrate. –

+0

Welchen Wert erhalten Sie für die durchschnittliche Änderungsrate? –

Antwort

1

Dieser Code, denke ich, sollte das tun, was Sie wollen:

# get two dimensional list 
priceList = [] 

#open the file 
priceFile = open ('MicrosoftPrices.txt', 'r') 

#create variable for start year 
week = 1 
price = float (priceFile.readline()) 

#special case for week 1 

#initialize loop counter 
i = 0 

while price != '': 
    priceList.append ([0,0,0]) 

    priceList [i][0] = week 
    priceList [i][1] = float (price) 

    if week == 1: 
     priceList [i][2] = 0 
    else: 
     priceList[i][2] = (priceList[i][1] - priceList[i-1][1]) 

    #read the next line 
    price = priceFile.readline() 

    #add to the counter 
    i += 1 

    #go to next week 
    week = week + 1 

#initialize start and end weeks 
startWeek = 0 
endWeek = 0 

#define start week validation 
def FirstValidation (startWeek): 

    startWeek = -1 

    while startWeek == -1: 
     startWeek = input ('What week would you like to start with?') 

     try: 
      if startWeek == '': 
       startWeek = 1 
       break 

      startWeek = int (startWeek) 

     except Exception: 
      print ('Year must be a valid integer between 1 and 52') 

     else: 
      if startWeek >= 1 and startWeek <= 52: 
       break 
      else: 
       startWeek = -1 
       print ('ERROR: Week must be a valid integer between 1 and 52! Please try again.') 

    return startWeek 

#define end week validation 
def LastValidation (endWeek): 
    endWeek = -1 

    while endWeek == -1: 
     endWeek = input ('What week would you like to end with?') 

     try: 
      if endWeek == '': 
       endWeek = 52 
       break 

      endWeek = int (endWeek) 

     except Exception: 
      print ('Year must be a valid integer between 1 and 52') 
     else: 
      if endWeek >= startWeek and endWeek <= 52: 
       break 
      else: 
       endWeek = -1 
       print ('ERROR: Week must be a valid integer between 1 and 52! Please try again.') 

    return endWeek 

def main(): 

    #call week validations 
    startWeekVal = FirstValidation ('Start Week') 
    endWeekVal = LastValidation ('End Week') 


    #initialize min and max 
    maxChange = 0 
    minChange = 100 
    maxIndex = 0 
    minIndex = 0 
    total = 0 
    count = 0 

    print priceList 

    for j in range (startWeekVal-1, endWeekVal): 
     if priceList [j][2] > maxChange: 
      maxChange = priceList [j][2] 
      maxIndex = j 
     if priceList [j][2] < minChange: 
      minChange = priceList [j][2] 
      minIndex = j 

     #calc average 
     total += priceList [j][2] 
     count += 1 

     #compute average 

    average = total/count 

    print ('Start Week:', startWeekVal) 
    print ('End Week:', endWeekVal) 
    print ('The average change is ', average) 
    print ('The week with the highest change is week' , priceList [maxIndex][0], 'with $', format (maxChange, '.2f')) 
    print ('The week with the lowest change is week' , priceList [minIndex][0], 'with $', format (minChange, '.2f')) 

    #close the file 
    priceFile.close() 

#call main 
main() 

Es gab ein paar Probleme, der Bereich, über den Sie iterierten, wurde um eins erhöht. Das heißt, wenn Sie versuchen würden, eine Startwoche von 1 und eine Endwoche von 2 zu haben, wäre es eigentlich 2 und 3 respektvoll. Dann haben Sie versucht, den Änderungsprozentsatz im dritten Eintrag jedes Unterfelds zu verfolgen und diese dann erneut zu mitteln. Verfolgen Sie stattdessen die Größenänderung im dritten Eintrag und mitteln Sie dann am Ende.

0

würde ich so etwas wie diese

def stats(y, start, stop): 
    maximum = max(y[start, stop]) 
    minimum = min(y[start, stop]) 
    average = sum(y[start, stop])/len(y[start, stop]) 
    return maximum, minimum, average 

with open('prices.txt') as f: 
    l = list(map(float, f.readlines())) 

x = l[0] 
y = [] 
for i in l: 
    y.append(i-x) 
    x=i 

#We now have two lists. l[i] has the price at week i, and 
    #y[i] has the change in price from week i-1 

start_week = int(input("Start Week: ")) -1 
end_week = int(input("End Week: ")) 

maximum, minimum, average = stats(y, start_week, end_week) 

print("Maximum {}".format(maximum)) 
print("Minimum {}".format(minimum)) 
print("Average {}".format(average)) 
Verwandte Themen