blob: 765bce3eec51d6104dab4e6e80c7aad30ed53d31 [file] [log] [blame]
Funnel
======
The Funnel Function
-------------------
.. code:: python
funnel(edges_segmentN, user_specification, node_labels= False)
*Creates Funnel Graph from defined edge list and optional user-provided labels*
**edges_segmentN**: List of Tuples
**user_specification**: String of Target of interest e.g. #document
**node_labels**: Optional Dictionary of key default values, value replacements
Returns a Funnel graph.
**Remove the duplicates**
.. code:: python
edge_list_temp = []
for row in edges_segmentN:
if row[0] != row[1]:
edge_list_temp.append(row)
edge_list = edge_list_temp
**Convert from list of 2s to list of 1s**
.. code:: python
edgelist_list = []
length = len(edge_list) - 1
for i in edge_list:
if edge_list.index(i) != length:
edgelist_list.append(i[0])
else:
edgelist_list.append(i[0])
edgelist_list.append(i[1])
**Remove the none values**
.. code:: python
funnel_targets_temp = []
for item in edgelist_list:
if item != None:
funnel_targets_temp.append(item)
funnel_targets = funnel_targets_temp
**Convert that list into a list of 3s**
.. code:: python
edge_list = []
for i in range(len(funnel_targets)):
if i == (len(funnel_targets) - 2):
break
else:
edge_list.append((funnel_targets[i], funnel_targets[i + 1], funnel_targets[i + 2]))
**Convert the list of 3s to a counter**
.. code:: python
edge_list_counter = collections.Counter(edge_list)
first_rung = user_specification
new_edge_list = []
for i in edge_list:
if i[0] == user_specification:
new_edge_list.append((i[0], i[1], i[2]))
new_edge_list_counter = collections.Counter(new_edge_list)
new_edge_list_counter.most_common(1)
first_rung = new_edge_list_counter.most_common(1)[0][0][0]
second_rung = new_edge_list_counter.most_common(1)[0][0][1]
third_rung = new_edge_list_counter.most_common(1)[0][0][2]
counter1 = 0
counter2 = 0
counter3 = 0
for i in edge_list:
if i[0] == first_rung:
counter1 += 1
if i[1] == second_rung:
counter2 += 1
if i[2] == third_rung:
counter3 += 1
**Numbers are how many times each target occured**
**Edges are the targets**
.. code:: python
numbers = [counter1, counter2, counter3]
edges = [first_rung, second_rung, third_rung]
**If node labels was given as an argument, replaces the targets with the provided names**
.. code:: python
if node_labels:
new_edges = []
for edge in edges:
if edge in node_labels:
new_edges.append(node_labels[edge])
else:
new_edges.append(edge)
edges = new_edges
**Plotting labels from the list with the values from the dictionary**
.. code:: python
data = dict(
number=numbers,
edge=edges)
**Plotting the figure**
.. code:: python
fig = go.Figure(go.Funnel(
y=edges,
x=numbers,
textposition="inside",
textinfo="value+percent initial",
opacity=0.65, marker={"color": ["deepskyblue", "lightsalmon", "tan"],
"line": {"width": [2]}},
connector={"line": {"color": "lime", "dash": "dot", "width": 5}})
)
fig.show()
Funnel Example
--------------
.. code:: python
funnel(edges_segmentN, user_specification, node_labels=False)
The Funnel Function takes the arguments: edges_segmentN: List of Tuples
user_specification: A string of target of interest e.g. #document
node_labels (Optional): Optional Dictionary of key default values with
value replacements And it will return a Funnel graph. Below is an
example of a Funnel Diagram:
|funnelexample.png| Additionally, users have the option to pass a
dictionary of node labels to replace existing labels.
Below is an example:
**Input:**
.. code:: python
edges = [('#document', 'button#test_button'),
('button#test_button', '#document'),
('#document', 'input'),
('input', 'button'),
('button', 'input'),
('input', 'form#test_text_input'),
('form#test_text_input', 'input'),
('input', 'button'),
('button', 'form#test_text_input'),
('form#test_text_input', '#document'),
('#document', 'form#test_radio_input'),
('form#test_radio_input', 'input'),
('input', 'button#Mock Request Button'),
('button#Mock Request Button', '#document'),
('#document', 'input'),
('input', 'button'),
('button', 'form#test_text_input'),
('form#test_text_input', 'p'),
('p', '#document'),
('#document', 'button#test_button'),
('button#test_button', '#document'),
('#document', 'form#test_radio_input'),
('form#test_radio_input', 'input'),
('input', 'form#test_radio_input'),
('form#test_radio_input', 'input')]
userspec = 'input'
funnel(edges, userspec)
**Output:** |image1|
Now we can add the optional node labels to be replaced. **Input:**
.. code:: python
edges = [('#document', 'button#test_button'),
('button#test_button', '#document'),
('#document', 'input'),
('input', 'button'),
('button', 'input'),
('input', 'form#test_text_input'),
('form#test_text_input', 'input'),
('input', 'button'),
('button', 'form#test_text_input'),
('form#test_text_input', '#document'),
('#document', 'form#test_radio_input'),
('form#test_radio_input', 'input'),
('input', 'button#Mock Request Button'),
('button#Mock Request Button', '#document'),
('#document', 'input'),
('input', 'button'),
('button', 'form#test_text_input'),
('form#test_text_input', 'p'),
('p', '#document'),
('#document', 'button#test_button'),
('button#test_button', '#document'),
('#document', 'form#test_radio_input'),
('form#test_radio_input', 'input'),
('input', 'form#test_radio_input'),
('form#test_radio_input', 'input')]
userspec = 'input'
labels = {'form#test_text_input':'test_text_input'}
funnel(edges, userspec, labels)
**Output:** |image2|
.. |funnelexample.png| image:: https://i.postimg.cc/qvPxbKqT/newplot-2.png
:target: https://postimg.cc/tsz67YFS
.. |image1| image:: https://i.postimg.cc/FzHydgWj/newplot-3.png
:target: https://postimg.cc/dkgkgdK1
.. |image2| image:: https://i.postimg.cc/rwrSrpJY/newplot-4.png
:target: https://postimg.cc/RWv6r42c