def ucitaj_iznos():
     listaIznosa = []
     start = date.today()
     conn = psycopg2.connect("dbname=Mlprojekt user=Kris password=bbforlife host=localhost")
     for i in range(0,8):
         cur = conn.cursor()
         datum = (start + timedelta(days=i)).strftime('%Y-%m-%d')
         cur.execute("""select sum (iznos_bruto) from predikcije where dan_boravka = %(datum)s and vrsta_sobe like %(A21)s and datum_predikcije = %(datump)s and predikcije = %(otkazana)s
                     union all
                     select sum (iznos_bruto) from predikcije where dan_boravka = %(datum)s and (vrsta_sobe = %(A2)s or vrsta_sobe like %(A2M)s or vrsta_sobe like %(A220)s  or vrsta_sobe like %(A210)s) and datum_predikcije = %(datump)s and predikcije = %(otkazana)s
                     union all
                     select sum (iznos_bruto) from predikcije where dan_boravka = %(datum)s and vrsta_sobe like %(B2)s and datum_predikcije = %(datump)s and predikcije = %(otkazana)s
                     union all
                     select sum (iznos_bruto) from predikcije where dan_boravka = %(datum)s and vrsta_sobe like %(E1)s and datum_predikcije = %(datump)s and predikcije = %(otkazana)s
                     union all
                     select sum (iznos_bruto) from predikcije where dan_boravka = %(datum)s and vrsta_sobe like %(D1)s and datum_predikcije = %(datump)s and predikcije = %(otkazana)s
                     union all
                     select sum (iznos_bruto) from predikcije where dan_boravka = %(datum)s and vrsta_sobe like %(HA)s and datum_predikcije = %(datump)s and predikcije = %(otkazana)s""", {'datum': datum, 'datump': start.strftime('%Y-%m-%d'), 'otkazana': 1 , 'A21':'A21%', 'A2':'A2%', 'A2M':'A2M%', 'A220':'A220%', 'A210':'A210%', 'B2':'B2%', 'E1':'E1%','D1':'D1%','HA':'HA%',})
         podaci = cur.fetchall()
         # pretvori None u nulu
         jed_list = [x[0] for x in podaci]
         jed_list = [0 if v is None else v for v in jed_list]
         zapis = {'datum':datum, 'A21':jed_list[0], 'A2':jed_list[1], 'B2':jed_list[2], 'E1':jed_list[3], 'D1':jed_list[4], 'HA':jed_list[5]}
         print(zapis)
         listaIznosa.append(zapis)
     cur.close()
     conn.close()
     for zapis in listaIznosa:
         zapis['id'] = str(gid())
     return listaIznosa
Exemplo n.º 2
0
 def dodaj(s):
     try:
         s["id"] = str(gid())
         s = Korisnik(**s)
         return True, None
     except Exception as e:
         return False, str(e)
Exemplo n.º 3
0
 def dodaj(s):
     try:
         s["id"] = str(gid())
         korisnik = Korisnik(**s)
         return True, korisnik.id
     except Exception as e:
         return False, str(e)
Exemplo n.º 4
0
 def dodaj(s):
     try:
         s["id"] = str(gid())
         knjiga = Knjiga(**s)
         return True, knjiga.id
     except Exception as e:
         return False, str(e)
Exemplo n.º 5
0
 def dodaj(s):
     try:
         s["id"] = str(gid())
         novi = Profesor(**s)
         return True, novi.id
     except Exception as e:
         return False, str(e)
 def dodaj(s):
     try:
         if id not in s:                          
             s["id"] = str(gid())                
             s = Drzava(**s)                       
             return True, None
     except Exception as e:
         return False, str(e)
Exemplo n.º 7
0
    def dodavanje(novi):
        try:
            novi["id"] = str(gid())
            novi_korisnik = Korisnik(**novi)
            return True, novi_korisnik.id

        except Exception as e:
            return str(e), False
Exemplo n.º 8
0
    def dodaj(s):
        try:
            s["id"] = str(gid())
            zanr = Zanr(**s)
            return True, zanr.id
        except Exception as e:

            return False, str(e)
Exemplo n.º 9
0
    def dodaj_prihod(p):
        try:
            p["id"] = str(gid())
            novi_prihod = Prihod(**p)
            return True, novi_prihod.id

        except Exception as e:
            return str(e), False
Exemplo n.º 10
0
    def dodaj_trosak(t):
        try:
            t["id"] = str(gid())
            novi_trosak = Trosak(**t)
            return True, novi_trosak.id

        except Exception as e:
            return str(e), False
Exemplo n.º 11
0
    def dodaj_izvjesce(i):
        try:
            i["id"] = str(gid())
            novi_izvjesce = Izvjesce(**i)
            return True, novi_izvjesce.id

        except Exception as e:
            return str(e), False
Exemplo n.º 12
0
    def dodaj(s):
        try:
            s["id"] = str(gid())
            stavke = s["stavke"]
            del s["stavke"]  # ne može biti dict/list, mičemo za sada
            s = Ispit(**s)

            # dodaj i stavke sada, i poveži ih na novonastalo zaglavlje
            for stavka in stavke:
                stavka["id"] = str(gid())
                stavka["ispit"] = s
                st = StavkaIspita(**stavka)

            # vraćamo tuple - dvije ili više vrijednosti istovremeno
            return True, None

        except Exception as e:
            return False, str(e)
Exemplo n.º 13
0
    def dodaj(s):
        try:
            s["id"] = str(gid())

            s = Rezultati(**s)

            return True, None

        except Exception as e:
            return False, str(e)
Exemplo n.º 14
0
 def dodaj(s):
     try:
         s["id"] = str(gid())
         if "profesori" in s:
             profesori_kolegija = s["profesori"]
             svi_profesori = list(Profesor[x] for x in profesori_kolegija)
             s["profesori"] = svi_profesori
         kreiran_kolegij = Kolegij(**s)
         return True, kreiran_kolegij.id
     except Exception as e:
         return False, str(e)
Exemplo n.º 15
0
    def dodaj(igraci):
        try:
            for s in igraci:
                s["id"] = str(gid())

                s = Bodovi_igraca(**s)
            o = "Uspjesno"
            return True, o

        except Exception as e:
            return False, str(e)
Exemplo n.º 16
0
 def dodaj(s):
     try:
         s["id"] = str(gid())
         if "timovi" in s:
             timovi_ukup = s["timovi"]
             svi_timovi = list(Tim[x] for x in timovi_ukup)
             s["timovi"] = svi_timovi
         kuglana_nova= Kuglana(**s)
         return True, kuglana_nova.id
     except Exception as e:
         return False, str(e)
Exemplo n.º 17
0
 def dodaj(s):
     try:
         s["id"] = str(gid())
         if "igraci" in s:
             igraci_ukup = s["igraci"]
             svi_igraci = list(Igrac[x] for x in igraci_ukup)
             s["igraci"] = svi_igraci
         kreiran_tim = Tim(**s)
         return True, kreiran_tim.id
     except Exception as e:
         return False, str(e)
Exemplo n.º 18
0
    def dodaj(s):
        try:
            s["id"] = str(gid())
            if "knjige" in s:

                knjige_sve = s["knjige"]
                moja_lista = list(Knjiga[x] for x in knjige_sve)
                s["knjige"] = moja_lista
            lista_knjiga = Lista_Zelja(**s)
            return True, None
        except Exception as e:
            return False, str(e)
Exemplo n.º 19
0
    def dodaj(s):
        try:
            s["id"] = str(gid())
            # provjera dal ima neki kolegij koji je došao i dal uopće postoji??
            # ako postoji, predaj ORM instancu dalje u sloj "model"
            if "kolegiji" in s:
                lista_kolegija = s["kolegiji"]
                lista_instanci = list(Kolegij[x] for x in lista_kolegija)
                s["kolegiji"] = lista_instanci

            # https://pythontips.com/2013/08/04/args-and-kwargs-in-python-explained/

            kreirani_student = Student(**s)
            return True, kreirani_student.id

        except Exception as e:
            return False, str(e)
def spremiRezervacijeZadnja24Sata():
    listaRezervacija = Rezervacije.listaj_po_datumu_kreiranja_zadnja24h_sve()
    conn = psycopg2.connect("dbname=Mlprojekt user=Kris password=bbforlife host=localhost")
    cur = conn.cursor()
    for rez in listaRezervacija:
        if rez['storno'] == "DA":
            rez['storno'] = 1
        else:
            rez['storno'] = 0
    for rez in listaRezervacija:
        dani = pd.date_range(rez['datum_od'], rez['datum_do']-timedelta(days=1), freq='d').strftime('%Y-%m-%d')
        #print(dani)
        lista = dani.tolist()
        brojDana = rez['broj_dana']
        totalIznos = rez['iznos_bruto'] 
        totalNocenja = rez['nocenja']
        totalPansion = rez['cijena_pans_usl']
        del rez['datum_od']
        del rez['datum_do']
        #IZRAČUNAJ VRIJEDNOSTI PO DANU ZA SVAKU REZERVACIJU
        IznosPoDanu = totalIznos / brojDana
        NocenjaPoDanu = totalNocenja / brojDana 
        PansionPoDanu = totalPansion / brojDana
        for dan in lista:
            dan = dt.datetime.strptime(dan, '%Y-%m-%d').date()
            rez['dan_boravka'] = dan
            rez['iznos_bruto'] = IznosPoDanu 
            rez['nocenja'] = NocenjaPoDanu 
            rez['cijena_pans_usl'] = PansionPoDanu 
            rez['mjesec'] = dan.month
            #spremi u bazu
            novi_id = str(gid())
            novi = {"id":novi_id, "id_rezervacije":rez['id'], "sif_hotela":rez['sif_hotela'], "godina":rez['godina'], "sif_rezervacije":rez['sif_rezervacije'], "rbr_stavke":rez['rbr_stavke'], "vrijeme_kreiranje":rez['vrijeme_kreiranje'], "datum_kreiranja":rez['datum_kreiranja'], "broj_dana":rez['broj_dana'], "sif_usluge":rez['sif_usluge'], "status_rezervacije":rez['status_rezervacije'], "datum_do_potvrde_opcije":rez['datum_do_potvrde_opcije'], "sif_drzave":rez['sif_drzave'], "sif_agencije":rez['sif_agencije'], "tip_ro":rez['tip_ro'], "obaveza_akontacije":rez['obaveza_akontacije'], "iznos_akontacije":rez['iznos_akontacije'], "storno":rez['storno'], "vrijeme_storna":rez['vrijeme_storna'], "datum_storna":rez['datum_storna'], "broj_osoba":rez['broj_osoba'], "broj_djece":rez['broj_djece'], "broj_soba":rez['broj_soba'], "nocenja":rez['nocenja'], "jedinice":rez['jedinice'], "cijena_pans_usl":rez['cijena_pans_usl'], "iznos_bruto":rez['iznos_bruto'], "valuta":rez['valuta'], "tecaj":rez['tecaj'], "lead_time_dani":rez['lead_time_dani'], "dat_storna_do_dat_dolaska":rez['dat_storna_do_dat_dolaska'], "tip_garancije":rez['tip_garancije'], "postotak_akontacije":rez['postotak_akontacije'], "mjesec":rez['mjesec'], "godina_rezervacije":rez['godina_rezervacije'], "vrsta_sobe":rez['vrsta_sobe'], "kanal":rez['kanal'], "nacin_rezervacije":rez['nacin_rezervacije'], "vrsta_sobe_naplata":rez['vrsta_sobe_naplata'], "dan_boravka":rez['dan_boravka']}
            sql_insert = """INSERT INTO rezervacijadani(id, id_rezervacije, sif_hotela, godina, sif_rezervacije, rbr_stavke, vrijeme_kreiranje, datum_kreiranja, broj_dana, sif_usluge, status_rezervacije, datum_do_potvrde_opcije, sif_drzave, sif_agencije, tip_ro, obaveza_akontacije, iznos_akontacije, storno, vrijeme_storna, datum_storna, broj_osoba, broj_djece, broj_soba, nocenja, jedinice, cijena_pans_usl, iznos_bruto, valuta, tecaj, lead_time_dani, dat_storna_do_dat_dolaska, tip_garancije, postotak_akontacije, mjesec, godina_rezervacije, vrsta_sobe, kanal, nacin_rezervacije, vrsta_sobe_naplata, dan_boravka) VALUES (%(id)s, %(id_rezervacije)s, %(sif_hotela)s, %(godina)s, %(sif_rezervacije)s, %(rbr_stavke)s, %(vrijeme_kreiranje)s, %(datum_kreiranja)s, %(broj_dana)s, %(sif_usluge)s, %(status_rezervacije)s, %(datum_do_potvrde_opcije)s, %(sif_drzave)s, %(sif_agencije)s, %(tip_ro)s, %(obaveza_akontacije)s, %(iznos_akontacije)s, %(storno)s, %(vrijeme_storna)s, %(datum_storna)s, %(broj_osoba)s, %(broj_djece)s, %(broj_soba)s, %(nocenja)s, %(jedinice)s, %(cijena_pans_usl)s, %(iznos_bruto)s, %(valuta)s, %(tecaj)s, %(lead_time_dani)s, %(dat_storna_do_dat_dolaska)s, %(tip_garancije)s, %(postotak_akontacije)s, %(mjesec)s, %(godina_rezervacije)s, %(vrsta_sobe)s, %(kanal)s, %(nacin_rezervacije)s, %(vrsta_sobe_naplata)s, %(dan_boravka)s)"""
            cur.execute(sql_insert, novi)
    conn.commit()
    print("GOTOVO")
def napravi_predikcije_za_ostale_dane():
    listaZaSpremanje = []

    # KREIRAJ LISTU SA DATUMIMA ZA IDUĆIH 8 DANA OD SUTRA
    sutra = (dt.date.today()) + timedelta(days=1)
    listaDana = []
    for i in range(0, 8):
        datum = sutra + timedelta(days=i)
        listaDana.append(datum)
    lista_br_dana_prije_dolaska = [1, 3, 7]

    # UCITAJ PODATKE IZ DB
    for dan in listaDana:
        listaZaModel = []
        razlika = (dan - (dt.date.today())).days
        listaRezervacija = RezervacijeDani.listaj_rez_za_datum(dan)
        listaPrognoza = VremePrognoze.listaj_prog_za_datum(dan)
        jucer = dan - timedelta(days=1)
        listaPredikcija = Outputi.listaj_pred_za_datum(jucer)
        # izračunaj dodatne stavke poput indexa vrućine za svaki zapis iz liste prognoza
        for stavka in listaPrognoza:
            c1, c2, c3, c4, c5, c6, c7, c8, c9 = -42.379, 2.04901523, 10.14333127, -0.22475541, -6.83783 * 10**-3, -5.481717 * 10**-2, 1.22874 * 10**-3, 8.5282 * 10**-4, -1.99 * 10**-6
            T = (stavka['temp_max'] * 1.8) + 32
            V = stavka['relativna_vlaznost']
            stavka[
                'index_vrucine'] = c1 + c2 * T + c3 * V + c4 * T * V + c5 * T**2 + c6 * V**2 + c7 * T**2 * V + c8 * T * V**2 + c9 * T**2 * V**2

        # PREPROCESIRAJ PODATKE
        for stavka in listaRezervacija:
            if stavka['vrsta_sobe'] == 'S2':
                stavka['vrsta_sobe'] = 'B220'
            if stavka['vrsta_sobe'] == 'DSU' or stavka[
                    'vrsta_sobe'] == 'S1' or stavka['vrsta_sobe'] == 'DSUM':
                stavka['vrsta_sobe'] = 'D1'
            if stavka['vrsta_sobe'] == 'S2':
                stavka['vrsta_sobe'] = 'B220'
            if stavka['vrsta_sobe'] == 'N31' or stavka[
                    'vrsta_sobe'] == 'N41' or stavka[
                        'vrsta_sobe'] == 'APP4' or stavka[
                            'vrsta_sobe'] == 'N52':
                stavka['vrsta_sobe'] = 'HA42M'
            for i in range(len(listaPrognoza)):
                for vrijednost in lista_br_dana_prije_dolaska:
                    if (stavka['dan_boravka']
                            == listaPrognoza[i]['datum']) and (
                                (razlika + vrijednost)
                                == listaPrognoza[i]['preostalo_dana']):
                        stavka[
                            'tlak_zraka' +
                            str(vrijednost)] = listaPrognoza[i]['tlak_zraka']
                        stavka['oblaci_pokrice' + str(
                            vrijednost)] = listaPrognoza[i]['oblaci_pokrice']
                        stavka[
                            'temp_prosjek' +
                            str(vrijednost)] = listaPrognoza[i]['temp_prosjek']
                        stavka['temp_max' +
                               str(vrijednost)] = listaPrognoza[i]['temp_max']
                        stavka['temp_min' +
                               str(vrijednost)] = listaPrognoza[i]['temp_min']
                        stavka['oborine_mogucnost' +
                               str(vrijednost
                                   )] = listaPrognoza[i]['oborine_akumulirano']
                        stavka['brzina_vjetra' + str(
                            vrijednost)] = listaPrognoza[i]['brzina_vjetra']
                        stavka['index_vrucine' + str(
                            vrijednost)] = listaPrognoza[i]['index_vrucine']
                        stavka['prognoza' +
                               str(vrijednost)] = listaPrognoza[i]['prognoza']
            listaZaModel.append(stavka)

        for stavka in listaZaModel:
            stavka['p_tlak_zraka_31'] = stavka['tlak_zraka3'] - stavka[
                'tlak_zraka1']
            stavka['p_tlak_zraka_73'] = stavka['tlak_zraka7'] - stavka[
                'tlak_zraka3']
            stavka['p_temp_min_31'] = stavka['temp_min3'] - stavka['temp_min1']
            stavka['p_temp_min_73'] = stavka['temp_min7'] - stavka['temp_min3']
            stavka['p_temp_max_31'] = stavka['temp_max3'] - stavka['temp_max1']
            stavka['p_temp_max_73'] = stavka['temp_max7'] - stavka['temp_max3']
            stavka['p_oborine_mogucnost31'] = stavka[
                'oborine_mogucnost3'] - stavka['oborine_mogucnost1']
            stavka['p_oborine_mogucnost73'] = stavka[
                'oborine_mogucnost7'] - stavka['oborine_mogucnost3']
            stavka['p_oblaci_pokrice_31'] = stavka['oblaci_pokrice3'] - stavka[
                'oblaci_pokrice1']
            stavka['p_oblaci_pokrice_73'] = stavka['oblaci_pokrice7'] - stavka[
                'oblaci_pokrice3']
            stavka['p_brzina_vjetra_31'] = stavka['brzina_vjetra3'] - stavka[
                'brzina_vjetra1']
            stavka['p_brzina_vjetra_73'] = stavka['brzina_vjetra7'] - stavka[
                'brzina_vjetra3']

        # PROVJERI AKO JE NEKA REZERVACIJA VEĆ KLASIFICIRANA KAO STORNO U PRETHODNOJ PREDIKCIJI I OZNAČI JE SUKLADNO (da se izbjegne slučaj da jedan dan iste rezervacije bude klasificiran kao storno, a drugi ne)
        for stavka in listaZaModel:
            for i in range(len(listaPredikcija)):
                if stavka['sif_rezervacije'] == listaPredikcija[i][
                        'sif_rezervacije']:
                    stavka['storno'] = 1
                else:
                    stavka['storno'] = 0

        dfTotal = pd.DataFrame(listaZaModel)

        # PODIJELI NA STORNO DA/NE, PREMA FILTRIRANJU U PRETHODNOM KORAKU
        dfDA = dfTotal[dfTotal['storno'] == 1]
        df = dfTotal[dfTotal['storno'] == 0]

        # NASTAVI PROCESIRANJE PODATAKA IZ FILTRIRANIH REZERVACIJA
        # ListaSaSiframa, df_danb, df_bruto i df_jed su kreirani za spremanje sa predikcijama u DB
        ListaSaSiframa = df['sif_rezervacije']
        df['dan_boravka'] = pd.to_datetime(df['dan_boravka'])
        df_danb = df['dan_boravka']
        df_jed = df['jedinice']
        df_bruto = df['iznos_bruto']
        df = df.drop(columns=[
            'id', 'id_rezervacije', 'sif_hotela', 'datum_kreiranja',
            'dan_boravka', 'sif_usluge', 'tip_ro', 'broj_osoba', 'broj_djece',
            'cijena_pans_usl', 'godina', 'sif_rezervacije', 'rbr_stavke',
            'vrijeme_kreiranje', 'valuta', 'tecaj', 'vrijeme_storna',
            'sif_agencije', 'lead_time_dani', 'datum_do_potvrde_opcije',
            'mjesec', 'datum_storna', 'vrsta_sobe_naplata', 'index_vrucine3',
            'index_vrucine7', 'godina_rezervacije', 'obaveza_akontacije',
            'sif_drzave'
        ])

        # zamijeni NUll vrijednosti
        df['iznos_akontacije'].fillna(value=0, inplace=True)
        df['tip_garancije'] = df['tip_garancije'].fillna('O')
        df = df.drop(columns=[
            'broj_dana', 'storno', 'postotak_akontacije', 'p_tlak_zraka_31',
            'jedinice', 'iznos_bruto', 'p_tlak_zraka_73', 'p_temp_max_73',
            'p_oborine_mogucnost73', 'p_brzina_vjetra_31',
            'p_oblaci_pokrice_31', 'p_oblaci_pokrice_73', 'iznos_akontacije',
            'nocenja', 'prognoza3', 'prognoza1', 'prognoza7',
            'dat_storna_do_dat_dolaska', 'temp_prosjek3', 'temp_max3',
            'temp_min3', 'brzina_vjetra3', 'tlak_zraka3', 'oblaci_pokrice3',
            'oborine_mogucnost3', 'temp_prosjek7', 'temp_max7', 'temp_min7',
            'brzina_vjetra7', 'tlak_zraka7', 'oblaci_pokrice7',
            'oborine_mogucnost7'
        ],
                     axis='columns')

        # Definicija tipova kolona za daljnje procesiranje
        numericke = [
            'index_vrucine1', 'temp_prosjek1', 'broj_soba', 'temp_max1',
            'temp_min1', 'brzina_vjetra1', 'tlak_zraka1', 'oblaci_pokrice1',
            'oborine_mogucnost1', 'p_temp_min_31', 'p_temp_min_73',
            'p_temp_max_31', 'p_oborine_mogucnost31', 'p_brzina_vjetra_73'
        ]
        kategoricke = [
            'nacin_rezervacije', 'status_rezervacije', 'vrsta_sobe', 'kanal',
            'tip_garancije'
        ]

        # LOAD PIPELINE-A
        PrepPipeline = pickle.load(open('./Pipeline/Pipeline_Total.pkl', 'rb'))
        X_fit = PrepPipeline.transform(df)

        # učitaj model za predikciju
        prag_odluke = 0.609095
        model = pickle.load(open('./Modeli/Model_Final.pkl', 'rb'))
        predikcije = (model.predict_proba(X_fit)[:, 1] >=
                      prag_odluke).astype(int)

        broj_zapisa = predikcije.shape[0]
        lista_id = []
        listaDatuma = []
        for i in range(broj_zapisa):
            i = str(gid())
            lista_id.append(i)

        for i in df_danb:
            i = (datetime.date(i))
            listaDatuma.append(i)

        df_pred = pd.DataFrame(lista_id, columns=['id'])
        df_pred['dan_boravka'] = listaDatuma
        df_pred['sif_rezervacije'] = ListaSaSiframa
        df_pred['vrsta_sobe'] = df['vrsta_sobe']
        df_pred['kanal'] = df['kanal']
        df_pred['jedinice'] = df_jed
        df_pred['iznos_bruto'] = df_bruto
        df_pred['predikcije'] = predikcije
        df_pred['datum_predikcije'] = date.today()

        # PROCESIRAJ I PRIDODAJ OTPRIJE FILTRIRANE ZAPISE KONAČNOM DATASETU ZA UPIS U BAZU
        listaSifriRezervacija = dfDA['sif_rezervacije']
        dfDA = dfDA.drop(columns=[
            'postotak_akontacije', 'id', 'id_rezervacije', 'sif_hotela',
            'sif_usluge', 'tip_ro', 'broj_osoba', 'broj_djece',
            'cijena_pans_usl', 'godina', 'sif_rezervacije', 'rbr_stavke',
            'vrijeme_kreiranje', 'valuta', 'tecaj', 'vrijeme_storna',
            'sif_agencije', 'tip_garancije', 'lead_time_dani',
            'datum_do_potvrde_opcije', 'mjesec', 'datum_storna',
            'vrsta_sobe_naplata', 'index_vrucine1', 'index_vrucine3',
            'index_vrucine7', 'godina_rezervacije', 'obaveza_akontacije',
            'nacin_rezervacije', 'sif_drzave'
        ])
        dfDA['dan_boravka'] = pd.to_datetime(dfDA['dan_boravka'])
        dfDA = dfDA.drop(columns=[
            'datum_kreiranja', 'storno', 'iznos_akontacije', 'nocenja',
            'prognoza3', 'prognoza1', 'prognoza7', 'dat_storna_do_dat_dolaska',
            'temp_prosjek1', 'temp_prosjek3', 'temp_max3', 'temp_min3',
            'brzina_vjetra3', 'tlak_zraka3', 'oblaci_pokrice3',
            'oborine_mogucnost3', 'temp_prosjek7', 'temp_max7', 'temp_min7',
            'brzina_vjetra7', 'tlak_zraka7', 'oblaci_pokrice7',
            'oborine_mogucnost7'
        ],
                         axis='columns')

        listaIdStorna = []
        for i in range(dfDA.shape[0]):
            i = str(gid())
            listaIdStorna.append(i)

        dfDodaj = pd.DataFrame(listaIdStorna, columns=['id'])
        dfDodaj['dan_boravka'] = dfDA['dan_boravka']
        dfDodaj['sif_rezervacije'] = listaSifriRezervacija
        dfDodaj['vrsta_sobe'] = dfDA['vrsta_sobe']
        dfDodaj['kanal'] = dfDA['kanal']
        dfDodaj['jedinice'] = dfDA['jedinice']
        dfDodaj['iznos_bruto'] = dfDA['iznos_bruto']
        dfDodaj['predikcije'] = 1
        dfDodaj['datum_predikcije'] = date.today()

        df_pred = df_pred.append(dfDodaj, ignore_index=True)
        df_pred = df_pred[~(df_pred.isna().any(axis=1))]

        # SPREMI U DB
        listaPredikcija = df_pred.to_dict('records')
        conn = psycopg2.connect(
            ("dbname=Mlprojekt user=Kris password=bbforlife host=localhost"))
        for stavka in listaPredikcija:
            novi = {
                "id": stavka['id'],
                "dan_boravka": stavka['dan_boravka'],
                "sif_rezervacije": stavka['sif_rezervacije'],
                "vrsta_sobe": stavka['vrsta_sobe'],
                "kanal": stavka['kanal'],
                "jedinice": stavka['jedinice'],
                "iznos_bruto": stavka['iznos_bruto'],
                "predikcije": stavka['predikcije'],
                "datum_predikcije": stavka['datum_predikcije']
            }
            cur = conn.cursor()
            cur.execute(
                """INSERT INTO predikcije(id, dan_boravka, sif_rezervacije, vrsta_sobe, kanal, jedinice, iznos_bruto, predikcije, datum_predikcije) 
                        VALUES (%(id)s, %(dan_boravka)s, %(sif_rezervacije)s, %(vrsta_sobe)s, %(kanal)s, %(jedinice)s, %(iznos_bruto)s, %(predikcije)s,
                        %(datum_predikcije)s)""", novi)
            conn.commit()

    print("predikcije uspješno ubačene")
def spremi_prognozu_u_bazu():
    url = 'https://api.weatherbit.io/v2.0/forecast/daily?city=vrsar&country=hr&key=6517f6215ddb471da8a1f03a55fe694a'
    json_data = requests.get(url).json()
    dataframe = pd.DataFrame(json_data['data'])
    #izbaci weather////////////////////////////////////////////
    dataframe2 = dataframe.drop('weather', 1)
    #kreiraj novi df iz liste samo s weather kolonama//////////
    dataframe3 = pd.DataFrame((dataframe['weather']).tolist())
    #kreiraj novi df samo s description kolonom///////////////////
    dataframe4 = dataframe3['description']
    #makni kolone koje ne trebamo !!!!!!!!!!
    dataframe2 = dataframe.drop(columns=[
        'moonrise_ts', 'wind_cdir', 'high_temp', 'sunset_ts', 'ozone',
        'moon_phase', 'ts', 'sunrise_ts', 'app_min_temp', 'pop',
        'wind_cdir_full', 'slp', 'moon_phase_lunation', 'app_max_temp', 'snow',
        'max_dhi', 'clouds_hi', 'low_temp', 'moonset_ts', 'datetime',
        'clouds_mid', 'clouds_low'
    ])
    dataframe2['forecast_date'] = dt.datetime.now().strftime('%Y-%m-%d')
    #pravilni redoslijed kolona
    dataframe2 = dataframe2[[
        'valid_date', 'forecast_date', 'temp', 'max_temp', 'min_temp', 'vis',
        'wind_dir', 'wind_spd', 'wind_gust_spd', 'rh', 'pres', 'uv', 'clouds',
        'precip', 'snow_depth', 'dewpt'
    ]]
    #dodaj kolonu description kao dodatnu kolonu u df2//////
    dataframe2['Weather'] = dataframe4
    #nova kolona za broj dana između dana prognoze i dana za koji je prognoza napravljena
    dataframe2['preostalo_dana'] = ""

    #DATAFRAME U LISTU i INSERT PROGNOZE ZA 16 DANA OD DANAS
    lista2 = dataframe2.values.tolist()
    # ubaci vrijednosti u novu kolonu
    for a in lista2:
        a[17] = ((datetime.strptime(a[0], '%Y-%m-%d')) -
                 (datetime.strptime(a[1], '%Y-%m-%d'))).days

    #spremi u DB
    conn = psycopg2.connect(
        "dbname=Mlprojekt user=Kris password=bbforlife host=localhost")
    for stavka in lista2:
        novi_id = str(gid())
        novi = {
            "id": novi_id,
            "datum": stavka[0],
            "datum_prognoze": stavka[1],
            "temp_prosjek": stavka[2],
            "temp_max": stavka[3],
            "temp_min": stavka[4],
            "vidljivost": stavka[5],
            "smjer_vjetra_stupnjevi": stavka[6],
            "brzina_vjetra": stavka[7],
            "nalet_vjetra_brzina": stavka[8],
            "relativna_vlaznost": stavka[9],
            "tlak_zraka": stavka[10],
            "uv_index": stavka[11],
            "oblaci_pokrice": stavka[12],
            "oborine_akumulirano": stavka[13],
            "dubina_snijega": stavka[14],
            "rosa_prosjek": stavka[15],
            "prognoza": stavka[16],
            "preostalo_dana": stavka[17]
        }
        print(novi)
        conn = psycopg2.connect(
            "dbname=Mlprojekt user=Kris password=bbforlife host=localhost")
        cur = conn.cursor()
        cur.execute(
            """INSERT INTO vremeprognoza(id, datum, datum_prognoze, temp_prosjek, temp_max, temp_min, vidljivost, smjer_vjetra_stupnjevi, brzina_vjetra, nalet_vjetra_brzina, relativna_vlaznost, tlak_zraka, uv_index, oblaci_pokrice, oborine_akumulirano, dubina_snijega, rosa_prosjek, prognoza, preostalo_dana) VALUES (%(id)s, %(datum)s, %(datum_prognoze)s, %(temp_prosjek)s, %(temp_max)s, %(temp_min)s, %(vidljivost)s, %(smjer_vjetra_stupnjevi)s, %(brzina_vjetra)s, %(nalet_vjetra_brzina)s, %(relativna_vlaznost)s, %(tlak_zraka)s, %(uv_index)s, %(oblaci_pokrice)s, %(oborine_akumulirano)s, %(dubina_snijega)s, %(rosa_prosjek)s, %(prognoza)s, %(preostalo_dana)s)""",
            novi)
        conn.commit()
    print("nova prognoza uspješno ubačena")
def napravi_predikcije_za_danas():
    listaRezervacija = RezervacijeDani.listaj_rez_za_danas()
    listaPrognoza = VremePrognoze.listaj_prog_za_danas()

    # izračunaj dodatne stavke poput indexa vrućine za svaki zapis iz liste prognoza
    for stavka in listaPrognoza:
        # konstante indexa vrućine (°F)
        c1, c2, c3, c4, c5, c6, c7, c8, c9 = -42.379, 2.04901523, 10.14333127, -0.22475541, -6.83783 * 10**-3, -5.481717 * 10**-2, 1.22874 * 10**-3, 8.5282 * 10**-4, -1.99 * 10**-6
        T = (stavka['temp_max'] * 1.8) + 32
        V = stavka['relativna_vlaznost']
        stavka[
            'index_vrucine'] = c1 + c2 * T + c3 * V + c4 * T * V + c5 * T**2 + c6 * V**2 + c7 * T**2 * V + c8 * T * V**2 + c9 * T**2 * V**2

    listaZaModel = []

    # SPOJI REZERVACIJE PO DATUMU S ODGOVARAJUĆIM PROGNOZAMA 1, 3 I 7 DANA PRIJE TOG DATUMA
    danas = dt.date.today()
    lista_br_dana_prije_dolaska = [1, 3, 7]

    for stavka in listaRezervacija:
        if stavka['vrsta_sobe'] == 'S2':
            stavka['vrsta_sobe'] = 'B220'
        if stavka['vrsta_sobe'] == 'DSU' or stavka[
                'vrsta_sobe'] == 'S1' or stavka['vrsta_sobe'] == 'DSUM':
            stavka['vrsta_sobe'] = 'D1'
        if stavka['vrsta_sobe'] == 'S2':
            stavka['vrsta_sobe'] = 'B220'
        if stavka['vrsta_sobe'] == 'N31' or stavka[
                'vrsta_sobe'] == 'N41' or stavka[
                    'vrsta_sobe'] == 'APP4' or stavka['vrsta_sobe'] == 'N52':
            stavka['vrsta_sobe'] = 'HA42M'
        for i in range(len(listaPrognoza)):
            for vrijednost in lista_br_dana_prije_dolaska:
                if vrijednost == listaPrognoza[i]['preostalo_dana']:
                    stavka['tlak_zraka' +
                           str(vrijednost)] = listaPrognoza[i]['tlak_zraka']
                    stavka[
                        'oblaci_pokrice' +
                        str(vrijednost)] = listaPrognoza[i]['oblaci_pokrice']
                    stavka['temp_prosjek' +
                           str(vrijednost)] = listaPrognoza[i]['temp_prosjek']
                    stavka['temp_max' +
                           str(vrijednost)] = listaPrognoza[i]['temp_max']
                    stavka['temp_min' +
                           str(vrijednost)] = listaPrognoza[i]['temp_min']
                    stavka['oborine_mogucnost' + str(
                        vrijednost)] = listaPrognoza[i]['oborine_akumulirano']
                    stavka['brzina_vjetra' +
                           str(vrijednost)] = listaPrognoza[i]['brzina_vjetra']
                    stavka['index_vrucine' +
                           str(vrijednost)] = listaPrognoza[i]['index_vrucine']
                    stavka['prognoza' +
                           str(vrijednost)] = listaPrognoza[i]['prognoza']
                    listaZaModel.append(stavka)

    for stavka in listaZaModel:
        stavka[
            'p_tlak_zraka_31'] = stavka['tlak_zraka3'] - stavka['tlak_zraka1']
        stavka[
            'p_tlak_zraka_73'] = stavka['tlak_zraka7'] - stavka['tlak_zraka3']
        stavka['p_temp_min_31'] = stavka['temp_min3'] - stavka['temp_min1']
        stavka['p_temp_min_73'] = stavka['temp_min7'] - stavka['temp_min3']
        stavka['p_temp_max_31'] = stavka['temp_max3'] - stavka['temp_max1']
        stavka['p_temp_max_73'] = stavka['temp_max7'] - stavka['temp_max3']
        stavka['p_oborine_mogucnost31'] = stavka[
            'oborine_mogucnost3'] - stavka['oborine_mogucnost1']
        stavka['p_oborine_mogucnost73'] = stavka[
            'oborine_mogucnost7'] - stavka['oborine_mogucnost3']
        stavka['p_oblaci_pokrice_31'] = stavka['oblaci_pokrice3'] - stavka[
            'oblaci_pokrice1']
        stavka['p_oblaci_pokrice_73'] = stavka['oblaci_pokrice7'] - stavka[
            'oblaci_pokrice3']
        stavka['p_brzina_vjetra_31'] = stavka['brzina_vjetra3'] - stavka[
            'brzina_vjetra1']
        stavka['p_brzina_vjetra_73'] = stavka['brzina_vjetra7'] - stavka[
            'brzina_vjetra3']

    df = pd.DataFrame(listaZaModel)

    # ListaSaSiframa, df_danb, df_bruto i df_jed su kreirani za spremanje sa predikcijama u DB
    ListaSaSiframa = df['sif_rezervacije']
    df['dan_boravka'] = pd.to_datetime(df['dan_boravka'])
    df_danb = df['dan_boravka']
    df_jed = df['jedinice']
    df_bruto = df['iznos_bruto']
    df = df.drop(columns=[
        'id', 'id_rezervacije', 'sif_hotela', 'datum_kreiranja', 'dan_boravka',
        'sif_usluge', 'tip_ro', 'broj_osoba', 'broj_djece', 'cijena_pans_usl',
        'godina', 'sif_rezervacije', 'rbr_stavke', 'vrijeme_kreiranje',
        'valuta', 'tecaj', 'vrijeme_storna', 'sif_agencije', 'lead_time_dani',
        'datum_do_potvrde_opcije', 'mjesec', 'datum_storna',
        'vrsta_sobe_naplata', 'index_vrucine3', 'index_vrucine7',
        'godina_rezervacije', 'obaveza_akontacije', 'sif_drzave'
    ])

    # NUll vrijednosti zamijeni nulom u kolonama
    df['iznos_akontacije'].fillna(value=0, inplace=True)

    # makni ostale suvišne kolone
    df = df.drop(columns=[
        'broj_dana', 'storno', 'postotak_akontacije', 'p_tlak_zraka_31',
        'jedinice', 'p_tlak_zraka_73', 'p_temp_max_73',
        'p_oborine_mogucnost73', 'p_brzina_vjetra_31', 'p_oblaci_pokrice_31',
        'p_oblaci_pokrice_73', 'iznos_akontacije', 'nocenja', 'prognoza3',
        'prognoza1', 'prognoza7', 'dat_storna_do_dat_dolaska', 'temp_prosjek3',
        'temp_max3', 'temp_min3', 'brzina_vjetra3', 'tlak_zraka3',
        'oblaci_pokrice3', 'oborine_mogucnost3', 'temp_prosjek7', 'temp_max7',
        'temp_min7', 'brzina_vjetra7', 'tlak_zraka7', 'oblaci_pokrice7',
        'oborine_mogucnost7'
    ],
                 axis='columns')
    df['tip_garancije'] = df['tip_garancije'].fillna('O')

    # Definicija tipova kolona za daljnje procesiranje
    numericke = [
        'index_vrucine1', 'temp_prosjek1', 'broj_soba', 'temp_max1',
        'temp_min1', 'brzina_vjetra1', 'tlak_zraka1', 'oblaci_pokrice1',
        'oborine_mogucnost1', 'p_temp_min_31', 'p_temp_min_73',
        'p_temp_max_31', 'p_oborine_mogucnost31', 'p_brzina_vjetra_73'
    ]
    kategoricke = [
        'nacin_rezervacije', 'status_rezervacije', 'vrsta_sobe', 'kanal',
        'tip_garancije'
    ]

    # LOAD PIPELINE-A
    PrepPipeline = pickle.load(open('./Pipeline/Pipeline_Total.pkl', 'rb'))
    X_fit = PrepPipeline.transform(df)

    # učitaj model za predikciju
    prag_odluke = 0.609095
    model = pickle.load(open('./Modeli/Model_Final.pkl', 'rb'))
    predikcije = (model.predict_proba(X_fit)[:, 1] >= prag_odluke).astype(int)

    broj_zapisa = predikcije.shape[0]
    lista_id = []
    listaDatuma = []
    for i in range(broj_zapisa):
        i = str(gid())
        lista_id.append(i)

    # spremi excelicu sa predikcijama
    for i in df_danb:
        i = (datetime.date(i))
        listaDatuma.append(i)

    df_pred = pd.DataFrame(lista_id, columns=['id'])
    df_pred['dan_boravka'] = listaDatuma
    df_pred['sif_rezervacije'] = ListaSaSiframa
    df_pred['vrsta_sobe'] = df['vrsta_sobe']
    df_pred['kanal'] = df['kanal']
    df_pred['jedinice'] = df_jed
    df_pred['iznos_bruto'] = df_bruto
    df_pred['predikcije'] = predikcije
    df_pred['datum_predikcije'] = date.today()

    # df_pred.to_excel('./Excelice/Predikcije/Predikcije' + str(date.today()) + '.xlsx')
    #listaPredikcija = df_pred.to_numpy()
    listaPredikcija = df_pred.to_dict('records')
    print(listaPredikcija[0])

    # SPREMI U DB
    conn = psycopg2.connect(
        "dbname=Mlprojekt user=Kris password=bbforlife host=localhost")
    for stavka in listaPredikcija:
        novi = {
            "id": stavka['id'],
            "dan_boravka": stavka['dan_boravka'],
            "sif_rezervacije": stavka['sif_rezervacije'],
            "vrsta_sobe": stavka['vrsta_sobe'],
            "kanal": stavka['kanal'],
            "jedinice": stavka['jedinice'],
            "iznos_bruto": stavka['iznos_bruto'],
            "predikcije": stavka['predikcije'],
            "datum_predikcije": stavka['datum_predikcije']
        }
        cur = conn.cursor()
        cur.execute(
            """INSERT INTO predikcije(id, dan_boravka, sif_rezervacije, vrsta_sobe, kanal, jedinice, iznos_bruto, predikcije, datum_predikcije) VALUES (%(id)s, %(dan_boravka)s, %(sif_rezervacije)s, %(vrsta_sobe)s, %(kanal)s, %(jedinice)s, %(iznos_bruto)s, %(predikcije)s, %(datum_predikcije)s)""",
            novi)
        conn.commit()
    print("nova predikcija uspješno ubačena")
                   sep=None,
                   header=0,
                   engine='python')
#spremi u listu i DB
lista = data.values.tolist()

conn = psycopg2.connect(
    "dbname=Mlprojekt user=Kris password=bbforlife host=localhost")
cur = conn.cursor()

for stavka in lista:
    for i in range(39):
        if type(stavka[i]) == pd._libs.tslibs.nattype.NaTType or pd.isna(
                stavka[i]) == 1:
            stavka[i] = None
    novi_id = str(gid())
    novi = {
        "id": novi_id,
        "sif_hotela": stavka[0],
        "godina": stavka[1],
        "sif_rezervacije": stavka[2],
        "rbr_stavke": stavka[3],
        "vrijeme_kreiranje": stavka[4],
        "datum_kreiranja": stavka[5],
        "datum_od": stavka[6],
        "datum_do": stavka[7],
        "broj_dana": stavka[8],
        "sif_usluge": stavka[9],
        "status_rezervacije": stavka[10],
        "datum_do_potvrde_opcije": stavka[11],
        "sif_drzave": stavka[12],