danaleo 3.0.0__tar.gz
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.
- danaleo-3.0.0/LICENSE +21 -0
- danaleo-3.0.0/MANIFEST.in +3 -0
- danaleo-3.0.0/PKG-INFO +405 -0
- danaleo-3.0.0/README.md +354 -0
- danaleo-3.0.0/pyproject.toml +83 -0
- danaleo-3.0.0/setup.cfg +4 -0
- danaleo-3.0.0/src/danaleo/__init__.py +2 -0
- danaleo-3.0.0/src/danaleo/__main__.py +5 -0
- danaleo-3.0.0/src/danaleo/cli.py +14 -0
- danaleo-3.0.0/src/danaleo/core/__init__.py +0 -0
- danaleo-3.0.0/src/danaleo/core/data_ingestion.py +711 -0
- danaleo-3.0.0/src/danaleo/core/exporter.py +569 -0
- danaleo-3.0.0/src/danaleo/core/operations.py +234 -0
- danaleo-3.0.0/src/danaleo/core/plots.py +812 -0
- danaleo-3.0.0/src/danaleo/core/session_store.py +969 -0
- danaleo-3.0.0/src/danaleo/core/stats.py +151 -0
- danaleo-3.0.0/src/danaleo/main.py +286 -0
- danaleo-3.0.0/src/danaleo/server/__init__.py +0 -0
- danaleo-3.0.0/src/danaleo/server/app.py +314 -0
- danaleo-3.0.0/src/danaleo/server/models.py +59 -0
- danaleo-3.0.0/src/danaleo/server/static/assets/index-CQoQ9213.js +15 -0
- danaleo-3.0.0/src/danaleo/server/static/assets/index-DKSZqKUG.css +1 -0
- danaleo-3.0.0/src/danaleo/server/static/index.html +16 -0
- danaleo-3.0.0/src/danaleo.egg-info/PKG-INFO +405 -0
- danaleo-3.0.0/src/danaleo.egg-info/SOURCES.txt +39 -0
- danaleo-3.0.0/src/danaleo.egg-info/dependency_links.txt +1 -0
- danaleo-3.0.0/src/danaleo.egg-info/entry_points.txt +2 -0
- danaleo-3.0.0/src/danaleo.egg-info/requires.txt +23 -0
- danaleo-3.0.0/src/danaleo.egg-info/top_level.txt +1 -0
- danaleo-3.0.0/tests/test_api.py +521 -0
- danaleo-3.0.0/tests/test_data_ingestion.py +356 -0
- danaleo-3.0.0/tests/test_exporter.py +738 -0
- danaleo-3.0.0/tests/test_frontend_regressions.py +415 -0
- danaleo-3.0.0/tests/test_main.py +198 -0
- danaleo-3.0.0/tests/test_models.py +46 -0
- danaleo-3.0.0/tests/test_notebook_multi_export.py +233 -0
- danaleo-3.0.0/tests/test_operations.py +360 -0
- danaleo-3.0.0/tests/test_packaging.py +53 -0
- danaleo-3.0.0/tests/test_plots.py +332 -0
- danaleo-3.0.0/tests/test_session_store.py +972 -0
- danaleo-3.0.0/tests/test_stats.py +149 -0
danaleo-3.0.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Danaleo
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
danaleo-3.0.0/PKG-INFO
ADDED
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: danaleo
|
|
3
|
+
Version: 3.0.0
|
|
4
|
+
Summary: Localhost interactive EDA workspace for tabular data files
|
|
5
|
+
Author: Danaleo
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/RP28/Danaleo-3.0
|
|
8
|
+
Project-URL: Repository, https://github.com/RP28/Danaleo-3.0
|
|
9
|
+
Project-URL: Issues, https://github.com/RP28/Danaleo-3.0/issues
|
|
10
|
+
Keywords: data-analysis,data-visualization,eda,pandas,fastapi
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Environment :: Web Environment
|
|
13
|
+
Classifier: Framework :: FastAPI
|
|
14
|
+
Classifier: Intended Audience :: Developers
|
|
15
|
+
Classifier: Intended Audience :: Science/Research
|
|
16
|
+
Classifier: Operating System :: OS Independent
|
|
17
|
+
Classifier: Programming Language :: Python :: 3
|
|
18
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
24
|
+
Classifier: Topic :: Scientific/Engineering :: Information Analysis
|
|
25
|
+
Requires-Python: >=3.10
|
|
26
|
+
Description-Content-Type: text/markdown
|
|
27
|
+
License-File: LICENSE
|
|
28
|
+
Requires-Dist: fastapi>=0.115
|
|
29
|
+
Requires-Dist: uvicorn[standard]>=0.30
|
|
30
|
+
Requires-Dist: python-multipart>=0.0.9
|
|
31
|
+
Requires-Dist: pandas>=2.2
|
|
32
|
+
Requires-Dist: numpy>=1.26
|
|
33
|
+
Requires-Dist: plotly>=5.22
|
|
34
|
+
Requires-Dist: matplotlib>=3.8
|
|
35
|
+
Requires-Dist: seaborn>=0.13
|
|
36
|
+
Requires-Dist: nbformat>=5.10
|
|
37
|
+
Requires-Dist: pydantic>=2.7
|
|
38
|
+
Requires-Dist: openpyxl>=3.1
|
|
39
|
+
Requires-Dist: xlrd>=2.0
|
|
40
|
+
Requires-Dist: odfpy>=1.4
|
|
41
|
+
Requires-Dist: pyxlsb>=1.0
|
|
42
|
+
Requires-Dist: pyarrow>=16.0
|
|
43
|
+
Requires-Dist: tables>=3.9
|
|
44
|
+
Provides-Extra: dev
|
|
45
|
+
Requires-Dist: build>=1.2; extra == "dev"
|
|
46
|
+
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
47
|
+
Requires-Dist: httpx>=0.27; extra == "dev"
|
|
48
|
+
Requires-Dist: ruff>=0.6; extra == "dev"
|
|
49
|
+
Requires-Dist: twine>=5.1; extra == "dev"
|
|
50
|
+
Dynamic: license-file
|
|
51
|
+
|
|
52
|
+
# Danaleo 3.0
|
|
53
|
+
|
|
54
|
+
Danaleo is a local interactive EDA workspace for tabular data files.
|
|
55
|
+
|
|
56
|
+
It runs a Python FastAPI backend and a React UI on localhost. You can upload multiple data files into separate dataset tabs, inspect columns, create dataframe sessions, apply operations, build plots, save plots with notes, view session history as a tree, and export the active analysis as a Jupyter notebook.
|
|
57
|
+
|
|
58
|
+
## Features
|
|
59
|
+
|
|
60
|
+
* Upload multiple tabular data files into independent dataset tabs
|
|
61
|
+
* Save and restore every open data file, session, and plot in one `.danaleo` workspace
|
|
62
|
+
* Visually merge two dataset session snapshots with inner, left, right, full outer, or cross joins
|
|
63
|
+
* Preview merge match diagnostics and validate one-to-one, one-to-many, or many-to-one relationships
|
|
64
|
+
* Optional sampling during upload
|
|
65
|
+
* Column overview and column-level statistics
|
|
66
|
+
* Overview-first dataset profile with quality flags, correlations, and row preview
|
|
67
|
+
* Dataframe sessions and branching
|
|
68
|
+
* Session tree with operation history
|
|
69
|
+
* Rename, activate, and delete sessions
|
|
70
|
+
* Filter rows using pandas-style queries
|
|
71
|
+
* Drop columns
|
|
72
|
+
* Automatically detect common CSV separators and text encodings
|
|
73
|
+
* Read JSON/JSON Lines, Excel/OpenDocument, Parquet, Feather, ORC, Stata, SAS, and HDF files
|
|
74
|
+
* Open compressed delimited-text and JSON files (`.gz`, `.bz2`, `.xz`, and single-file `.zip`)
|
|
75
|
+
* Drop missing values
|
|
76
|
+
* Drop exact duplicate rows
|
|
77
|
+
* Replace values with custom values, missing values, mean, median, or mode
|
|
78
|
+
* Impute missing values
|
|
79
|
+
* One-hot and ordinal encoding
|
|
80
|
+
* Min-max scaling and standardization
|
|
81
|
+
* Plot numeric and categorical columns
|
|
82
|
+
* Top-N plots for categorical and numeric columns
|
|
83
|
+
* Grouped plots
|
|
84
|
+
* Multi-column subplot-style plotting
|
|
85
|
+
* Scatter, hexbin, line relationship, correlation heatmap, and missing-values plots
|
|
86
|
+
* Shared chart title, grid, log-axis, sorting, orientation, marker, and opacity controls
|
|
87
|
+
* Save plots with export notes
|
|
88
|
+
* Include or skip saved plots across every dataset tab during notebook export
|
|
89
|
+
* Export EDA workflow to `.ipynb`
|
|
90
|
+
* Exported notebooks use concise pandas, NumPy, Matplotlib, and Seaborn code without requiring Danaleo
|
|
91
|
+
* Exported merged datasets recreate available join chains with direct `pd.merge(...)` code
|
|
92
|
+
* Local browser-based UI
|
|
93
|
+
|
|
94
|
+
## Requirements
|
|
95
|
+
|
|
96
|
+
* Python 3.10+
|
|
97
|
+
* Node.js/npm only if the frontend UI needs to be rebuilt from source
|
|
98
|
+
|
|
99
|
+
For normal Python usage, install the package with pip. For frontend development, Node.js/npm is required.
|
|
100
|
+
|
|
101
|
+
## Setup
|
|
102
|
+
|
|
103
|
+
Install the released package from PyPI:
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
python3 -m pip install danaleo
|
|
107
|
+
danaleo
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
To install from a cloned repository:
|
|
111
|
+
|
|
112
|
+
Clone the repo:
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
git clone https://github.com/RP28/Danaleo-3.0.git
|
|
116
|
+
cd Danaleo-3.0
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Create and activate a virtual environment:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
python3 -m venv .venv
|
|
123
|
+
source .venv/bin/activate
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Install Danaleo and Python dependencies:
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
python3 -m pip install -e .
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
For development and tests:
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
python3 -m pip install -e ".[dev]"
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Run
|
|
139
|
+
|
|
140
|
+
Start Danaleo with:
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
python3 -m danaleo
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Or use the installed CLI command:
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
danaleo
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Then open:
|
|
153
|
+
|
|
154
|
+
```text
|
|
155
|
+
http://127.0.0.1:8765
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
The browser should open automatically. If it does not, copy the printed URL into your browser.
|
|
159
|
+
|
|
160
|
+
## Useful startup commands
|
|
161
|
+
|
|
162
|
+
Run without opening the browser:
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
danaleo --no-browser
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Run on another port:
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
danaleo --port 8766
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Use a different host:
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
danaleo --host 0.0.0.0 --port 8765
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Force rebuild the frontend before starting:
|
|
181
|
+
|
|
182
|
+
```bash
|
|
183
|
+
danaleo --build-ui
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Only build the frontend and exit:
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
danaleo --build-ui-only
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
Build the frontend without running `npm install` or `npm ci`:
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
danaleo --build-ui-only --skip-npm-install
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Start without automatically building the UI if static files are missing:
|
|
199
|
+
|
|
200
|
+
```bash
|
|
201
|
+
danaleo --no-build-ui
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
Skip Python dependency checks:
|
|
205
|
+
|
|
206
|
+
```bash
|
|
207
|
+
danaleo --no-check-env
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## If the port is already in use
|
|
211
|
+
|
|
212
|
+
Use another port:
|
|
213
|
+
|
|
214
|
+
```bash
|
|
215
|
+
danaleo --port 8766
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
Or stop the old process on macOS/Linux:
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
kill -9 $(lsof -ti :8765)
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
## Frontend build
|
|
225
|
+
|
|
226
|
+
The React frontend lives in:
|
|
227
|
+
|
|
228
|
+
```text
|
|
229
|
+
frontend/
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
The production build is written into:
|
|
233
|
+
|
|
234
|
+
```text
|
|
235
|
+
src/danaleo/server/static/
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
To rebuild manually:
|
|
239
|
+
|
|
240
|
+
```bash
|
|
241
|
+
cd frontend
|
|
242
|
+
npm install
|
|
243
|
+
npm run build
|
|
244
|
+
cd ..
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
The startup script can also build the frontend automatically when the static UI is missing, as long as Node.js/npm is available.
|
|
248
|
+
|
|
249
|
+
Generated frontend build files such as the following are committed and included in the Python package:
|
|
250
|
+
|
|
251
|
+
```text
|
|
252
|
+
src/danaleo/server/static/index.html
|
|
253
|
+
src/danaleo/server/static/assets/index-*.js
|
|
254
|
+
src/danaleo/server/static/assets/index-*.css
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
Regenerate them after frontend changes with:
|
|
258
|
+
|
|
259
|
+
```bash
|
|
260
|
+
cd frontend
|
|
261
|
+
npm run build
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
Keeping these assets in the repository ensures `pip install` from a clean checkout includes a usable UI without requiring Node.js on the end user's machine.
|
|
265
|
+
|
|
266
|
+
## Development workflow
|
|
267
|
+
|
|
268
|
+
Install Python dev dependencies:
|
|
269
|
+
|
|
270
|
+
```bash
|
|
271
|
+
python3 -m pip install -e ".[dev]"
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
Run the backend/local app:
|
|
275
|
+
|
|
276
|
+
```bash
|
|
277
|
+
danaleo --no-browser
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
Run the frontend dev server in another terminal:
|
|
281
|
+
|
|
282
|
+
```bash
|
|
283
|
+
cd frontend
|
|
284
|
+
npm install
|
|
285
|
+
npm run dev
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
The frontend dev server is useful when actively editing React components.
|
|
289
|
+
|
|
290
|
+
## Tests
|
|
291
|
+
|
|
292
|
+
Run all tests:
|
|
293
|
+
|
|
294
|
+
```bash
|
|
295
|
+
python3 -m pytest
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
Run with verbose output:
|
|
299
|
+
|
|
300
|
+
```bash
|
|
301
|
+
python3 -m pytest -vv
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
Save test output to a log file:
|
|
305
|
+
|
|
306
|
+
```bash
|
|
307
|
+
python3 -m pytest -vv 2>&1 | tee pytest.log
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
## Query examples
|
|
311
|
+
|
|
312
|
+
For normal column names:
|
|
313
|
+
|
|
314
|
+
```python
|
|
315
|
+
age >= 18 and income > 0
|
|
316
|
+
```
|
|
317
|
+
|
|
318
|
+
For column names with spaces:
|
|
319
|
+
|
|
320
|
+
```python
|
|
321
|
+
`Age Years` >= 18
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
For string values:
|
|
325
|
+
|
|
326
|
+
```python
|
|
327
|
+
city == "Sydney"
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
For missing-value checks, use pandas query syntax where applicable, or use the built-in drop-missing operation from the UI.
|
|
331
|
+
|
|
332
|
+
## Notebook export
|
|
333
|
+
|
|
334
|
+
Use the export option in the UI to download a Jupyter notebook.
|
|
335
|
+
|
|
336
|
+
The exported notebook attempts to recreate the EDA workflow, including:
|
|
337
|
+
|
|
338
|
+
* Tabular data-file loading
|
|
339
|
+
* Sampling
|
|
340
|
+
* Session creation
|
|
341
|
+
* Session operations
|
|
342
|
+
* Saved plots selected for export
|
|
343
|
+
* Plot notes and remarks
|
|
344
|
+
|
|
345
|
+
## Python entry point
|
|
346
|
+
|
|
347
|
+
Danaleo can also be started from Python:
|
|
348
|
+
|
|
349
|
+
```python
|
|
350
|
+
from danaleo.main import start
|
|
351
|
+
|
|
352
|
+
start()
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
Example with custom options:
|
|
356
|
+
|
|
357
|
+
```python
|
|
358
|
+
from danaleo.main import start
|
|
359
|
+
|
|
360
|
+
start(
|
|
361
|
+
host="127.0.0.1",
|
|
362
|
+
port=8766,
|
|
363
|
+
open_browser=False,
|
|
364
|
+
build_ui=True,
|
|
365
|
+
)
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
## Package notes
|
|
369
|
+
|
|
370
|
+
The Python package supports both command-line entry points:
|
|
371
|
+
|
|
372
|
+
```bash
|
|
373
|
+
danaleo
|
|
374
|
+
python3 -m danaleo
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
The wheel includes the built static frontend files under:
|
|
378
|
+
|
|
379
|
+
```text
|
|
380
|
+
src/danaleo/server/static/
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
Install release tooling and build the distributable wheel and source archive:
|
|
384
|
+
|
|
385
|
+
```bash
|
|
386
|
+
python3 -m pip install -e ".[dev]"
|
|
387
|
+
./scripts/build_package.sh
|
|
388
|
+
```
|
|
389
|
+
|
|
390
|
+
The script rebuilds the React UI, creates both distributions in `dist/`, and validates their metadata with Twine.
|
|
391
|
+
|
|
392
|
+
## Project structure
|
|
393
|
+
|
|
394
|
+
```text
|
|
395
|
+
Danaleo-3.0/
|
|
396
|
+
├── frontend/ # React UI
|
|
397
|
+
├── src/
|
|
398
|
+
│ └── danaleo/
|
|
399
|
+
│ ├── core/ # EDA logic, sessions, plots, exporter
|
|
400
|
+
│ ├── server/ # FastAPI app and static UI serving
|
|
401
|
+
│ └── main.py # CLI/startup entry point
|
|
402
|
+
├── tests/ # pytest test suite
|
|
403
|
+
├── pyproject.toml # Python packaging config
|
|
404
|
+
└── README.md
|
|
405
|
+
```
|