# Filtering dataset

**URL:** <https://forum.inductiveautomation.com/t/filtering-dataset/78719>\
**Category:** Ignition\
**Created:** [September 4, 2023, 11:49am UTC](https://forum.inductiveautomation.com/t/filtering-dataset/78719 "2023-09-04T11:49:02Z")\
**Posts on this page:** 15\
**Page:** 1

<div class="post-metadata">

**Author:** ![sebastien\_ng](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/sebastien_ng/32/55297_2.png) [@sebastien\_ng](https://forum.inductiveautomation.com/u/sebastien_ng)\
**Post date:** [September 4, 2023, 11:49am UTC](https://forum.inductiveautomation.com/t/filtering-dataset/78719/1 "2023-09-04T11:49:02Z")

</div>

Hello , I have an Tag dataset OF WECAM like :  
 ![image](https://us1.discourse-cdn.com/inductiveautomation/original/3X/5/a/5a283804e0d4ad76857e7c72c8861e4f3b2a3cf8.png)  
**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](https://us1.discourse-cdn.com/inductiveautomation/original/3X/c/f/cf141f795479fc13d94f6f1c61a7e17e04445421.png)  
**Column2** is zone where webbcam is located

---

<div class="post-metadata">

**Author:** ![Transistor](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/transistor/32/3380_2.png) [@Transistor](https://forum.inductiveautomation.com/u/Transistor)\
**Post date:** [September 4, 2023, 11:57am UTC](https://forum.inductiveautomation.com/t/filtering-dataset/78719/2 "2023-09-04T11:57:47Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![bmeyers](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/bmeyers/32/37453_2.png) [@bmeyers](https://forum.inductiveautomation.com/u/bmeyers)\
**Post date:** [September 4, 2023, 12:05pm UTC](https://forum.inductiveautomation.com/t/filtering-dataset/78719/3 "2023-09-04T12:05:35Z")

</div>

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](https://docs.inductiveautomation.com/display/DOC81/Datasets)

```auto
# 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](https://us1.discourse-cdn.com/inductiveautomation/original/3X/a/0/a0d6cf945acbfc81362aef91e96624a688d4fc45.png)

---

<div class="post-metadata">

**Author:** ![pascal.fragnoud](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pascal.fragnoud/32/24728_2.png) [@pascal.fragnoud](https://forum.inductiveautomation.com/u/pascal.fragnoud)\
**Post date:** [September 4, 2023, 12:20pm UTC](https://forum.inductiveautomation.com/t/filtering-dataset/78719/4 "2023-09-04T12:20:03Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![sebastien\_ng](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/sebastien_ng/32/55297_2.png) [@sebastien\_ng](https://forum.inductiveautomation.com/u/sebastien_ng)\
**Post date:** [September 4, 2023, 12:25pm UTC](https://forum.inductiveautomation.com/t/filtering-dataset/78719/6 "2023-09-04T12:25:55Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![pascal.fragnoud](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pascal.fragnoud/32/24728_2.png) [@pascal.fragnoud](https://forum.inductiveautomation.com/u/pascal.fragnoud)\
**Post date:** [September 4, 2023, 12:32pm UTC](https://forum.inductiveautomation.com/t/filtering-dataset/78719/7 "2023-09-04T12:32:22Z")

</div>

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

```python
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)

```

---

<div class="post-metadata">

**Author:** ![sebastien\_ng](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/sebastien_ng/32/55297_2.png) [@sebastien\_ng](https://forum.inductiveautomation.com/u/sebastien_ng)\
**Post date:** [September 4, 2023, 12:34pm UTC](https://forum.inductiveautomation.com/t/filtering-dataset/78719/8 "2023-09-04T12:34:08Z")

</div>

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)

---

<div class="post-metadata">

**Author:** ![pascal.fragnoud](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pascal.fragnoud/32/24728_2.png) [@pascal.fragnoud](https://forum.inductiveautomation.com/u/pascal.fragnoud)\
**Post date:** [September 4, 2023, 12:37pm UTC](https://forum.inductiveautomation.com/t/filtering-dataset/78719/9 "2023-09-04T12:37:19Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![sebastien\_ng](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/sebastien_ng/32/55297_2.png) [@sebastien\_ng](https://forum.inductiveautomation.com/u/sebastien_ng)\
**Post date:** [September 4, 2023, 12:39pm UTC](https://forum.inductiveautomation.com/t/filtering-dataset/78719/10 "2023-09-04T12:39:10Z")

</div>

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

| | |
| --- | --- |
| Column1 | Column2 |
| 22 | B |
| 11 | B |
| | |

---

<div class="post-metadata">

**Author:** ![pascal.fragnoud](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pascal.fragnoud/32/24728_2.png) [@pascal.fragnoud](https://forum.inductiveautomation.com/u/pascal.fragnoud)\
**Post date:** [September 4, 2023, 12:43pm UTC](https://forum.inductiveautomation.com/t/filtering-dataset/78719/11 "2023-09-04T12:43:27Z")

</div>

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 |

---

<div class="post-metadata">

**Author:** ![sebastien\_ng](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/sebastien_ng/32/55297_2.png) [@sebastien\_ng](https://forum.inductiveautomation.com/u/sebastien_ng)\
**Post date:** [September 4, 2023, 12:51pm UTC](https://forum.inductiveautomation.com/t/filtering-dataset/78719/12 "2023-09-04T12:51:15Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![pascal.fragnoud](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pascal.fragnoud/32/24728_2.png) [@pascal.fragnoud](https://forum.inductiveautomation.com/u/pascal.fragnoud)\
**Post date:** [September 4, 2023, 12:59pm UTC](https://forum.inductiveautomation.com/t/filtering-dataset/78719/13 "2023-09-04T12:59:45Z")

</div>

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:

```python
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](https://us1.discourse-cdn.com/inductiveautomation/original/3X/4/2/424a9b1a6855be0c188816186157d9bbbfbd6504.png)

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

```python
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](https://us1.discourse-cdn.com/inductiveautomation/original/3X/8/7/878001f420b96b6c66549163411c2743884b52e5.png)

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.

---

<div class="post-metadata">

**Author:** ![sebastien\_ng](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/sebastien_ng/32/55297_2.png) [@sebastien\_ng](https://forum.inductiveautomation.com/u/sebastien_ng)\
**Post date:** [September 4, 2023, 1:09pm UTC](https://forum.inductiveautomation.com/t/filtering-dataset/78719/14 "2023-09-04T13:09:12Z")

</div>

> [@pascal.fragnoud](#):
>
> Tes caméras sont dans une base de données ?

Sont dans un Tag

---

<div class="post-metadata">

**Author:** ![Transistor](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/transistor/32/3380_2.png) [@Transistor](https://forum.inductiveautomation.com/u/Transistor)\
**Post date:** [September 4, 2023, 1:13pm UTC](https://forum.inductiveautomation.com/t/filtering-dataset/78719/15 "2023-09-04T13:13:27Z")

</div>

> [@sebastien\_ng](#):
>
> (post deleted by author)

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

---

<div class="post-metadata">

**Author:** ![pascal.fragnoud](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pascal.fragnoud/32/24728_2.png) [@pascal.fragnoud](https://forum.inductiveautomation.com/u/pascal.fragnoud)\
**Post date:** [September 4, 2023, 1:16pm UTC](https://forum.inductiveautomation.com/t/filtering-dataset/78719/16 "2023-09-04T13:16:38Z")

</div>

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