import io import pandas as pd import geopandas import mercury as mr import matplotlib.pyplot as plt import contextily as cx import numpy as np def adjust_coordinates(row): row.lat += np.random.normal(0, 2e-2) row.lon += np.random.normal(0, 2e-2) return row def load_data(): df_receiver = pd.read_csv("../receiver.csv", encoding="latin-1", delimiter=";") df_fishes = pd.read_excel("../20230310_Receiver_Polen.xlsx") df_stoer_ids = pd.read_excel("../20230310_Receiver_Polen.xlsx", sheet_name = "eingesetzte Akustik-Tags") df_fishes_vemco = pd.read_excel("../Daten Vemco Receiver.xlsx", decimal=',').copy() #df_stoer_ids_vemco = pd.read_excel("Daten Vemco Receiver.xlsx",) #sheet_name = "eingesetzte Akustik-Tags") df_fishes_vemco = df_fishes_vemco.drop(columns=["Longitude", "Latitude"]) df_receiver_vemco = pd.read_csv("../Sturgeons.txt", delimiter=",").copy() df_fishes_vemco_m = pd.merge(left=df_fishes_vemco, right=df_receiver_vemco, how="left", on="Receiver", suffixes=("", "_y")) receiver = df_receiver.copy() receiver_vemco = df_receiver_vemco.copy() receiver_formatted = receiver_vemco.rename(columns={ "Receiver" : "receiver_sn", "Latitude": "lat", "Longitude": "lon", "Station.name" : "station_name"})[["receiver_sn", "lat", "lon", "station_name"]] all_receivers = pd.concat([receiver, receiver_formatted]) fishes = df_fishes.copy() fishes = fishes.loc[fishes[" ID"].isin(df_stoer_ids["ID"])] fishes = fishes.rename(columns={" Receiver":"receiver_sn"}) fishes = pd.merge(fishes, all_receivers[["lon", "lat", "receiver_sn"]], on="receiver_sn", how="left") df_fishes_vemco_form = df_fishes_vemco_m.drop(columns="ID") df_fishes_vemco_form = df_fishes_vemco_form.rename(columns={"Date.and.Time.nocor": "Date and Time (UTC)", "Longitude" : "lon", "Latitude": "lat", "Transmitter": " ID", "Receiver" : "receiver_sn" }) all_fishes = pd.concat([fishes, df_fishes_vemco_form]) all_fishes = all_fishes.drop_duplicates([" ID", "receiver_sn"]).reset_index().drop(columns="index") all_fishes.index = list(all_fishes.index) all_fishes = all_fishes.apply(adjust_coordinates, axis=1) gdf_fishes = geopandas.GeoDataFrame( all_fishes, geometry=geopandas.points_from_xy( all_fishes.lon, all_fishes.lat), crs = 4326) receiver_vemco = df_receiver_vemco.copy() df_wm = gdf_fishes.to_crs(epsg=3857) gdf_receiver = geopandas.GeoDataFrame( all_receivers, geometry=geopandas.points_from_xy(all_receivers.lon, all_receivers.lat), crs = 4326) gdf_receiver['coords'] = gdf_receiver.to_crs(epsg=3857)['geometry'].apply( lambda x: x.representative_point().coords[:]) gdf_receiver['coords'] = [coords[0] for coords in gdf_receiver['coords']] return gdf_receiver, df_wm def dontcall(): gdf_receiver = pd.merge(gdf_receiver, df_wm.groupby("receiver_sn")["ID"].count().reset_index().rename(columns={" ID": "fish_count"}), on="receiver_sn", how="left") #gdf_receiver = gdf_receiver.rename(columns={" ID_x": "fish_count"}) gdf_receiver.fillna(0, inplace=True) gdf_receiver.drop_duplicates("receiver_sn") ax = df_wm.plot(figsize=(20, 20), alpha=1, edgecolor='k') gdf_receiver.drop_duplicates("receiver_sn")[:7].to_crs(epsg=3857).plot(ax=ax, marker="^", markersize=300, color="r", alpha=.45, label="Receiver Station") gdf_receiver.drop_duplicates("receiver_sn")[7:].to_crs(epsg=3857).plot(ax=ax, marker="^", markersize=100, color="g", alpha=.45, label="Receiver Station Polen") cx.add_basemap(ax) for idx, row in gdf_receiver.drop_duplicates("receiver_sn").iterrows(): plt.annotate(text=int(row["fish_count"]), xy=row['coords'], horizontalalignment=str(np.random.choice(['left'])), size=20) ax = gdf_receiver[:7].to_crs(epsg=3857).plot( marker="^", markersize=300, color="r", alpha=.6, label="Receiver Station", figsize=(15, 20)) ax = gdf_receiver[7:].to_crs(epsg=3857).plot( ax=ax, marker="^", markersize=150, color="b", alpha=.6, label="Receiver Station Vemco", figsize=(15, 20)) df_wm.loc[df_wm[" ID"].isin(only_one.index)].plot(ax=ax, cmap="tab20b", markersize=100, figsize=(15, 20), alpha=.7, edgecolor='k', categorical=True, column=" ID", legend=True, legend_kwds={'bbox_to_anchor':(1, 1.05),'fontsize':16,'frameon':True}, label="an einem Receiver") df_wm.loc[df_wm[" ID"].isin(two_to_four.index)].plot(cmap="tab20c", markersize=100, marker="s", ax=ax, figsize=(15, 20), alpha=.8, edgecolor='k', categorical=True, column=" ID", legend=False, legend_kwds={'bbox_to_anchor':(1, 1.05),'fontsize':16,'frameon':True}, label="an zwei bis vier Receivern") df_wm.loc[df_wm[" ID"].isin(more_than_four.index)].plot( ax=ax, markersize=120, marker="d", figsize=(15, 20), alpha=.7, edgecolor='k', categorical=True, column=" ID", legend=False, legend_kwds={'bbox_to_anchor':(1, 1.05),'fontsize':16,'frameon':True}, label="an mehr als vier Receivern") cx.add_basemap(ax) ax.legend(loc="upper right") for idx, row in gdf_receiver.iterrows(): plt.annotate(text=str(" "), xy=row['coords'], horizontalalignment='left', size=20)