Reputation: 161
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:
Intended condition for coloring:
IF x > 1 AND x < 5 AND risk[i] > 0.6 THEN color=red, ELSE listCoords.index.hour
My 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 observations based on date/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
Upvotes: 1
Views: 498
Reputation: 161
To get the positions that meet both your requirements you should proceed as below.
Read the two data files, that are supposed to be syncronized, in the sense that datetime recorded in the row k of the datetime file, corresponds to the location of coords (lon, lat) in the row number k of the other file.
dfz = pd.read_csv("zone-file.csv")
probs = dfz['ZoneRisk_Prob'].values
I = np.where(probs > 0.6)[0]
print(I)
dft = pd.read_csv("record-datetime.csv") #supose that this dataframe has Date/Time as index
#extract the list of datetimes between two fixed hours:
time_red = dft.between_time('01:00', '05:00').index
print(time_red)
#get the row number in dft.index of each element in time_red
row_nr = [list(df.index).index(tr) for tr in time_red]
print(row_nr)
#extract the common elements in I and row_nr:
red_position = set(I).intersection(set(row_nr))
If, for example, red_position =[ 7,12, 17, 25], then color[7], color[12], color[17], color[25] will be red
Upvotes: 1