moderne-visualizations-misc 0.68.0__py3-none-any.whl → 0.70.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (27) hide show
  1. moderne_visualizations_misc/call_graph_uml.ipynb +1 -1
  2. moderne_visualizations_misc/cobol_relationships_data_grid.ipynb +0 -1
  3. moderne_visualizations_misc/comment_language_distribution.ipynb +1 -1
  4. moderne_visualizations_misc/composite_recipe_results_sankey.ipynb +176 -164
  5. moderne_visualizations_misc/dependency_vulnerabilities.ipynb +0 -1
  6. moderne_visualizations_misc/dependency_vulnerabilities_npm.ipynb +0 -1
  7. moderne_visualizations_misc/dependency_vulnerabilities_nuget.ipynb +0 -1
  8. moderne_visualizations_misc/embeddings_clustering.ipynb +1 -2
  9. moderne_visualizations_misc/eslint_problems.ipynb +1 -2
  10. moderne_visualizations_misc/find_source_files.ipynb +1 -1
  11. moderne_visualizations_misc/get_embeddings_and_cluster.ipynb +24 -13
  12. moderne_visualizations_misc/images/ui5lint_rule_treemap.300.png +0 -0
  13. moderne_visualizations_misc/images/ui5lint_violations_heatmap.300.png +0 -0
  14. moderne_visualizations_misc/java_versions_by_sourceset.ipynb +15 -15
  15. moderne_visualizations_misc/java_versions_in_use.ipynb +14 -18
  16. moderne_visualizations_misc/parse_failure_stacktraces.ipynb +0 -2
  17. moderne_visualizations_misc/recommendations.ipynb +1 -1
  18. moderne_visualizations_misc/specs/ui5lint_rule_treemap.yml +7 -0
  19. moderne_visualizations_misc/specs/ui5lint_violations_heatmap.yml +7 -0
  20. moderne_visualizations_misc/spring_component_relationships.ipynb +185 -186
  21. moderne_visualizations_misc/ui5lint_rule_treemap.ipynb +110 -0
  22. moderne_visualizations_misc/ui5lint_violations_heatmap.ipynb +76 -0
  23. moderne_visualizations_misc-0.70.0.dist-info/METADATA +19 -0
  24. {moderne_visualizations_misc-0.68.0.dist-info → moderne_visualizations_misc-0.70.0.dist-info}/RECORD +26 -20
  25. {moderne_visualizations_misc-0.68.0.dist-info → moderne_visualizations_misc-0.70.0.dist-info}/WHEEL +1 -1
  26. moderne_visualizations_misc-0.68.0.dist-info/METADATA +0 -28
  27. {moderne_visualizations_misc-0.68.0.dist-info → moderne_visualizations_misc-0.70.0.dist-info}/top_level.txt +0 -0
@@ -15,21 +15,21 @@
15
15
  },
16
16
  {
17
17
  "cell_type": "code",
18
- "execution_count": null,
18
+ "execution_count": 2,
19
19
  "id": "701147ab-62bd-490f-8a26-8ad1dd80f4d7",
20
20
  "metadata": {},
21
21
  "outputs": [],
22
22
  "source": [
23
- "data = df.drop(\n",
24
- " columns=[\n",
25
- " \"repositoryOrigin\",\n",
26
- " \"repositoryPath\",\n",
27
- " \"repositoryBranch\",\n",
28
- " \"scmType\",\n",
29
- " \"repositoryLink\",\n",
30
- " \"targetVersion\",\n",
31
- " ]\n",
32
- ")\n",
23
+ "columns_to_drop = [\n",
24
+ " \"repositoryOrigin\",\n",
25
+ " \"repositoryPath\",\n",
26
+ " \"repositoryBranch\",\n",
27
+ " \"scmType\",\n",
28
+ " \"repositoryLink\",\n",
29
+ " \"targetVersion\",\n",
30
+ "]\n",
31
+ "\n",
32
+ "data = df.drop(columns=[col for col in columns_to_drop if col in df.columns])\n",
33
33
  "data"
34
34
  ]
35
35
  },
@@ -40,11 +40,7 @@
40
40
  "metadata": {},
41
41
  "outputs": [],
42
42
  "source": [
43
- "versions = (\n",
44
- " data.groupby([\"sourceVersion\"], as_index=True)\n",
45
- " .value_counts()\n",
46
- " .fillna(0)\n",
47
- ")\n",
43
+ "versions = data.groupby([\"sourceVersion\"], as_index=True).value_counts().fillna(0)\n",
48
44
  "versions"
49
45
  ]
50
46
  },
@@ -66,7 +62,7 @@
66
62
  ],
67
63
  "metadata": {
68
64
  "kernelspec": {
69
- "display_name": "Python 3 (ipykernel)",
65
+ "display_name": "Python 3",
70
66
  "language": "python",
71
67
  "name": "python3"
72
68
  },
@@ -80,7 +76,7 @@
80
76
  "name": "python",
81
77
  "nbconvert_exporter": "python",
82
78
  "pygments_lexer": "ipython3",
83
- "version": "3.9.17"
79
+ "version": "3.10.14"
84
80
  }
85
81
  },
86
82
  "nbformat": 4,
@@ -18,8 +18,6 @@
18
18
  "from code_data_science import data_table as dt, data_grid as moderne_data_grid\n",
19
19
  "import code_data_science.palette as palette\n",
20
20
  "import re\n",
21
- "from plotly.subplots import make_subplots\n",
22
- "import plotly.graph_objects as go\n",
23
21
  "\n",
24
22
  "pd.set_option(\"expand_frame_repr\", True)\n",
25
23
  "df = dt.read_csv(\"../samples/parse_failure_kotlin.csv\")\n",
@@ -36,7 +36,7 @@
36
36
  "def parse_recommendations(str):\n",
37
37
  " try:\n",
38
38
  " return json.loads(clean_text(str))\n",
39
- " except json.JSONDecodeError as e:\n",
39
+ " except json.JSONDecodeError:\n",
40
40
  " return math.nan\n",
41
41
  "\n",
42
42
  "\n",
@@ -0,0 +1,7 @@
1
+ type: specs.moderne.io/v1beta/visualization
2
+ name: io.moderne.UI5LintRuleTreemap
3
+ displayName: UI5 lint rule treemap
4
+ description: >
5
+ Treemap of UI5 lint violations by rules.
6
+ recipe: org.openrewrite.codemods.UI5
7
+ dataTable: org.openrewrite.codemods.UI5Messages
@@ -0,0 +1,7 @@
1
+ type: specs.moderne.io/v1beta/visualization
2
+ name: io.moderne.UI5LintViolationsHeatmap
3
+ displayName: UI5 lint violations heatmap
4
+ description: >
5
+ Heatmap of UI5 lint violations by repository.
6
+ recipe: org.openrewrite.codemods.UI5
7
+ dataTable: org.openrewrite.codemods.UI5Messages
@@ -1,189 +1,188 @@
1
1
  {
2
- "cells": [
3
- {
4
- "cell_type": "code",
5
- "execution_count": null,
6
- "metadata": {
7
- "tags": [
8
- "parameters"
9
- ]
10
- },
11
- "outputs": [],
12
- "source": [
13
- "node_shape: str = \"box\"\n",
14
- "filter_to_relevant: str = \"\""
15
- ]
16
- },
17
- {
18
- "cell_type": "code",
19
- "execution_count": null,
20
- "metadata": {},
21
- "outputs": [],
22
- "source": [
23
- "import graphviz\n",
24
- "from code_data_science import data_table as dt\n",
25
- "import code_data_science.palette as palette\n",
26
- "import html\n",
27
- "\n",
28
- "df = dt.read_csv(\"../samples/spring_component_relationships.csv\")"
29
- ]
30
- },
31
- {
32
- "cell_type": "code",
33
- "execution_count": null,
34
- "metadata": {},
35
- "outputs": [],
36
- "source": [
37
- "import networkx as nx\n",
38
- "\n",
39
- "relevant_nodes = set()\n",
40
- "ancestor_nodes = set()\n",
41
- "descendant_nodes = set()\n",
42
- "\n",
43
- "if filter_to_relevant:\n",
44
- " G = nx.from_pandas_edgelist(\n",
45
- " df, \"dependantType\", \"dependencyType\", create_using=nx.DiGraph()\n",
46
- " )\n",
47
- "\n",
48
- " for node in G.nodes:\n",
49
- " if filter_to_relevant in node:\n",
50
- " relevant_nodes.add(node) # Include the node itself\n",
51
- " # Add all descendants and ancestors of the node\n",
52
- " descendant_nodes.update(nx.descendants(G, node))\n",
53
- " ancestor_nodes.update(nx.ancestors(G, node))"
54
- ]
55
- },
56
- {
57
- "cell_type": "code",
58
- "execution_count": null,
59
- "metadata": {},
60
- "outputs": [],
61
- "source": [
62
- "# Continue with your Graphviz setup\n",
63
- "graphviz.set_jupyter_format(\"svg\")\n",
64
- "dot = graphviz.Digraph(\"spring-relationships\", comment=\"Spring component relationships\")\n",
65
- "\n",
66
- "dot.graph_attr = {\n",
67
- " \"overlap\": \"true\",\n",
68
- " \"normalize\": \"true\",\n",
69
- " \"overlap_shrink\": \"true\",\n",
70
- " \"overlap_scaling\": \"60\",\n",
71
- " \"nodesep\": \"1\",\n",
72
- "}\n",
73
- "\n",
74
- "added_nodes = set()\n",
75
- "added_edges = set()\n",
76
- "\n",
77
- "\n",
78
- "def map_relationship(row):\n",
79
- " \"\"\"\n",
80
- " For a row determine which node and relationship should be added to the graph\n",
81
- " If a relevant filter has been applied then we only want to graph nodes that\n",
82
- " are descendants or ancestors of the relevant nodes\n",
83
- " \"\"\"\n",
84
- " # Check if dependantType node already added\n",
85
- " if row[\"dependantType\"] not in added_nodes:\n",
86
- " if filter_to_relevant != \"\":\n",
87
- " if row[\"dependantType\"] in relevant_nodes:\n",
88
- " dot.node(\n",
89
- " row[\"dependantType\"],\n",
90
- " shape=node_shape,\n",
91
- " style=\"filled\",\n",
92
- " fillcolor=palette.__moderne_color_map[\"red\"][200],\n",
93
- " )\n",
94
- " added_nodes.add(row[\"dependantType\"])\n",
95
- " if row[\"dependantType\"] in ancestor_nodes:\n",
96
- " dot.node(\n",
97
- " row[\"dependantType\"],\n",
98
- " shape=node_shape,\n",
99
- " style=\"filled\",\n",
100
- " fillcolor=palette.__moderne_color_map[\"blue\"][200],\n",
101
- " )\n",
102
- " added_nodes.add(row[\"dependantType\"])\n",
103
- " else:\n",
104
- " dot.node(\n",
105
- " row[\"dependantType\"],\n",
106
- " shape=node_shape,\n",
107
- " style=\"filled\",\n",
108
- " fillcolor=palette.__moderne_color_map[\"blue\"][200],\n",
109
- " )\n",
110
- " added_nodes.add(row[\"dependantType\"])\n",
111
- "\n",
112
- " # Check if dependencyType node already added\n",
113
- " if row[\"dependencyType\"] not in added_nodes:\n",
114
- " if filter_to_relevant != \"\":\n",
115
- " if row[\"dependencyType\"] in relevant_nodes:\n",
116
- " dot.node(\n",
117
- " row[\"dependencyType\"],\n",
118
- " shape=node_shape,\n",
119
- " style=\"filled\",\n",
120
- " fillcolor=palette.__moderne_color_map[\"red\"][200],\n",
121
- " )\n",
122
- " added_nodes.add(row[\"dependantType\"])\n",
123
- " if row[\"dependencyType\"] in descendant_nodes:\n",
124
- " dot.node(\n",
125
- " row[\"dependencyType\"],\n",
126
- " shape=node_shape,\n",
127
- " style=\"filled\",\n",
128
- " fillcolor=palette.__moderne_color_map[\"blue\"][200],\n",
129
- " )\n",
130
- " added_nodes.add(row[\"dependencyType\"])\n",
131
- " else:\n",
132
- " dot.node(\n",
133
- " row[\"dependencyType\"],\n",
134
- " shape=node_shape,\n",
135
- " style=\"filled\",\n",
136
- " fillcolor=palette.__moderne_color_map[\"blue\"][200],\n",
137
- " )\n",
138
- " added_nodes.add(row[\"dependencyType\"])\n",
139
- "\n",
140
- " # Add edge\n",
141
- " if (row[\"dependantType\"], row[\"dependencyType\"]) not in added_edges:\n",
142
- " if filter_to_relevant != \"\":\n",
143
- " if row[\"dependantType\"] in descendant_nodes:\n",
144
- " dot.edge(row[\"dependantType\"], row[\"dependencyType\"])\n",
145
- " added_edges.add((row[\"dependantType\"], row[\"dependencyType\"]))\n",
146
- " if row[\"dependencyType\"] in ancestor_nodes:\n",
147
- " dot.edge(row[\"dependantType\"], row[\"dependencyType\"])\n",
148
- " added_edges.add((row[\"dependantType\"], row[\"dependencyType\"]))\n",
149
- " if row[\"dependantType\"] in relevant_nodes:\n",
150
- " dot.edge(row[\"dependantType\"], row[\"dependencyType\"])\n",
151
- " added_edges.add((row[\"dependantType\"], row[\"dependencyType\"]))\n",
152
- " if row[\"dependencyType\"] in relevant_nodes:\n",
153
- " dot.edge(row[\"dependantType\"], row[\"dependencyType\"])\n",
154
- " added_edges.add((row[\"dependantType\"], row[\"dependencyType\"]))\n",
155
- " else:\n",
156
- " dot.edge(row[\"dependantType\"], row[\"dependencyType\"])\n",
157
- " added_edges.add((row[\"dependantType\"], row[\"dependencyType\"]))\n",
158
- "\n",
159
- "\n",
160
- "# Apply mapping to each row\n",
161
- "df.apply(map_relationship, axis=1)\n",
162
- "\n",
163
- "# Display the graph\n",
164
- "dot"
165
- ]
166
- }
167
- ],
168
- "metadata": {
169
- "kernelspec": {
170
- "display_name": "Python 3",
171
- "language": "python",
172
- "name": "python3"
173
- },
174
- "language_info": {
175
- "codemirror_mode": {
176
- "name": "ipython",
177
- "version": 3
178
- },
179
- "file_extension": ".py",
180
- "mimetype": "text/x-python",
181
- "name": "python",
182
- "nbconvert_exporter": "python",
183
- "pygments_lexer": "ipython3",
184
- "version": "3.11.4"
185
- }
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": null,
6
+ "metadata": {
7
+ "tags": [
8
+ "parameters"
9
+ ]
10
+ },
11
+ "outputs": [],
12
+ "source": [
13
+ "node_shape: str = \"box\"\n",
14
+ "filter_to_relevant: str = \"\""
15
+ ]
186
16
  },
187
- "nbformat": 4,
188
- "nbformat_minor": 2
17
+ {
18
+ "cell_type": "code",
19
+ "execution_count": null,
20
+ "metadata": {},
21
+ "outputs": [],
22
+ "source": [
23
+ "import graphviz\n",
24
+ "from code_data_science import data_table as dt\n",
25
+ "import code_data_science.palette as palette\n",
26
+ "\n",
27
+ "df = dt.read_csv(\"../samples/spring_component_relationships.csv\")"
28
+ ]
29
+ },
30
+ {
31
+ "cell_type": "code",
32
+ "execution_count": null,
33
+ "metadata": {},
34
+ "outputs": [],
35
+ "source": [
36
+ "import networkx as nx\n",
37
+ "\n",
38
+ "relevant_nodes = set()\n",
39
+ "ancestor_nodes = set()\n",
40
+ "descendant_nodes = set()\n",
41
+ "\n",
42
+ "if filter_to_relevant:\n",
43
+ " G = nx.from_pandas_edgelist(\n",
44
+ " df, \"dependantType\", \"dependencyType\", create_using=nx.DiGraph()\n",
45
+ " )\n",
46
+ "\n",
47
+ " for node in G.nodes:\n",
48
+ " if filter_to_relevant in node:\n",
49
+ " relevant_nodes.add(node) # Include the node itself\n",
50
+ " # Add all descendants and ancestors of the node\n",
51
+ " descendant_nodes.update(nx.descendants(G, node))\n",
52
+ " ancestor_nodes.update(nx.ancestors(G, node))"
53
+ ]
54
+ },
55
+ {
56
+ "cell_type": "code",
57
+ "execution_count": null,
58
+ "metadata": {},
59
+ "outputs": [],
60
+ "source": [
61
+ "# Continue with your Graphviz setup\n",
62
+ "graphviz.set_jupyter_format(\"svg\")\n",
63
+ "dot = graphviz.Digraph(\"spring-relationships\", comment=\"Spring component relationships\")\n",
64
+ "\n",
65
+ "dot.graph_attr = {\n",
66
+ " \"overlap\": \"true\",\n",
67
+ " \"normalize\": \"true\",\n",
68
+ " \"overlap_shrink\": \"true\",\n",
69
+ " \"overlap_scaling\": \"60\",\n",
70
+ " \"nodesep\": \"1\",\n",
71
+ "}\n",
72
+ "\n",
73
+ "added_nodes = set()\n",
74
+ "added_edges = set()\n",
75
+ "\n",
76
+ "\n",
77
+ "def map_relationship(row):\n",
78
+ " \"\"\"\n",
79
+ " For a row determine which node and relationship should be added to the graph\n",
80
+ " If a relevant filter has been applied then we only want to graph nodes that\n",
81
+ " are descendants or ancestors of the relevant nodes\n",
82
+ " \"\"\"\n",
83
+ " # Check if dependantType node already added\n",
84
+ " if row[\"dependantType\"] not in added_nodes:\n",
85
+ " if filter_to_relevant != \"\":\n",
86
+ " if row[\"dependantType\"] in relevant_nodes:\n",
87
+ " dot.node(\n",
88
+ " row[\"dependantType\"],\n",
89
+ " shape=node_shape,\n",
90
+ " style=\"filled\",\n",
91
+ " fillcolor=palette.__moderne_color_map[\"red\"][200],\n",
92
+ " )\n",
93
+ " added_nodes.add(row[\"dependantType\"])\n",
94
+ " if row[\"dependantType\"] in ancestor_nodes:\n",
95
+ " dot.node(\n",
96
+ " row[\"dependantType\"],\n",
97
+ " shape=node_shape,\n",
98
+ " style=\"filled\",\n",
99
+ " fillcolor=palette.__moderne_color_map[\"blue\"][200],\n",
100
+ " )\n",
101
+ " added_nodes.add(row[\"dependantType\"])\n",
102
+ " else:\n",
103
+ " dot.node(\n",
104
+ " row[\"dependantType\"],\n",
105
+ " shape=node_shape,\n",
106
+ " style=\"filled\",\n",
107
+ " fillcolor=palette.__moderne_color_map[\"blue\"][200],\n",
108
+ " )\n",
109
+ " added_nodes.add(row[\"dependantType\"])\n",
110
+ "\n",
111
+ " # Check if dependencyType node already added\n",
112
+ " if row[\"dependencyType\"] not in added_nodes:\n",
113
+ " if filter_to_relevant != \"\":\n",
114
+ " if row[\"dependencyType\"] in relevant_nodes:\n",
115
+ " dot.node(\n",
116
+ " row[\"dependencyType\"],\n",
117
+ " shape=node_shape,\n",
118
+ " style=\"filled\",\n",
119
+ " fillcolor=palette.__moderne_color_map[\"red\"][200],\n",
120
+ " )\n",
121
+ " added_nodes.add(row[\"dependantType\"])\n",
122
+ " if row[\"dependencyType\"] in descendant_nodes:\n",
123
+ " dot.node(\n",
124
+ " row[\"dependencyType\"],\n",
125
+ " shape=node_shape,\n",
126
+ " style=\"filled\",\n",
127
+ " fillcolor=palette.__moderne_color_map[\"blue\"][200],\n",
128
+ " )\n",
129
+ " added_nodes.add(row[\"dependencyType\"])\n",
130
+ " else:\n",
131
+ " dot.node(\n",
132
+ " row[\"dependencyType\"],\n",
133
+ " shape=node_shape,\n",
134
+ " style=\"filled\",\n",
135
+ " fillcolor=palette.__moderne_color_map[\"blue\"][200],\n",
136
+ " )\n",
137
+ " added_nodes.add(row[\"dependencyType\"])\n",
138
+ "\n",
139
+ " # Add edge\n",
140
+ " if (row[\"dependantType\"], row[\"dependencyType\"]) not in added_edges:\n",
141
+ " if filter_to_relevant != \"\":\n",
142
+ " if row[\"dependantType\"] in descendant_nodes:\n",
143
+ " dot.edge(row[\"dependantType\"], row[\"dependencyType\"])\n",
144
+ " added_edges.add((row[\"dependantType\"], row[\"dependencyType\"]))\n",
145
+ " if row[\"dependencyType\"] in ancestor_nodes:\n",
146
+ " dot.edge(row[\"dependantType\"], row[\"dependencyType\"])\n",
147
+ " added_edges.add((row[\"dependantType\"], row[\"dependencyType\"]))\n",
148
+ " if row[\"dependantType\"] in relevant_nodes:\n",
149
+ " dot.edge(row[\"dependantType\"], row[\"dependencyType\"])\n",
150
+ " added_edges.add((row[\"dependantType\"], row[\"dependencyType\"]))\n",
151
+ " if row[\"dependencyType\"] in relevant_nodes:\n",
152
+ " dot.edge(row[\"dependantType\"], row[\"dependencyType\"])\n",
153
+ " added_edges.add((row[\"dependantType\"], row[\"dependencyType\"]))\n",
154
+ " else:\n",
155
+ " dot.edge(row[\"dependantType\"], row[\"dependencyType\"])\n",
156
+ " added_edges.add((row[\"dependantType\"], row[\"dependencyType\"]))\n",
157
+ "\n",
158
+ "\n",
159
+ "# Apply mapping to each row\n",
160
+ "df.apply(map_relationship, axis=1)\n",
161
+ "\n",
162
+ "# Display the graph\n",
163
+ "dot"
164
+ ]
165
+ }
166
+ ],
167
+ "metadata": {
168
+ "kernelspec": {
169
+ "display_name": "Python 3",
170
+ "language": "python",
171
+ "name": "python3"
172
+ },
173
+ "language_info": {
174
+ "codemirror_mode": {
175
+ "name": "ipython",
176
+ "version": 3
177
+ },
178
+ "file_extension": ".py",
179
+ "mimetype": "text/x-python",
180
+ "name": "python",
181
+ "nbconvert_exporter": "python",
182
+ "pygments_lexer": "ipython3",
183
+ "version": "3.11.4"
184
+ }
185
+ },
186
+ "nbformat": 4,
187
+ "nbformat_minor": 2
189
188
  }
@@ -0,0 +1,110 @@
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "UI5Lint rule treemap"
8
+ ]
9
+ },
10
+ {
11
+ "cell_type": "code",
12
+ "execution_count": null,
13
+ "metadata": {},
14
+ "outputs": [],
15
+ "source": [
16
+ "import plotly.express as px\n",
17
+ "from code_data_science import data_table as dt\n",
18
+ "import code_data_science.palette as palette\n",
19
+ "\n",
20
+ "df = dt.read_csv(\"../samples/ui5_lint.csv\")\n",
21
+ "df[\"problems\"] = 1\n",
22
+ "\n",
23
+ "if len(df) == 0:\n",
24
+ " fig = px.treemap(names=[], parents=[])\n",
25
+ " fig.add_annotation(\n",
26
+ " x=0.5, y=0.5, text=\"No rows of data found\", showarrow=False, font=dict(size=20)\n",
27
+ " )\n",
28
+ "else:\n",
29
+ " # concat origin:path:branch into repository\n",
30
+ " df[\"repository\"] = (\n",
31
+ " df[\"repositoryOrigin\"]\n",
32
+ " + \":\"\n",
33
+ " + df[\"repositoryPath\"]\n",
34
+ " + \":\"\n",
35
+ " + df[\"repositoryBranch\"]\n",
36
+ " )\n",
37
+ " df[\"fileType\"] = df[\"sourcePath\"].str.split(\".\").str[-1]\n",
38
+ " df_file_grouped = df.groupby(\n",
39
+ " by=[\"ruleId\", \"repository\", \"fileType\"],\n",
40
+ " as_index=False,\n",
41
+ " ).sum(numeric_only=True)\n",
42
+ "\n",
43
+ " path = [\"ruleId\", \"repository\"]\n",
44
+ "\n",
45
+ " # number of rows in the dataframe\n",
46
+ " total_problems = len(df[\"sourcePath\"])\n",
47
+ "\n",
48
+ " measurement_field = \"problems\"\n",
49
+ "\n",
50
+ " # Set the color palette\n",
51
+ " colors = palette.qualitative()\n",
52
+ "\n",
53
+ " fig = px.treemap(\n",
54
+ " df_file_grouped,\n",
55
+ " path=path,\n",
56
+ " values=measurement_field,\n",
57
+ " color_discrete_sequence=colors,\n",
58
+ " )\n",
59
+ "\n",
60
+ " fig.update_layout(\n",
61
+ " margin=dict(t=28, l=0, r=0, b=0),\n",
62
+ " annotations=[\n",
63
+ " dict(\n",
64
+ " x=0.01,\n",
65
+ " y=1.055,\n",
66
+ " showarrow=False,\n",
67
+ " borderwidth=1,\n",
68
+ " text=\"<b>More info</b>\",\n",
69
+ " hovertext=(\n",
70
+ " f\"\"\"\n",
71
+ " <b>Total problems:</b> {\"{:,}\".format(total_problems)} </br> </br>\n",
72
+ " \"\"\"\n",
73
+ " ),\n",
74
+ " xref=\"paper\",\n",
75
+ " yref=\"paper\",\n",
76
+ " )\n",
77
+ " ],\n",
78
+ " )\n",
79
+ "\n",
80
+ " fig.update_traces(\n",
81
+ " marker=dict(cornerradius=3),\n",
82
+ " )\n",
83
+ "\n",
84
+ " fig.data[0].textinfo = \"label+text+value\"\n",
85
+ " fig.show()"
86
+ ]
87
+ }
88
+ ],
89
+ "metadata": {
90
+ "kernelspec": {
91
+ "display_name": ".venv",
92
+ "language": "python",
93
+ "name": "python3"
94
+ },
95
+ "language_info": {
96
+ "codemirror_mode": {
97
+ "name": "ipython",
98
+ "version": 3
99
+ },
100
+ "file_extension": ".py",
101
+ "mimetype": "text/x-python",
102
+ "name": "python",
103
+ "nbconvert_exporter": "python",
104
+ "pygments_lexer": "ipython3",
105
+ "version": "3.9.6"
106
+ }
107
+ },
108
+ "nbformat": 4,
109
+ "nbformat_minor": 4
110
+ }
@@ -0,0 +1,76 @@
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "UI5Lint violations heatmap"
8
+ ]
9
+ },
10
+ {
11
+ "cell_type": "code",
12
+ "execution_count": null,
13
+ "metadata": {},
14
+ "outputs": [],
15
+ "source": [
16
+ "import plotly.express as px\n",
17
+ "from code_data_science import data_table as dt\n",
18
+ "import code_data_science.palette as palette\n",
19
+ "\n",
20
+ "df = dt.read_csv(\"../samples/ui5_lint.csv\")\n",
21
+ "\n",
22
+ "df[\"repository\"] = df[\"repositoryPath\"] + \":\" + df[\"repositoryBranch\"]\n",
23
+ "\n",
24
+ "df_heat = df.groupby([\"repository\", \"ruleId\"]).size().reset_index(name=\"count\")\n",
25
+ "\n",
26
+ "pivot_table = df_heat.pivot(\n",
27
+ " index=\"repository\", columns=\"ruleId\", values=\"count\"\n",
28
+ ").fillna(0)\n",
29
+ "\n",
30
+ "colors = palette.color_gradient(\"yellow\")[0:4] + palette.color_gradient(\"red\")[3:6]\n",
31
+ "\n",
32
+ "fig_heat = px.imshow(\n",
33
+ " pivot_table,\n",
34
+ " text_auto=True,\n",
35
+ " aspect=\"auto\",\n",
36
+ " title=\"Heatmap of Rule Violations by Repository\",\n",
37
+ " color_continuous_scale=colors,\n",
38
+ ")\n",
39
+ "\n",
40
+ "fig_heat.update_traces(\n",
41
+ " hovertemplate=\"Rule id: %{x}<br>Repository: %{y}<br>Count: %{z}<extra></extra>\"\n",
42
+ ")\n",
43
+ "\n",
44
+ "fig_heat.show()"
45
+ ]
46
+ },
47
+ {
48
+ "cell_type": "code",
49
+ "execution_count": null,
50
+ "metadata": {},
51
+ "outputs": [],
52
+ "source": []
53
+ }
54
+ ],
55
+ "metadata": {
56
+ "kernelspec": {
57
+ "display_name": ".venv",
58
+ "language": "python",
59
+ "name": "python3"
60
+ },
61
+ "language_info": {
62
+ "codemirror_mode": {
63
+ "name": "ipython",
64
+ "version": 3
65
+ },
66
+ "file_extension": ".py",
67
+ "mimetype": "text/x-python",
68
+ "name": "python",
69
+ "nbconvert_exporter": "python",
70
+ "pygments_lexer": "ipython3",
71
+ "version": "3.9.6"
72
+ }
73
+ },
74
+ "nbformat": 4,
75
+ "nbformat_minor": 4
76
+ }