cakiki commited on
Commit
1048854
1 Parent(s): 8f38043
Files changed (6) hide show
  1. .gitignore +1 -0
  2. Dockerfile +3 -0
  3. Makefile +13 -0
  4. adult.csv +0 -0
  5. facets-overview.ipynb +154 -0
  6. index.html +7 -0
.gitignore ADDED
@@ -0,0 +1 @@
 
 
1
+ .ipynb_checkpoints/
Dockerfile ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ FROM jupyter/base-notebook:latest
2
+
3
+ RUN pip install --use-feature=2020-resolver pandas facets-overview
Makefile ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ VERSION := 0.0.1
2
+ NAME := facets-dive
3
+ REPO := cakiki
4
+
5
+ build:
6
+ docker build -f Dockerfile -t ${REPO}/${NAME}:${VERSION} -t ${REPO}/${NAME}:latest .
7
+
8
+ run: build
9
+ docker run --rm -it -p 8888:8888 --mount type=bind,source=${PWD},target=/home/jovyan/work --name ${NAME} --workdir=/home/jovyan/work ${REPO}/${NAME}:${VERSION}
10
+
11
+ push: build
12
+ docker push ${REPO}/${NAME}:${VERSION} && docker push ${REPO}/${NAME}:latest
13
+
adult.csv ADDED
The diff for this file is too large to render. See raw diff
 
facets-overview.ipynb ADDED
@@ -0,0 +1,154 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "code",
5
+ "execution_count": 1,
6
+ "id": "d5d0ea64",
7
+ "metadata": {},
8
+ "outputs": [
9
+ {
10
+ "data": {
11
+ "text/html": [
12
+ "<style>.container { width:95% !important; }</style>"
13
+ ],
14
+ "text/plain": [
15
+ "<IPython.core.display.HTML object>"
16
+ ]
17
+ },
18
+ "metadata": {},
19
+ "output_type": "display_data"
20
+ }
21
+ ],
22
+ "source": [
23
+ "from IPython.core.display import display, HTML, Image\n",
24
+ "display(HTML(\"<style>.container { width:95% !important; }</style>\"))\n",
25
+ "%config IPCompleter.use_jedi=False"
26
+ ]
27
+ },
28
+ {
29
+ "cell_type": "code",
30
+ "execution_count": 2,
31
+ "id": "403c4b8a",
32
+ "metadata": {},
33
+ "outputs": [],
34
+ "source": [
35
+ "import pandas as pd\n",
36
+ "from IPython.display import Markdown, display, HTML, IFrame\n",
37
+ "from facets_overview.generic_feature_statistics_generator import GenericFeatureStatisticsGenerator\n",
38
+ "import base64"
39
+ ]
40
+ },
41
+ {
42
+ "cell_type": "code",
43
+ "execution_count": 3,
44
+ "id": "1c48706a",
45
+ "metadata": {},
46
+ "outputs": [],
47
+ "source": [
48
+ "df = pd.read_csv('./adult.csv')"
49
+ ]
50
+ },
51
+ {
52
+ "cell_type": "code",
53
+ "execution_count": 5,
54
+ "id": "b512f166",
55
+ "metadata": {},
56
+ "outputs": [
57
+ {
58
+ "name": "stdout",
59
+ "output_type": "stream",
60
+ "text": [
61
+ "<class 'pandas.core.frame.DataFrame'>\n",
62
+ "RangeIndex: 32561 entries, 0 to 32560\n",
63
+ "Data columns (total 15 columns):\n",
64
+ " # Column Non-Null Count Dtype \n",
65
+ "--- ------ -------------- ----- \n",
66
+ " 0 age 32561 non-null int64 \n",
67
+ " 1 workclass 32561 non-null object\n",
68
+ " 2 fnlwgt 32561 non-null int64 \n",
69
+ " 3 education 32561 non-null object\n",
70
+ " 4 education.num 32561 non-null int64 \n",
71
+ " 5 marital.status 32561 non-null object\n",
72
+ " 6 occupation 32561 non-null object\n",
73
+ " 7 relationship 32561 non-null object\n",
74
+ " 8 race 32561 non-null object\n",
75
+ " 9 sex 32561 non-null object\n",
76
+ " 10 capital.gain 32561 non-null int64 \n",
77
+ " 11 capital.loss 32561 non-null int64 \n",
78
+ " 12 hours.per.week 32561 non-null int64 \n",
79
+ " 13 native.country 32561 non-null object\n",
80
+ " 14 income 32561 non-null object\n",
81
+ "dtypes: int64(6), object(9)\n",
82
+ "memory usage: 3.7+ MB\n"
83
+ ]
84
+ }
85
+ ],
86
+ "source": [
87
+ "df.info()"
88
+ ]
89
+ },
90
+ {
91
+ "cell_type": "code",
92
+ "execution_count": 4,
93
+ "id": "fce8e9f4",
94
+ "metadata": {},
95
+ "outputs": [
96
+ {
97
+ "ename": "TypeError",
98
+ "evalue": "string indices must be integers",
99
+ "output_type": "error",
100
+ "traceback": [
101
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
102
+ "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)",
103
+ "\u001b[0;32m/tmp/ipykernel_28/1621212634.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mproto\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mGenericFeatureStatisticsGenerator\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mProtoFromDataFrames\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdf\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mprotostr\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mbase64\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mb64encode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mproto\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mSerializeToString\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdecode\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"utf-8\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m HTML_TEMPLATE = \"\"\"\n\u001b[1;32m 4\u001b[0m \u001b[0;34m<\u001b[0m\u001b[0mscript\u001b[0m \u001b[0msrc\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"https://cdnjs.cloudflare.com/ajax/libs/webcomponentsjs/1.3.3/webcomponents-lite.js\"\u001b[0m\u001b[0;34m>\u001b[0m\u001b[0;34m<\u001b[0m\u001b[0;34m/\u001b[0m\u001b[0mscript\u001b[0m\u001b[0;34m>\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 5\u001b[0m \u001b[0;34m<\u001b[0m\u001b[0mlink\u001b[0m \u001b[0mrel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"import\"\u001b[0m \u001b[0mhref\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"https://raw.githubusercontent.com/PAIR-code/facets/1.0.0/facets-dist/facets-jupyter.html\"\u001b[0m\u001b[0;34m>\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
104
+ "\u001b[0;32m/opt/conda/lib/python3.9/site-packages/facets_overview/base_generic_feature_statistics_generator.py\u001b[0m in \u001b[0;36mProtoFromDataFrames\u001b[0;34m(self, dataframes, histogram_categorical_levels_count)\u001b[0m\n\u001b[1;32m 49\u001b[0m \u001b[0mdatasets\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 50\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mdataframe\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mdataframes\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 51\u001b[0;31m \u001b[0mtable\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdataframe\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'table'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 52\u001b[0m \u001b[0mtable_entries\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 53\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mcol\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtable\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
105
+ "\u001b[0;31mTypeError\u001b[0m: string indices must be integers"
106
+ ]
107
+ }
108
+ ],
109
+ "source": [
110
+ "proto = GenericFeatureStatisticsGenerator().ProtoFromDataFrames(df)\n",
111
+ "protostr = base64.b64encode(proto.SerializeToString()).decode(\"utf-8\")\n",
112
+ "HTML_TEMPLATE = \"\"\"\n",
113
+ " <script src=\"https://cdnjs.cloudflare.com/ajax/libs/webcomponentsjs/1.3.3/webcomponents-lite.js\"></script>\n",
114
+ " <link rel=\"import\" href=\"https://raw.githubusercontent.com/PAIR-code/facets/1.0.0/facets-dist/facets-jupyter.html\">\n",
115
+ " <facets-overview id=\"elem\"></facets-overview>\n",
116
+ " <script>\n",
117
+ " document.querySelector(\"#elem\").protoInput = \"{protostr}\";\n",
118
+ " </script>\"\"\"\n",
119
+ "html_str = HTML_TEMPLATE.format(protostr=protostr)\n",
120
+ "with open(\"index.html\",'w') as fo:\n",
121
+ " fo.write(html_str)"
122
+ ]
123
+ },
124
+ {
125
+ "cell_type": "code",
126
+ "execution_count": null,
127
+ "id": "c0a817dc",
128
+ "metadata": {},
129
+ "outputs": [],
130
+ "source": []
131
+ }
132
+ ],
133
+ "metadata": {
134
+ "kernelspec": {
135
+ "display_name": "Python 3 (ipykernel)",
136
+ "language": "python",
137
+ "name": "python3"
138
+ },
139
+ "language_info": {
140
+ "codemirror_mode": {
141
+ "name": "ipython",
142
+ "version": 3
143
+ },
144
+ "file_extension": ".py",
145
+ "mimetype": "text/x-python",
146
+ "name": "python",
147
+ "nbconvert_exporter": "python",
148
+ "pygments_lexer": "ipython3",
149
+ "version": "3.9.7"
150
+ }
151
+ },
152
+ "nbformat": 4,
153
+ "nbformat_minor": 5
154
+ }
index.html ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+
2
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/webcomponentsjs/1.3.3/webcomponents-lite.js"></script>
3
+ <link rel="import" href="https://raw.githubusercontent.com/PAIR-code/facets/1.0.0/facets-dist/facets-jupyter.html">
4
+ <facets-overview id="elem"></facets-overview>
5
+ <script>
6
+ document.querySelector("#elem").protoInput = "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";
7
+ </script>