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
def dodaj(s): try: s["id"] = str(gid()) s = Korisnik(**s) return True, None except Exception as e: return False, str(e)
def dodaj(s): try: s["id"] = str(gid()) korisnik = Korisnik(**s) return True, korisnik.id except Exception as e: return False, str(e)
def dodaj(s): try: s["id"] = str(gid()) knjiga = Knjiga(**s) return True, knjiga.id except Exception as e: return False, str(e)
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)
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
def dodaj(s): try: s["id"] = str(gid()) zanr = Zanr(**s) return True, zanr.id except Exception as e: return False, str(e)
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
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
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
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)
def dodaj(s): try: s["id"] = str(gid()) s = Rezultati(**s) return True, None except Exception as e: return False, str(e)
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)
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)
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)
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)
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)
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],