def match_wgn(self, prog): if Weather_wgn_cli.select().count() > 0: self.emit_progress(prog, "Matching wgn to weather stations...") with project_base.db.atomic(): for row in Weather_sta_cli.select(): id = closest_lat_lon(project_base.db, "weather_wgn_cli", row.lat, row.lon) row.wgn = id row.save()
def match_to_weather_stations(self, start_prog, total_prog): if Weather_wgn_cli.select().count() > 0: with project_base.db.atomic(): query = Weather_sta_cli.select() records = query.count() i = 1 for row in query: if self.__abort: return prog = round(i * total_prog / records) + start_prog i += 1 if row.lat is not None and row.lon is not None: id = closest_lat_lon(project_base.db, "weather_wgn_cli", row.lat, row.lon) self.emit_progress(prog, "Updating weather station with generator {i}/{total}...".format(i=i, total=records)) row.wgn_id = id row.save()
def create_weather_stations( self, start_prog, total_prog ): # total_prog is the total progress percentage available for this method if self.__abort: return stations = [] query = Weather_wgn_cli.select() records = query.count() i = 1 for row in query: if self.__abort: return lat = row.lat lon = row.lon #name = "w{lat}{lon}".format(lat=abs(round(lat*1000)), lon=abs(round(lon*1000))) name = weather_sta_name(lat, lon) prog = round(i * total_prog / records) + start_prog # self.emit_progress(prog, "Creating weather station {name}...".format(name=name)) try: existing = Weather_sta_cli.get(Weather_sta_cli.name == name) except Weather_sta_cli.DoesNotExist: station = { "name": name, "hmd": None, "pcp": None, "slr": None, "tmp": None, "wnd": None, "wnd_dir": None, "atmo_dep": None, "lat": lat, "lon": lon, "wgn": row.id } stations.append(station) i += 1 db_lib.bulk_insert(project_base.db, Weather_sta_cli, stations)
def add_wgn_stations_db(self, start_prog, total_prog): if self.__abort: return conn = sqlite3.connect(self.wgn_database) conn.row_factory = sqlite3.Row monthly_table = "{}_mon".format(self.wgn_table) if not db_lib.exists_table(conn, self.wgn_table): raise ValueError("Table {table} does not exist in {file}.".format( table=self.wgn_table, file=self.wgn_database)) if not db_lib.exists_table(conn, monthly_table): raise ValueError("Table {table} does not exist in {file}.".format( table=monthly_table, file=self.wgn_database)) if Rout_unit_con.select().count() > 0: coords = Rout_unit_con.select( fn.Min(Rout_unit_con.lat).alias("min_lat"), fn.Max(Rout_unit_con.lat).alias("max_lat"), fn.Min(Rout_unit_con.lon).alias("min_lon"), fn.Max(Rout_unit_con.lon).alias("max_lon")).get() query = "select * from {table_name} where lat between ? and ? and lon between ? and ? order by name".format( table_name=self.wgn_table) tol = 0.5 cursor = conn.cursor().execute( query, (coords.min_lat - tol, coords.max_lat + tol, coords.min_lon - tol, coords.max_lon + tol)) elif Chandeg_con.select().count() > 0: coords = Chandeg_con.select( fn.Min(Chandeg_con.lat).alias("min_lat"), fn.Max(Chandeg_con.lat).alias("max_lat"), fn.Min(Chandeg_con.lon).alias("min_lon"), fn.Max(Chandeg_con.lon).alias("max_lon")).get() query = "select * from {table_name} where lat between ? and ? and lon between ? and ? order by name".format( table_name=self.wgn_table) tol = 0.5 cursor = conn.cursor().execute( query, (coords.min_lat - tol, coords.max_lat + tol, coords.min_lon - tol, coords.max_lon + tol)) else: query = "select * from {table_name} order by name".format( table_name=self.wgn_table) cursor = conn.cursor().execute(query) wgns = [] ids = [] data = cursor.fetchall() records = len(data) #print(records) i = 1 print('\t - Preparing weather generator') for row in data: if self.__abort: return try: existing = Weather_wgn_cli.get( Weather_wgn_cli.name == row['name']) except Weather_wgn_cli.DoesNotExist: prog = round(i * (total_prog / 2) / records) + start_prog # self.emit_progress(prog, "Preparing weather generator {name}...".format(name=row['name'])) i += 1 ids.append(row['id']) wgn = { "id": row['id'], "name": row['name'], "lat": row['lat'], "lon": row['lon'], "elev": row['elev'], "rain_yrs": row['rain_yrs'] } wgns.append(wgn) prog = start_prog if records < 1 else round(i * (total_prog / 2) / records) + start_prog # self.emit_progress(prog, "Inserting {total} weather generators...".format(total=len(ids))) db_lib.bulk_insert(project_base.db, Weather_wgn_cli, wgns) # Chunk the id array so we don't hit the SQLite parameter limit! max_length = 999 id_chunks = [ ids[i:i + max_length] for i in range(0, len(ids), max_length) ] i = 1 start_prog = start_prog + (total_prog / 2) mon_count_query = "select count(*) from {table_name}".format( table_name=monthly_table) total_mon_rows = conn.cursor().execute(mon_count_query).fetchone()[0] current_total = 0 for chunk in id_chunks: monthly_values = [] mon_query = "select * from {table_name} where wgn_id in ({ids})".format( table_name=monthly_table, ids=",".join('?' * len(chunk))) mon_cursor = conn.cursor().execute(mon_query, chunk) mon_data = mon_cursor.fetchall() mon_records = len(mon_data) i = 1 for row in mon_data: if self.__abort: return if i == 1 or (i % 12 == 0): prog = round(i * (total_prog / 2) / mon_records) + start_prog # self.emit_progress(prog, "Preparing monthly values {i}/{total}...".format(i=i, total=mon_records)) i += 1 mon = { "weather_wgn_cli": row['wgn_id'], "month": row['month'], "tmp_max_ave": row['tmp_max_ave'], "tmp_min_ave": row['tmp_min_ave'], "tmp_max_sd": row['tmp_max_sd'], "tmp_min_sd": row['tmp_min_sd'], "pcp_ave": row['pcp_ave'], "pcp_sd": row['pcp_sd'], "pcp_skew": row['pcp_skew'], "wet_dry": row['wet_dry'], "wet_wet": row['wet_wet'], "pcp_days": row['pcp_days'], "pcp_hhr": row['pcp_hhr'], "slr_ave": row['slr_ave'], "dew_ave": row['dew_ave'], "wnd_ave": row['wnd_ave'] } monthly_values.append(mon) prog = round(i * (total_prog / 2) / mon_records) + start_prog current_total = current_total + mon_records # self.emit_progress(prog, "Inserting monthly values {rec}/{total}...".format(rec=current_total, total=total_mon_rows)) db_lib.bulk_insert(project_base.db, Weather_wgn_cli_mon, monthly_values)
def delete_existing(self): Weather_wgn_cli_mon.delete().execute() Weather_wgn_cli.delete().execute()