Filtering dataset

Hello , I have an Tag dataset OF WECAM like :
image
Column1 is ID of webcam.
What I want is, when I click on an webcam for exemple webcam ID = 11
I want obtain a dataset like:
image
Column2 is zone where webbcam is located

You would need to explain your selection rule. For example, why would 44 and 66 show up when you select 11? Can you see why this might be confusing to us?

2 Likes

I ran the code below in the script console. It demonstrates creating your original dataset, filtering it based off of a selection in Column1, and then creating a new dataset with ID matching what was selected. I based it off the example shown here in the docs:

https://docs.inductiveautomation.com/display/DOC81/Datasets

# Create original dataset through scripting
headers = ['Column1', 'Column2']
data = []

data.append([11, 'A'])
data.append([22, 'B'])
data.append([33, 'C'])
data.append([44, 'A'])
data.append([55, 'D'])
data.append([66, 'A'])
data.append([11, 'B'])

original_ds = system.dataset.toDataSet(headers, data)

# Change this from a hard coded variable to a user input/selection.
selection = 11

new_headers = ['Column1', 'Column2']
new_data = []

for row in range(original_ds.getRowCount()):
	# Unpack variables from original ds to examine
	myID = 		original_ds.getValueAt(row, 'Column1')
	myLetter = 	original_ds.getValueAt(row, 'Column2')
	
	# Compare original ds against selection
	if myID == selection:
		new_data.append([myID, myLetter])
	else:
		pass

# Create new dataset.
new_ds = system.dataset.toDataSet(new_headers, new_data)

print original_ds
print new_ds

Results:
image

1 Like

I agree with transistor here, there's no clear correlation between the input and the output you've shown.
You'll need to be more accurate about what you want to do.

1 Like

When I click on webcam 11, I must get all webcam that have Same zone (Column2) and I also get all column where ID webcam = 11

So your result dataset should also contain [22, B] ? You forgot this one in your first post.

def filter_cams(cameras, selected_id):
	ds = system.dataset.toPyDataSet(cameras)
	zones = {row['zone'] for row in ds if row['id'] == selected_id}
	filtered_ds = filter(lambda x: x['id'] == selected_id or x['zone'] in zones, ds)
	return system.dataset.toDataSet(list(cameras.columnNames), filtered_ds)

Bonjour Pascal, en fait chaque webcam appartient Ă  une zone qui sont zone soit zone A, B, C ou D

Il arrivera le cas ou un webcam appartiendra deux ou trois zone par exemple A, B et C.

alors ce que je dois faire est que lorsque je clique sur webcam 11 qui appartient à la zone A, je dois récupérer un dataset qui contient ID de webcam qui appartient à la zone A ( le ID 44 et 66 dans le dataset) et récupérer également autre zones dont du ID du webcam =11 ( zone B dans le dataset)

Si la camera 11 appartient aux zones A et B, et que tu veux les autres caméras de la zone A, alors logiquement il te faut aussi les autres caméras de la zone B.

Sinon la règle de sélection que tu annonces n'est pas complète.

Non, if I click on webcam 22, I must obtain:

Column1 Column2
22 B
11 B

Je te parle pas de la 22, mais si je suis la règle que tu as décrite:

  • On sĂ©lectionne la camĂ©ra 11.
    on a
id zone
11 A
11 B
  • La camĂ©ra 11 est dans la zone A. Donc on sĂ©lectionne les autres camĂ©ras de la zone A:
id zone
11 A
11 B
44 A
66 A
  • la camĂ©ra 11 est dans la zone B, donc on sĂ©lectionne aussi les camĂ©ras de la zone B:
id zone
11 A
11 B
44 A
66 A
22 B
1 Like

Merci pour ton explication. Oui, tu as évidement raison. Mais il aura une popu qui va éviter avoir ça dans le dataset.

Dès qu'un camera appartiendra plusieurs Zones, une popup s'ouvrira dès l'utilisateur clique sur la webcam pour demander l'utilisateur la Zone qu'il veut regarder .
S'il dit Zone B, il y aura que zone B dans le dataset , s'il dit Zone A, il n y 'aura que Zone A

2 solutions:

  1. utilise la fonction que j'ai posté plus haut pour avoir toutes les caméras possible,
    ensuite demande à l'utilisateur quelle zone il veut en faisant un set à partir des zones dans le dataset déjà filtré,
    puis refiltre en ne gardant que cette zone

  2. Utilise ces fonctions là pour d'abord extraire les zones qui correspondent à la caméra, ensuite demande à l'utilisateur quelle zone il veut puis utilise la zone choisie pour filtrer les caméras:

def filter_cams(cameras, zone):
	ds = system.dataset.toPyDataSet(cameras)
	filtered_ds = filter(lambda x: x['zone'] == zone, ds)
	return system.dataset.toDataSet(list(cameras.columnNames), filtered_ds)

def get_zones(cameras, selected_id):
	return [cam['zone'] for cam in system.dataset.toPyDataSet(cameras) if cam['id'] == selected_id]

image

edit: Ah, il faut aussi l'entrée [11, B] ?
Dans ce cas il faut modifier le filtrage:

def filter_cams(cameras, selected_id, zone):
	ds = system.dataset.toPyDataSet(cameras)
	filtered_ds = filter(lambda x: x['zone'] == zone or x['id'] == selected_id, ds)
	return system.dataset.toDataSet(list(cameras.columnNames), filtered_ds)

image

edit 2:
Tes caméras sont dans une base de données ?
Si c'est le cas, autant faire le filtrage directement dans la requĂŞte.

1 Like

Sont dans un Tag

You don't have to keep deleting your posts. Edit them instead. There's a pencil icon below each of your posts.

1 Like

Une base de données te simplifierait les choses à mon avis.