1. Napiši funkcijo min_leto(meritve), ki prejme meritve, kakršne vrne funkcija preberi_meritve (s prejšnji vaj) ter vrne prvo polno leto obratovanja postaje. Če začne postaja obratovati 1. januarja 1953, vrne 1953. Če začne obratovati 3. februarja 1953, pa vrne 1953.
Rešitev
def min_leto(meritve):
    najmanjse_leto = float("inf")
    for leto, _, _ in meritve:
        if leto < najmanjse_leto:
            najmanjse_leto = leto
    return najmanjse_leto
  1. Napiši funkcijo mesecno_povprecje(leto, mesec, meritve), ki vrne povprečno mesečno temperaturo za podani mesec in leto. Če za ta mesec in leto ni meritev, naj vrne None.
Rešitev
def mesecno_povprecje(leto, mesec, meritve):
    temperature = []
    for dan in range(1, 32):
        datum = (leto, mesec, dan)
        if datum in meritve:
            temperature.append(meritve[datum])
    if temperature: 
        return sum(temperature) / len(temperature)
    else:
        return None
  1. Napiši funkcijo izpis_povprecij(meritve), ki prejme meritve in izpiše
1992/01:  7.42 *******
1992/02:  9.80 **********
1992/03: 12.82 *************
1992/04: 17.16 *****************
1992/05: 23.84 ************************
1992/06: 24.43 ************************
1992/07: 28.21 ****************************
1992/08: 31.73 ********************************
1992/09: 24.28 ************************
1992/10: 16.72 *****************
1992/11: 13.35 *************
1992/12:  8.72 *********

1993/01:  7.09 *******
1993/02: 10.79 ***********
1993/03: 12.79 *************
1993/04: 17.87 ******************
1993/05: 24.85 *************************
1993/06: 26.17 **************************
1993/07: 27.31 ***************************
1993/08: 30.06 ******************************
1993/09: 21.78 **********************
1993/10: 18.01 ******************
1993/11: 10.11 **********
1993/12:  9.40 *********

1994/01: 10.46 **********
1994/02:  8.65 *********
1994/03: 16.29 ****************
1994/04: 16.89 *****************
1994/05: 21.67 **********************
1994/06: 26.35 **************************
1994/07: 31.62 ********************************
1994/08: 30.73 *******************************
1994/09: 24.39 ************************
1994/10: 17.74 ******************
1994/11: 14.87 ***************
1994/12:  9.07 *********

... in tako naprej

za vsa leta, odkar deluje postaja. Številke so povprečne temperature za te mesece v tem letu. Zvezdic je toliko, kolikor je zaokrožena povprečna temperatura. (Funkcija round(x) zaokroži x na nabližje celo število. Če je x float, bo rezultat je še vedno float; če potrebujemo int, pišemo int(round(x)).)

Rešitev
def izpis_povprecij(meritve):
    zacetno_leto = min_leto(meritve)
    for leto in range(zacetno_leto, 2023):
        for mesec in range(1, 13):
            povprecje = mesecno_povprecje(leto, mesec, meritve)
            if povprecje is not None:
                zvezdice = "*" * round(povprecje)
                print(f"{leto}/{mesec:02}: {povprecje:5.2f} {zvezdice}")
        print()
  1. Napiši funkcijo mesecna_povprecja(meritve), ki izračuna dolgoletne povprečne mesečne temperature. Konkretno, funkcija naj izračuna povprečje prek vseh temperatur, ki jih za leta delovanja postaje vrača prej napisana funkcija mesecno_povprecje.
Rešitev
def mesecna_povprecja(meritve):
    povprecja = {}
    najmanjse_leto = min_leto(meritve)
    for mesec in range(1, 13):
        povprecja_mesec = []
        for leto in range(najmanjse_leto, 2023):
            povprecje = mesecno_povprecje(leto, mesec, meritve)
            if povprecje is not None:
                povprecja_mesec.append(povprecje)
        povprecja[mesec] = sum(povprecja_mesec) / len(povprecja_mesec)
    return povprecja
  1. Napiši funkcijo izpis_sprememb(meritve), ki ima podoben izpis kot izpis_povprecij, vendar doda "stolpec", iz katerega je razvidno, za koliko je izpisano povprečje večje ali manjše od dolgoletnega.
2022/01:    9.66 (+1.34)   **********
2022/02:   12.22 (+2.00)   ************
2022/03:   15.02 (+0.78)   ***************
2022/04:   17.68 (-0.81)   ******************
2022/05:   25.60 (+2.46)   **************************
2022/06:   31.01 (+3.71)   *******************************
2022/07:   33.74 (+3.99)   **********************************
2022/08:   31.93 (+2.14)   ********************************
2022/09:   24.17 (+0.37)   ************************
2022/10:   23.16 (+4.05)   ***********************
2022/11:   15.03 (+1.36)   ***************
2022/12:    9.45 (+0.25)   *********

Kako dodati tisti + ali -, najdeš v opisu minijezika za oblikovanje nizov.

Rešitev
def izpis_sprememb(meritve):
    zacetno_leto = min_leto(meritve)
    poprecja_meseci = mesecna_povprecja(meritve)
    for leto in range(zacetno_leto, 2023):
        for mesec in range(1, 13):
            povprecje = mesecno_povprecje(leto, mesec, meritve)
            if povprecje is not None:
                zvezdice = "*" * round(povprecje)
                odklon = povprecje - poprecja_meseci[mesec]
                print(f"{leto}/{mesec:02}:  {povprecje:5.2f} ({odklon:+.2f})  {zvezdice}")
        print()
  1. Napiši funkcijo zadnjih_10(ime_datoteke, meritve), ki v datoteko s podanim imenom zapiše povprečne mesečne (vrstice) temperature za zadnjih deset let (stolpci). Datoteka mora biti takšne oblike:
,2012,2013,2014,2015,2016,2017,2018,2019,2020,2021,2022
1,8.72,8.32,10.68,9.96,8.32,6.38,10.20,7.85,10.70,8.09,9.66
2,6.99,8.36,12.13,10.29,11.23,10.90,7.24,13.85,13.25,11.87,12.22
3,18.71,11.02,17.19,15.00,14.18,17.53,11.32,16.90,14.46,14.83,15.02
4,17.21,18.73,19.80,18.51,19.20,23.14,21.72,18.37,21.01,16.46,17.68
5,23.24,20.74,22.25,23.26,22.49,,25.73,18.93,22.95,20.74,25.60
6,27.77,26.92,27.53,28.10,26.52,,28.09,31.03,25.71,29.59,31.01
7,30.68,32.12,27.45,32.14,30.98,30.28,30.73,30.91,29.49,30.80,33.74
8,32.14,31.06,26.83,30.65,29.71,32.21,32.19,31.01,30.19,29.95,31.93
9,25.43,24.33,23.50,24.22,27.22,21.54,26.93,8.49,25.99,26.61,24.17
10,19.26,18.85,20.39,18.66,17.92,19.71,21.52,20.59,18.90,18.75,23.16
11,14.74,13.94,15.79,14.29,13.39,13.58,14.62,14.90,14.61,14.01,15.03
12,8.13,11.25,9.61,10.46,11.65,8.92,9.54,11.38,10.08,9.32,9.45
Rešitev
def zadnjih_10(ime_datoteke, meritve):
    datoteka = open(ime_datoteke, "w")
    # pripravimo in zapisemo prvo vrstico z leti
    leta = [""]
    for leto in range(2012, 2023):
        leta.append(str(leto))
    datoteka.write(",".join(leta) + "\n")

    # pripravimo in zapisemo podatke
    for mesec in range(1, 13):
        povprecja = [str(mesec)]
        for leto in range(2012, 2023):
            povprecja.append(f"{mesecno_povprecje(leto, mesec, meritve):.2f}")
        datoteka.write(",".join(povprecja) + "\n")
        
    datoteka.close()

Datoteko lahko uvoziš v Excel in narišeš kakšen graf. (Ne vem, kaj je s septembrom 2019. Lahko odkriješ in poročaš.)

Последна промена: среда, 13 ноември 2024, 17:13