@mirceau wrote:
This week I started out with Python and Dash as I am eager to learn both.
My Goal:
I want to single out certain points which are detected by the sensors and color them red if they meet two conditions:
- If they are detected between 01:00-05:00 a.m.
- and if they are detected in a certain zone (assume that I have a list that has risk-probability per zone). So it should consider any risk larger than 0.6 also.
INTENDED CONDITION FOR COLORING:
IF x > 1 AND x < 5 AND risk[I] > 0.6 THEN color=red, ELSE listCoords.index.hour
Question:
How must the ‘color=np.append(np.insert(listCoords.index.hour, 0, 0), 23)’ part of my code change to reach my goal? I was thinking something along the lines of (without including the risk-list yet):
color=np.where(np.logical_and(listCoords.index.hour >= 1, listCoords.index.hour <= 5), np.append(np.insert(listCoords.index.hour, 0, 0), 23), 'red'),
But this does not work. Any help is much appreciated.
Snippet of my code: scatter of points on geo map:
return go.Figure( data=[ # Data for all rides based on date and time Scattermapbox( lat=listCoords["Lat"], lon=listCoords["Lon"], mode="markers", hoverinfo="text + lat + lon", text=listCoords.index.hour, marker=dict( showscale=True, color=np.append(np.insert(listCoords.index.hour, 0, 0), 23), opacity=0.5, size=5, colorscale=[ [0, "#F4EC15"], [0.04167, "#DAF017"], [0.0833, "#BBEC19"], [0.125, "#9DE81B"], [0.1667, "#80E41D"], [0.2083, "#66E01F"], [0.25, "#4CDC20"], [0.292, "#34D822"], [0.333, "#24D249"], [0.375, "#25D042"], [0.4167, "#26CC58"], [0.4583, "#28C86D"], [0.50, "#29C481"], [0.54167, "#2AC093"], [0.5833, "#2BBCA4"], [1.0, "#613099"], ], colorbar=dict( title="Time of<br>Day", x=0.93, xpad=0, nticks=24, tickfont=dict(color="#d8d8d8"), titlefont=dict(color="#d8d8d8"), thicknessmode="pixels", ), ), ),
EDIT 1: providing sample data so people can run it:
List of some sensor detections with their date/time stamp:
**Date/Time Lat Lon** 2019-03-25 00:05:00 -10,80948998827914 24,19160777427344 2019-03-25 00:10:00 -10,79868405083584 24,16288145431259 2019-03-25 04:05:00 -10,78688335083584 24,20288145431259 2019-03-25 04:05:00 -10,77558405083584 24,288145431259
List of zones and their risk probability:
ZoneRisk_Prob Zone 0 1 0 2 0,002394936420140275 3 0,030364372469635626 4 0,00005702229571762559 5 0 6 0,039345384045161656 7 0,10164224211666761 8 0,14854308034441466 9 0,0037064492216456633 10 0 11 0 12 0,0003421337743057536 13 0,1214289787306837 14 0,04410674573758339 15 0 16 0 17 0,0158236870616411 18 0 19 0,18951359981752866 20 0,0014825796886582653 21 0,0005417118093174431 22 0,027769858014483662 23 0,014027484746535895 24 0,0012259793579289502 25 0,029737127216741745 26 0,009636767976278725 27 0,060072988538518564 28 0,043051833266807324 29 0,005759251867480185 30 0,1094257854821235 31
EDIT:
- First I categorized/converted all the risk_probabilities into ‘1’, ‘2’ and ‘3’. Where 3 is highest risk.
- Then I, Synchronized Dataset (basically bringing both datesets into alignment into one file)
new dataset threat_points.csv:
Date/Time Lat, Lon, Threat 2019-03-23 04:00:00, -14.809489988279145, 26.191607774273443, 1 2019-03-23 04:00:00, -14.792921094981814, 26.191716715339687, 2 2019-03-23 04:05:00, -14.798684405083584, 26.162881454312586, 3 2019-03-23 04:10:00, -14.80112670820822, 26.173830400821103, 3
Then based on the code-pointers from @empet, I set the following items:
# Initialize data frame df1 = pd.read_csv( "/Users/ME/Desktop/DSP_Frontend/threat_points.csv", dtype=object, ) df = pd.concat([df1], axis=0) df["Date/Time"] = pd.to_datetime(df["Date/Time"], format="%Y-%m-%d %H:%M") df.index = df["Date/Time"] df.drop("Date/Time", 1, inplace=True) ######################################################### ##################### FACTOR 1 ########################## ######################################################### # Take from df1 file the values of column 'Threat' probs = df1['Threat'].values # Convert the string values to integer in new list probs1 = np.asarray(probs, dtype = int) # Filter only the high priority items which are equal to 3. r = np.where(probs1 == 3)[0] # Print check the possible locations of poachers print("Factor 1 (risk probability) = SUCCESS") ######################################################### ##################### FACTOR 2 ########################## ######################################################### ##extract the list of datetimes between two fixed hours:# time_red = df.between_time('01:00', '05:00').index # # Print check the times # print("At these timestamps: (without rows_nr) ",time_red) print("Factor 2 (DateTime Range) = SUCCESS") #get the row number in df.index of each element in time_red row_nr = [list(df.index).index(tr) for tr in time_red] # #extract the common elements in r and row_nr: red_position = set(r).intersection(set(row_nr)) print("Factor 3 (Find Intersection between F1 and F2) = SUCCESS") print(red_position)
This outputs row numbers:
{15268, 15422, 24713, 14667, 21080, 11928, 33136, 35219, 35220, 17716, 35222, 35223, 35224, 14681, 35226, 35227, 35228, 158}
Now coming to the conditional styling, this is what I have in mind:
return go.Figure( data=[ # Data for all rides based on date and time Scattermapbox( lat=listCoords["Lat"], lon=listCoords["Lon"], mode="markers", hoverinfo="text + lat + lon", text=listCoords.index.hour, marker=dict( showscale=True, color=np.where(np.logical_if(red_position, else), 'red', np.append(np.insert(listCoords.index.hour, 0, 0), 23)), opacity=0.5, size=5, colorscale=[ [0, "#F4EC15"], [0.04167, "#DAF017"], [0.0833, "#BBEC19"], [0.125, "#9DE81B"], [0.1667, "#80E41D"], [0.2083, "#66E01F"], [0.25, "#4CDC20"], [0.292, "#34D822"], [0.333, "#24D249"], [0.375, "#25D042"], [0.4167, "#26CC58"], [0.4583, "#28C86D"], [0.50, "#29C481"], [0.54167, "#2AC093"], [0.5833, "#2BBCA4"], [1.0, "#613099"], ], colorbar=dict( title="Time of<br>Day", x=0.93, xpad=0, nticks=24, tickfont=dict(color="#d8d8d8"), titlefont=dict(color="#d8d8d8"), thicknessmode="pixels", ), ), ),
Posts: 7
Participants: 2