├── .editorconfig ├── .github └── ISSUE_TEMPLATE.md ├── .gitignore ├── .travis.yml ├── AUTHORS.rst ├── CONTRIBUTING.rst ├── DataSynthesizer ├── DataDescriber.py ├── DataGenerator.py ├── ModelInspector.py ├── __init__.py ├── datatypes │ ├── AbstractAttribute.py │ ├── DateTimeAttribute.py │ ├── FloatAttribute.py │ ├── IntegerAttribute.py │ ├── SocialSecurityNumberAttribute.py │ ├── StringAttribute.py │ ├── __init__.py │ └── utils │ │ ├── AttributeLoader.py │ │ ├── DataType.py │ │ └── __init__.py └── lib │ ├── PrivBayes.py │ ├── __init__.py │ └── utils.py ├── HISTORY.md ├── LICENSE ├── MANIFEST.in ├── Makefile ├── README.md ├── docs └── cr-datasynthesizer-privacy.pdf ├── notebooks ├── DataSynthesizer__correlated_attribute_mode.ipynb ├── DataSynthesizer__independent_attribute_mode.ipynb ├── DataSynthesizer__random_mode.ipynb ├── data │ ├── adult_missing.csv │ ├── adult_reduced.csv │ └── adult_ssn.csv └── out │ ├── correlated_attribute_mode │ ├── description.json │ └── sythetic_data.csv │ ├── independent_attribute_mode │ ├── description.json │ └── sythetic_data.csv │ └── random_mode │ ├── description.json │ └── sythetic_data.csv ├── requirements_dev.txt ├── setup.cfg ├── setup.py ├── tests ├── __init__.py ├── data │ └── adult_tiny.csv └── test_DataSynthesizer.py ├── tox.ini └── webUI ├── __init__.py ├── dataResponsiblyUI ├── __init__.py ├── settings.py ├── urls.py ├── views.py └── wsgi.py ├── environment.yml ├── manage.py ├── media └── git_push_placeholder.txt ├── playdata ├── SimulationPairs_N1000_R1000.json ├── SimulationPairs_N51_R1000.json ├── rankingfacts │ ├── CSranking_faculty30.csv │ ├── GermanCredit_age25.csv │ └── ProPublica_gender.csv └── synthesizer │ ├── adult_reduced.csv │ ├── adult_with_missing_values.csv │ └── compas_reduced.csv ├── static ├── bootstrap-slider │ ├── bootstrap-slider.js │ ├── bootstrap-slider.min.js │ └── css │ │ ├── bootstrap-slider.css │ │ └── bootstrap-slider.min.css ├── bootstrap │ ├── css │ │ ├── bootstrap-theme.css │ │ ├── bootstrap-theme.css.map │ │ ├── bootstrap-theme.min.css │ │ ├── bootstrap-theme.min.css.map │ │ ├── bootstrap.css │ │ ├── bootstrap.css.map │ │ ├── bootstrap.min.css │ │ └── bootstrap.min.css.map │ ├── fonts │ │ ├── glyphicons-halflings-regular.eot │ │ ├── glyphicons-halflings-regular.svg │ │ ├── glyphicons-halflings-regular.ttf │ │ ├── glyphicons-halflings-regular.woff │ │ └── glyphicons-halflings-regular.woff2 │ └── js │ │ ├── bootstrap.js │ │ ├── bootstrap.min.js │ │ └── npm.js ├── datatables-plugins │ ├── dataTables.bootstrap.css │ ├── dataTables.bootstrap.js │ ├── dataTables.bootstrap.min.js │ └── index.html ├── datatables-responsive │ ├── dataTables.responsive.css │ ├── dataTables.responsive.js │ └── dataTables.responsive.scss ├── datatables │ ├── extensions │ │ ├── AutoFill │ │ │ ├── License.txt │ │ │ ├── Readme.md │ │ │ ├── css │ │ │ │ ├── autoFill.bootstrap.css │ │ │ │ ├── autoFill.bootstrap.min.css │ │ │ │ ├── autoFill.bootstrap4.css │ │ │ │ ├── autoFill.bootstrap4.min.css │ │ │ │ ├── autoFill.dataTables.css │ │ │ │ ├── autoFill.dataTables.min.css │ │ │ │ ├── autoFill.foundation.css │ │ │ │ ├── autoFill.foundation.min.css │ │ │ │ ├── autoFill.jqueryui.css │ │ │ │ ├── autoFill.jqueryui.min.css │ │ │ │ ├── autoFill.semanticui.css │ │ │ │ └── autoFill.semanticui.min.css │ │ │ ├── examples │ │ │ │ ├── index.html │ │ │ │ ├── initialisation │ │ │ │ │ ├── alwaysAsk.html │ │ │ │ │ ├── columns.html │ │ │ │ │ ├── enableDisable.html │ │ │ │ │ ├── events.html │ │ │ │ │ ├── fills.html │ │ │ │ │ ├── focus.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── keyTable.html │ │ │ │ │ ├── plugins.html │ │ │ │ │ ├── scrolling.html │ │ │ │ │ └── simple.html │ │ │ │ └── styling │ │ │ │ │ ├── bootstrap.html │ │ │ │ │ ├── bootstrap4.html │ │ │ │ │ ├── foundation.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── jqueryui.html │ │ │ │ │ └── semanticui.html │ │ │ └── js │ │ │ │ ├── autoFill.bootstrap.js │ │ │ │ ├── autoFill.bootstrap.min.js │ │ │ │ ├── autoFill.bootstrap4.js │ │ │ │ ├── autoFill.bootstrap4.min.js │ │ │ │ ├── autoFill.foundation.js │ │ │ │ ├── autoFill.foundation.min.js │ │ │ │ ├── autoFill.jqueryui.js │ │ │ │ ├── autoFill.jqueryui.min.js │ │ │ │ ├── autoFill.semanticui.js │ │ │ │ ├── autoFill.semanticui.min.js │ │ │ │ ├── dataTables.autoFill.js │ │ │ │ └── dataTables.autoFill.min.js │ │ ├── Buttons │ │ │ ├── License.txt │ │ │ ├── Readme.md │ │ │ ├── css │ │ │ │ ├── buttons.bootstrap.css │ │ │ │ ├── buttons.bootstrap.min.css │ │ │ │ ├── buttons.bootstrap4.css │ │ │ │ ├── buttons.bootstrap4.min.css │ │ │ │ ├── buttons.dataTables.css │ │ │ │ ├── buttons.dataTables.min.css │ │ │ │ ├── buttons.foundation.css │ │ │ │ ├── buttons.foundation.min.css │ │ │ │ ├── buttons.jqueryui.css │ │ │ │ ├── buttons.jqueryui.min.css │ │ │ │ ├── buttons.semanticui.css │ │ │ │ ├── buttons.semanticui.min.css │ │ │ │ ├── common.scss │ │ │ │ └── mixins.scss │ │ │ ├── examples │ │ │ │ ├── api │ │ │ │ │ ├── addRemove.html │ │ │ │ │ ├── enable.html │ │ │ │ │ ├── group.html │ │ │ │ │ ├── index.html │ │ │ │ │ └── text.html │ │ │ │ ├── column_visibility │ │ │ │ │ ├── columnGroups.html │ │ │ │ │ ├── columnText.html │ │ │ │ │ ├── columns.html │ │ │ │ │ ├── columnsToggle.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── layout.html │ │ │ │ │ ├── restore.html │ │ │ │ │ ├── simple.html │ │ │ │ │ ├── stateSave.html │ │ │ │ │ └── text.html │ │ │ │ ├── flash │ │ │ │ │ ├── copyi18n.html │ │ │ │ │ ├── filename.html │ │ │ │ │ ├── hidden.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── pdfMessage.html │ │ │ │ │ ├── pdfPage.html │ │ │ │ │ ├── simple.html │ │ │ │ │ ├── swfPath.html │ │ │ │ │ └── tsv.html │ │ │ │ ├── html5 │ │ │ │ │ ├── columns.html │ │ │ │ │ ├── copyi18n.html │ │ │ │ │ ├── customFile.html │ │ │ │ │ ├── excelBorder.html │ │ │ │ │ ├── excelCellShading.html │ │ │ │ │ ├── excelTextBold.html │ │ │ │ │ ├── filename.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── outputFormat-function.html │ │ │ │ │ ├── outputFormat-orthogonal.html │ │ │ │ │ ├── pdfImage.html │ │ │ │ │ ├── pdfMessage.html │ │ │ │ │ ├── pdfOpen.html │ │ │ │ │ ├── pdfPage.html │ │ │ │ │ ├── simple.html │ │ │ │ │ └── tsv.html │ │ │ │ ├── index.html │ │ │ │ ├── initialisation │ │ │ │ │ ├── className.html │ │ │ │ │ ├── collections-autoClose.html │ │ │ │ │ ├── collections-sub.html │ │ │ │ │ ├── collections.html │ │ │ │ │ ├── custom.html │ │ │ │ │ ├── export.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── keys.html │ │ │ │ │ ├── multiple.html │ │ │ │ │ ├── new.html │ │ │ │ │ ├── pageLength.html │ │ │ │ │ ├── plugins.html │ │ │ │ │ └── simple.html │ │ │ │ ├── print │ │ │ │ │ ├── autoPrint.html │ │ │ │ │ ├── columns.html │ │ │ │ │ ├── customisation.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── message.html │ │ │ │ │ ├── select.html │ │ │ │ │ └── simple.html │ │ │ │ └── styling │ │ │ │ │ ├── bootstrap.html │ │ │ │ │ ├── bootstrap4.html │ │ │ │ │ ├── foundation.html │ │ │ │ │ ├── icons.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── jqueryui.html │ │ │ │ │ └── semanticui.html │ │ │ ├── js │ │ │ │ ├── buttons.bootstrap.js │ │ │ │ ├── buttons.bootstrap.min.js │ │ │ │ ├── buttons.bootstrap4.js │ │ │ │ ├── buttons.bootstrap4.min.js │ │ │ │ ├── buttons.colVis.js │ │ │ │ ├── buttons.colVis.min.js │ │ │ │ ├── buttons.flash.js │ │ │ │ ├── buttons.flash.min.js │ │ │ │ ├── buttons.foundation.js │ │ │ │ ├── buttons.foundation.min.js │ │ │ │ ├── buttons.html5.js │ │ │ │ ├── buttons.html5.min.js │ │ │ │ ├── buttons.jqueryui.js │ │ │ │ ├── buttons.jqueryui.min.js │ │ │ │ ├── buttons.print.js │ │ │ │ ├── buttons.print.min.js │ │ │ │ ├── buttons.semanticui.js │ │ │ │ ├── buttons.semanticui.min.js │ │ │ │ ├── dataTables.buttons.js │ │ │ │ └── dataTables.buttons.min.js │ │ │ └── swf │ │ │ │ └── flashExport.swf │ │ ├── ColReorder │ │ │ ├── License.txt │ │ │ ├── Readme.md │ │ │ ├── css │ │ │ │ ├── colReorder.bootstrap.css │ │ │ │ ├── colReorder.bootstrap.min.css │ │ │ │ ├── colReorder.bootstrap4.css │ │ │ │ ├── colReorder.bootstrap4.min.css │ │ │ │ ├── colReorder.dataTables.css │ │ │ │ ├── colReorder.dataTables.min.css │ │ │ │ ├── colReorder.foundation.css │ │ │ │ ├── colReorder.foundation.min.css │ │ │ │ ├── colReorder.jqueryui.css │ │ │ │ ├── colReorder.jqueryui.min.css │ │ │ │ ├── colReorder.semanticui.css │ │ │ │ └── colReorder.semanticui.min.css │ │ │ ├── examples │ │ │ │ ├── index.html │ │ │ │ ├── initialisation │ │ │ │ │ ├── col_filter.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── new_init.html │ │ │ │ │ ├── predefined.html │ │ │ │ │ ├── realtime.html │ │ │ │ │ ├── reset.html │ │ │ │ │ ├── scrolling.html │ │ │ │ │ └── simple.html │ │ │ │ ├── integration │ │ │ │ │ ├── colvis.html │ │ │ │ │ ├── fixedcolumns.html │ │ │ │ │ ├── fixedheader.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── responsive.html │ │ │ │ │ ├── server_side.html │ │ │ │ │ └── state_save.html │ │ │ │ └── styling │ │ │ │ │ ├── alt_insert.html │ │ │ │ │ ├── bootstrap.html │ │ │ │ │ ├── bootstrap4.html │ │ │ │ │ ├── foundation.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── jqueryui.html │ │ │ │ │ └── semanticui.html │ │ │ └── js │ │ │ │ ├── dataTables.colReorder.js │ │ │ │ └── dataTables.colReorder.min.js │ │ ├── FixedColumns │ │ │ ├── License.txt │ │ │ ├── Readme.md │ │ │ ├── css │ │ │ │ ├── fixedColumns.bootstrap.css │ │ │ │ ├── fixedColumns.bootstrap.min.css │ │ │ │ ├── fixedColumns.bootstrap4.css │ │ │ │ ├── fixedColumns.bootstrap4.min.css │ │ │ │ ├── fixedColumns.dataTables.css │ │ │ │ ├── fixedColumns.dataTables.min.css │ │ │ │ ├── fixedColumns.foundation.css │ │ │ │ ├── fixedColumns.foundation.min.css │ │ │ │ ├── fixedColumns.jqueryui.css │ │ │ │ ├── fixedColumns.jqueryui.min.css │ │ │ │ ├── fixedColumns.semanticui.css │ │ │ │ └── fixedColumns.semanticui.min.css │ │ │ ├── examples │ │ │ │ ├── index.html │ │ │ │ ├── initialisation │ │ │ │ │ ├── colvis.html │ │ │ │ │ ├── css_size.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── index_column.html │ │ │ │ │ ├── left_right_columns.html │ │ │ │ │ ├── right_column.html │ │ │ │ │ ├── server-side-processing.html │ │ │ │ │ ├── simple.html │ │ │ │ │ ├── size_fixed.html │ │ │ │ │ ├── size_fluid.html │ │ │ │ │ └── two_columns.html │ │ │ │ ├── integration │ │ │ │ │ ├── api.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── select-checkbox.html │ │ │ │ │ └── select.html │ │ │ │ └── styling │ │ │ │ │ ├── bootstrap.html │ │ │ │ │ ├── bootstrap4.html │ │ │ │ │ ├── col_filter.html │ │ │ │ │ ├── colvis.html │ │ │ │ │ ├── foundation.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── jqueryui.html │ │ │ │ │ ├── rowspan.html │ │ │ │ │ ├── rtl.html │ │ │ │ │ ├── semanticui.html │ │ │ │ │ └── server-side-processing.html │ │ │ └── js │ │ │ │ ├── dataTables.fixedColumns.js │ │ │ │ └── dataTables.fixedColumns.min.js │ │ ├── FixedHeader │ │ │ ├── License.txt │ │ │ ├── Readme.md │ │ │ ├── css │ │ │ │ ├── fixedHeader.bootstrap.css │ │ │ │ ├── fixedHeader.bootstrap.min.css │ │ │ │ ├── fixedHeader.bootstrap4.css │ │ │ │ ├── fixedHeader.bootstrap4.min.css │ │ │ │ ├── fixedHeader.dataTables.css │ │ │ │ ├── fixedHeader.dataTables.min.css │ │ │ │ ├── fixedHeader.foundation.css │ │ │ │ ├── fixedHeader.foundation.min.css │ │ │ │ ├── fixedHeader.jqueryui.css │ │ │ │ ├── fixedHeader.jqueryui.min.css │ │ │ │ ├── fixedHeader.semanticui.css │ │ │ │ └── fixedHeader.semanticui.min.css │ │ │ ├── examples │ │ │ │ ├── index.html │ │ │ │ ├── integration │ │ │ │ │ ├── buttons.html │ │ │ │ │ ├── colreorder.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── responsive-bootstrap.html │ │ │ │ │ └── responsive.html │ │ │ │ ├── options │ │ │ │ │ ├── enable-disable.html │ │ │ │ │ ├── header_footer.html │ │ │ │ │ ├── horizontal-scroll.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── new.html │ │ │ │ │ ├── offset-automatic.html │ │ │ │ │ ├── offset.html │ │ │ │ │ ├── show-hide.html │ │ │ │ │ ├── simple.html │ │ │ │ │ └── two_tables.html │ │ │ │ └── styling │ │ │ │ │ ├── bootstrap.html │ │ │ │ │ ├── bootstrap4.html │ │ │ │ │ ├── foundation.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── jqueryui.html │ │ │ │ │ └── semanticui.html │ │ │ └── js │ │ │ │ ├── dataTables.fixedHeader.js │ │ │ │ └── dataTables.fixedHeader.min.js │ │ ├── KeyTable │ │ │ ├── License.txt │ │ │ ├── Readme.md │ │ │ ├── css │ │ │ │ ├── keyTable.bootstrap.css │ │ │ │ ├── keyTable.bootstrap.min.css │ │ │ │ ├── keyTable.bootstrap4.css │ │ │ │ ├── keyTable.bootstrap4.min.css │ │ │ │ ├── keyTable.dataTables.css │ │ │ │ ├── keyTable.dataTables.min.css │ │ │ │ ├── keyTable.foundation.css │ │ │ │ ├── keyTable.foundation.min.css │ │ │ │ ├── keyTable.jqueryui.css │ │ │ │ ├── keyTable.jqueryui.min.css │ │ │ │ ├── keyTable.semanticui.css │ │ │ │ └── keyTable.semanticui.min.css │ │ │ ├── examples │ │ │ │ ├── index.html │ │ │ │ ├── initialisation │ │ │ │ │ ├── blurable.html │ │ │ │ │ ├── events.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── scroller.html │ │ │ │ │ ├── scrolling.html │ │ │ │ │ ├── server-side.html │ │ │ │ │ ├── simple.html │ │ │ │ │ └── stateSave.html │ │ │ │ └── styling │ │ │ │ │ ├── bootstrap.html │ │ │ │ │ ├── bootstrap4.html │ │ │ │ │ ├── focusStyle.html │ │ │ │ │ ├── foundation.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── jqueryui.html │ │ │ │ │ └── semanticui.html │ │ │ └── js │ │ │ │ ├── dataTables.keyTable.js │ │ │ │ └── dataTables.keyTable.min.js │ │ ├── Responsive │ │ │ ├── License.txt │ │ │ ├── Readme.md │ │ │ ├── css │ │ │ │ ├── responsive.bootstrap.css │ │ │ │ ├── responsive.bootstrap.min.css │ │ │ │ ├── responsive.bootstrap4.css │ │ │ │ ├── responsive.bootstrap4.min.css │ │ │ │ ├── responsive.dataTables.css │ │ │ │ ├── responsive.dataTables.min.css │ │ │ │ ├── responsive.foundation.css │ │ │ │ ├── responsive.foundation.min.css │ │ │ │ ├── responsive.jqueryui.css │ │ │ │ ├── responsive.jqueryui.min.css │ │ │ │ ├── responsive.semanticui.css │ │ │ │ └── responsive.semanticui.min.css │ │ │ ├── examples │ │ │ │ ├── child-rows │ │ │ │ │ ├── column-control.html │ │ │ │ │ ├── custom-renderer.html │ │ │ │ │ ├── disable-child-rows.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── right-column.html │ │ │ │ │ └── whole-row-control.html │ │ │ │ ├── column-control │ │ │ │ │ ├── auto.html │ │ │ │ │ ├── classes.html │ │ │ │ │ ├── colreorder.html │ │ │ │ │ ├── column-visibility.html │ │ │ │ │ ├── columnPriority.html │ │ │ │ │ ├── fixedHeader.html │ │ │ │ │ ├── index.html │ │ │ │ │ └── init-classes.html │ │ │ │ ├── display-types │ │ │ │ │ ├── bootstrap-modal.html │ │ │ │ │ ├── bootstrap4-modal.html │ │ │ │ │ ├── foundation-modal.html │ │ │ │ │ ├── immediateShow.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── jqueryui-modal.html │ │ │ │ │ ├── modal.html │ │ │ │ │ └── semanticui-modal.html │ │ │ │ ├── index.html │ │ │ │ ├── initialisation │ │ │ │ │ ├── ajax.html │ │ │ │ │ ├── className.html │ │ │ │ │ ├── default.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── new.html │ │ │ │ │ └── option.html │ │ │ │ └── styling │ │ │ │ │ ├── bootstrap.html │ │ │ │ │ ├── bootstrap4.html │ │ │ │ │ ├── compact.html │ │ │ │ │ ├── foundation.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── jqueryui.html │ │ │ │ │ ├── scrolling.html │ │ │ │ │ └── semanticui.html │ │ │ └── js │ │ │ │ ├── dataTables.responsive.js │ │ │ │ ├── dataTables.responsive.min.js │ │ │ │ ├── responsive.bootstrap.js │ │ │ │ ├── responsive.bootstrap.min.js │ │ │ │ ├── responsive.bootstrap4.js │ │ │ │ ├── responsive.bootstrap4.min.js │ │ │ │ ├── responsive.foundation.js │ │ │ │ ├── responsive.foundation.min.js │ │ │ │ ├── responsive.jqueryui.js │ │ │ │ ├── responsive.jqueryui.min.js │ │ │ │ ├── responsive.semanticui.js │ │ │ │ └── responsive.semanticui.min.js │ │ ├── RowGroup │ │ │ ├── License.txt │ │ │ ├── Readme.md │ │ │ ├── css │ │ │ │ ├── rowGroup.bootstrap.css │ │ │ │ ├── rowGroup.bootstrap.min.css │ │ │ │ ├── rowGroup.bootstrap4.css │ │ │ │ ├── rowGroup.bootstrap4.min.css │ │ │ │ ├── rowGroup.dataTables.css │ │ │ │ ├── rowGroup.dataTables.min.css │ │ │ │ ├── rowGroup.foundation.css │ │ │ │ ├── rowGroup.foundation.min.css │ │ │ │ ├── rowGroup.jqueryui.css │ │ │ │ ├── rowGroup.jqueryui.min.css │ │ │ │ ├── rowGroup.semanticui.css │ │ │ │ └── rowGroup.semanticui.min.css │ │ │ ├── examples │ │ │ │ ├── index.html │ │ │ │ ├── initialisation │ │ │ │ │ ├── ajaxObjects.html │ │ │ │ │ ├── customRow.html │ │ │ │ │ ├── endRender.html │ │ │ │ │ ├── event.html │ │ │ │ │ ├── fixedOrdering.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── simple.html │ │ │ │ │ └── startAndEndRender.html │ │ │ │ └── styling │ │ │ │ │ ├── bootstrap.html │ │ │ │ │ ├── bootstrap4.html │ │ │ │ │ ├── foundation.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── jqueryui.html │ │ │ │ │ └── semanticui.html │ │ │ └── js │ │ │ │ ├── dataTables.rowGroup.js │ │ │ │ └── dataTables.rowGroup.min.js │ │ ├── RowReorder │ │ │ ├── License.txt │ │ │ ├── Readme.md │ │ │ ├── css │ │ │ │ ├── rowReorder.bootstrap.css │ │ │ │ ├── rowReorder.bootstrap.min.css │ │ │ │ ├── rowReorder.bootstrap4.css │ │ │ │ ├── rowReorder.bootstrap4.min.css │ │ │ │ ├── rowReorder.dataTables.css │ │ │ │ ├── rowReorder.dataTables.min.css │ │ │ │ ├── rowReorder.foundation.css │ │ │ │ ├── rowReorder.foundation.min.css │ │ │ │ ├── rowReorder.jqueryui.css │ │ │ │ ├── rowReorder.jqueryui.min.css │ │ │ │ ├── rowReorder.semanticui.css │ │ │ │ ├── rowReorder.semanticui.min.css │ │ │ │ └── semanticui.scss │ │ │ ├── examples │ │ │ │ ├── index.html │ │ │ │ ├── initialisation │ │ │ │ │ ├── defaults.html │ │ │ │ │ ├── events.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── responsive.html │ │ │ │ │ ├── restrictedOrdering.html │ │ │ │ │ ├── scroll.html │ │ │ │ │ ├── selector.html │ │ │ │ │ └── simple.html │ │ │ │ └── styling │ │ │ │ │ ├── bootstrap.html │ │ │ │ │ ├── bootstrap4.html │ │ │ │ │ ├── foundation.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── jqueryui.html │ │ │ │ │ ├── reorderClass.html │ │ │ │ │ ├── semanticui.html │ │ │ │ │ └── snapX.html │ │ │ └── js │ │ │ │ ├── dataTables.rowReorder.js │ │ │ │ └── dataTables.rowReorder.min.js │ │ ├── Scroller │ │ │ ├── License.txt │ │ │ ├── Readme.md │ │ │ ├── css │ │ │ │ ├── scroller.bootstrap.css │ │ │ │ ├── scroller.bootstrap.min.css │ │ │ │ ├── scroller.bootstrap4.css │ │ │ │ ├── scroller.bootstrap4.min.css │ │ │ │ ├── scroller.dataTables.css │ │ │ │ ├── scroller.dataTables.min.css │ │ │ │ ├── scroller.foundation.css │ │ │ │ ├── scroller.foundation.min.css │ │ │ │ ├── scroller.jqueryui.css │ │ │ │ ├── scroller.jqueryui.min.css │ │ │ │ ├── scroller.semanticui.css │ │ │ │ └── scroller.semanticui.min.css │ │ │ ├── examples │ │ │ │ ├── data │ │ │ │ │ ├── 2500.txt │ │ │ │ │ └── ssp.php │ │ │ │ ├── index.html │ │ │ │ ├── initialisation │ │ │ │ │ ├── api_scrolling.html │ │ │ │ │ ├── fixedColumns.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── large_js_source.html │ │ │ │ │ ├── select.html │ │ │ │ │ ├── server-side_processing.html │ │ │ │ │ ├── simple.html │ │ │ │ │ └── state_saving.html │ │ │ │ └── styling │ │ │ │ │ ├── bootstrap.html │ │ │ │ │ ├── bootstrap4.html │ │ │ │ │ ├── foundation.html │ │ │ │ │ ├── index.html │ │ │ │ │ ├── jqueryui.html │ │ │ │ │ └── semanticui.html │ │ │ └── js │ │ │ │ ├── dataTables.scroller.js │ │ │ │ └── dataTables.scroller.min.js │ │ └── Select │ │ │ ├── License.txt │ │ │ ├── Readme.md │ │ │ ├── css │ │ │ ├── select.bootstrap.css │ │ │ ├── select.bootstrap.min.css │ │ │ ├── select.bootstrap4.css │ │ │ ├── select.bootstrap4.min.css │ │ │ ├── select.dataTables.css │ │ │ ├── select.dataTables.min.css │ │ │ ├── select.foundation.css │ │ │ ├── select.foundation.min.css │ │ │ ├── select.jqueryui.css │ │ │ ├── select.jqueryui.min.css │ │ │ ├── select.semanticui.css │ │ │ └── select.semanticui.min.css │ │ │ ├── examples │ │ │ ├── api │ │ │ │ ├── cancellableEvents.html │ │ │ │ ├── events.html │ │ │ │ ├── get.html │ │ │ │ ├── index.html │ │ │ │ └── select.html │ │ │ ├── index.html │ │ │ ├── initialisation │ │ │ │ ├── blurable.html │ │ │ │ ├── buttons.html │ │ │ │ ├── cells.html │ │ │ │ ├── checkbox.html │ │ │ │ ├── deferRender.html │ │ │ │ ├── i18n.html │ │ │ │ ├── index.html │ │ │ │ ├── multi.html │ │ │ │ ├── reload.html │ │ │ │ ├── simple.html │ │ │ │ └── single.html │ │ │ └── styling │ │ │ │ ├── bootstrap.html │ │ │ │ ├── bootstrap4.html │ │ │ │ ├── foundation.html │ │ │ │ ├── index.html │ │ │ │ ├── jqueryui.html │ │ │ │ └── semanticui.html │ │ │ └── js │ │ │ ├── dataTables.select.js │ │ │ └── dataTables.select.min.js │ └── media │ │ ├── css │ │ ├── dataTables.bootstrap.css │ │ ├── dataTables.bootstrap.min.css │ │ ├── dataTables.bootstrap4.css │ │ ├── dataTables.bootstrap4.min.css │ │ ├── dataTables.foundation.css │ │ ├── dataTables.foundation.min.css │ │ ├── dataTables.jqueryui.css │ │ ├── dataTables.jqueryui.min.css │ │ ├── dataTables.material.css │ │ ├── dataTables.material.min.css │ │ ├── dataTables.semanticui.css │ │ ├── dataTables.semanticui.min.css │ │ ├── dataTables.uikit.css │ │ ├── dataTables.uikit.min.css │ │ ├── jquery.dataTables.css │ │ ├── jquery.dataTables.min.css │ │ └── jquery.dataTables_themeroller.css │ │ ├── images │ │ ├── Sorting icons.psd │ │ ├── favicon.ico │ │ ├── sort_asc.png │ │ ├── sort_asc_disabled.png │ │ ├── sort_both.png │ │ ├── sort_desc.png │ │ └── sort_desc_disabled.png │ │ └── js │ │ ├── dataTables.bootstrap.js │ │ ├── dataTables.bootstrap.min.js │ │ ├── dataTables.bootstrap4.js │ │ ├── dataTables.bootstrap4.min.js │ │ ├── dataTables.foundation.js │ │ ├── dataTables.foundation.min.js │ │ ├── dataTables.jqueryui.js │ │ ├── dataTables.jqueryui.min.js │ │ ├── dataTables.material.js │ │ ├── dataTables.material.min.js │ │ ├── dataTables.semanticui.js │ │ ├── dataTables.semanticui.min.js │ │ ├── dataTables.uikit.js │ │ ├── dataTables.uikit.min.js │ │ ├── jquery.dataTables.js │ │ ├── jquery.dataTables.min.js │ │ └── jquery.js ├── flot-tooltip │ ├── jquery.flot.tooltip.js │ ├── jquery.flot.tooltip.min.js │ └── jquery.flot.tooltip.source.js ├── flot │ ├── excanvas.js │ ├── excanvas.min.js │ ├── flot-data.js │ ├── jquery.colorhelpers.js │ ├── jquery.flot.canvas.js │ ├── jquery.flot.categories.js │ ├── jquery.flot.crosshair.js │ ├── jquery.flot.errorbars.js │ ├── jquery.flot.fillbetween.js │ ├── jquery.flot.image.js │ ├── jquery.flot.js │ ├── jquery.flot.navigate.js │ ├── jquery.flot.pie.js │ ├── jquery.flot.resize.js │ ├── jquery.flot.selection.js │ ├── jquery.flot.stack.js │ ├── jquery.flot.symbol.js │ ├── jquery.flot.threshold.js │ ├── jquery.flot.time.js │ └── jquery.js ├── font-awesome │ ├── css │ │ ├── font-awesome.css │ │ └── font-awesome.min.css │ ├── fonts │ │ ├── FontAwesome.otf │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ └── fontawesome-webfont.woff2 │ ├── less │ │ ├── animated.less │ │ ├── bordered-pulled.less │ │ ├── core.less │ │ ├── fixed-width.less │ │ ├── font-awesome.less │ │ ├── icons.less │ │ ├── larger.less │ │ ├── list.less │ │ ├── mixins.less │ │ ├── path.less │ │ ├── rotated-flipped.less │ │ ├── screen-reader.less │ │ ├── stacked.less │ │ └── variables.less │ └── scss │ │ ├── _animated.scss │ │ ├── _bordered-pulled.scss │ │ ├── _core.scss │ │ ├── _fixed-width.scss │ │ ├── _icons.scss │ │ ├── _larger.scss │ │ ├── _list.scss │ │ ├── _mixins.scss │ │ ├── _path.scss │ │ ├── _rotated-flipped.scss │ │ ├── _screen-reader.scss │ │ ├── _stacked.scss │ │ ├── _variables.scss │ │ └── font-awesome.scss ├── highcharts │ ├── api │ │ ├── css │ │ │ ├── api.css │ │ │ ├── font-awesome.min.css │ │ │ ├── jquery-ui.min.css │ │ │ └── jquery.sidr.bare.css │ │ ├── fonts │ │ │ ├── fontawesome-webfont.woff │ │ │ └── fontawesome-webfont.woff2 │ │ ├── highcharts.html │ │ ├── images │ │ │ ├── Highcharts.svg │ │ │ ├── apple-touch-icon-114x114.png │ │ │ ├── apple-touch-icon-120x120.png │ │ │ ├── apple-touch-icon-144x144.png │ │ │ ├── apple-touch-icon-152x152.png │ │ │ ├── apple-touch-icon-180x180.png │ │ │ ├── apple-touch-icon-57x57.png │ │ │ ├── apple-touch-icon-60x60.png │ │ │ ├── apple-touch-icon-72x72.png │ │ │ ├── apple-touch-icon-76x76.png │ │ │ ├── favicon-160x160.png │ │ │ ├── favicon-16x16.png │ │ │ ├── favicon-192x192.png │ │ │ ├── favicon-32x32.png │ │ │ ├── favicon-96x96.png │ │ │ └── sprite.png │ │ └── js │ │ │ ├── api.js │ │ │ ├── highcharts.json │ │ │ ├── jquery-1.11.3.min.js │ │ │ ├── jquery-ui.min.js │ │ │ └── jquery.sidr.min.js │ ├── code │ │ ├── css │ │ │ └── highcharts.css │ │ ├── highcharts-3d.js │ │ ├── highcharts-3d.js.map │ │ ├── highcharts-3d.src.js │ │ ├── highcharts-more.js │ │ ├── highcharts-more.js.map │ │ ├── highcharts-more.src.js │ │ ├── highcharts.js │ │ ├── highcharts.js.map │ │ ├── highcharts.src.js │ │ ├── highmaps.js.map │ │ ├── highstock.js.map │ │ ├── js │ │ │ ├── highcharts-3d.js │ │ │ ├── highcharts-3d.js.map │ │ │ ├── highcharts-3d.src.js │ │ │ ├── highcharts-more.js │ │ │ ├── highcharts-more.js.map │ │ │ ├── highcharts-more.src.js │ │ │ ├── highcharts.js │ │ │ ├── highcharts.js.map │ │ │ ├── highcharts.src.js │ │ │ ├── highmaps.js.map │ │ │ ├── highstock.js.map │ │ │ ├── modules │ │ │ │ ├── accessibility.js │ │ │ │ ├── accessibility.js.map │ │ │ │ ├── accessibility.src.js │ │ │ │ ├── annotations.js │ │ │ │ ├── annotations.js.map │ │ │ │ ├── annotations.src.js │ │ │ │ ├── boost-canvas.js │ │ │ │ ├── boost-canvas.js.map │ │ │ │ ├── boost-canvas.src.js │ │ │ │ ├── boost.js │ │ │ │ ├── boost.js.map │ │ │ │ ├── boost.src.js │ │ │ │ ├── broken-axis.js │ │ │ │ ├── broken-axis.js.map │ │ │ │ ├── broken-axis.src.js │ │ │ │ ├── canvasrenderer.experimental.js.map │ │ │ │ ├── data.js │ │ │ │ ├── data.js.map │ │ │ │ ├── data.src.js │ │ │ │ ├── drilldown.js │ │ │ │ ├── drilldown.js.map │ │ │ │ ├── drilldown.src.js │ │ │ │ ├── export-data.js │ │ │ │ ├── export-data.js.map │ │ │ │ ├── export-data.src.js │ │ │ │ ├── exporting.js │ │ │ │ ├── exporting.js.map │ │ │ │ ├── exporting.src.js │ │ │ │ ├── funnel.js │ │ │ │ ├── funnel.js.map │ │ │ │ ├── funnel.src.js │ │ │ │ ├── gantt.js │ │ │ │ ├── gantt.js.map │ │ │ │ ├── gantt.src.js │ │ │ │ ├── grid-axis.js │ │ │ │ ├── grid-axis.js.map │ │ │ │ ├── grid-axis.src.js │ │ │ │ ├── heatmap.js │ │ │ │ ├── heatmap.js.map │ │ │ │ ├── heatmap.src.js │ │ │ │ ├── map-parser.js.map │ │ │ │ ├── map.js.map │ │ │ │ ├── no-data-to-display.js │ │ │ │ ├── no-data-to-display.js.map │ │ │ │ ├── no-data-to-display.src.js │ │ │ │ ├── offline-exporting.js │ │ │ │ ├── offline-exporting.js.map │ │ │ │ ├── offline-exporting.src.js │ │ │ │ ├── overlapping-datalabels.js │ │ │ │ ├── overlapping-datalabels.js.map │ │ │ │ ├── overlapping-datalabels.src.js │ │ │ │ ├── series-label.js │ │ │ │ ├── series-label.js.map │ │ │ │ ├── series-label.src.js │ │ │ │ ├── solid-gauge.js │ │ │ │ ├── solid-gauge.js.map │ │ │ │ ├── solid-gauge.src.js │ │ │ │ ├── static-scale.js │ │ │ │ ├── static-scale.js.map │ │ │ │ ├── static-scale.src.js │ │ │ │ ├── stock.js │ │ │ │ ├── stock.js.map │ │ │ │ ├── stock.src.js │ │ │ │ ├── treemap.js │ │ │ │ ├── treemap.js.map │ │ │ │ ├── treemap.src.js │ │ │ │ ├── xrange-series.js │ │ │ │ ├── xrange-series.js.map │ │ │ │ └── xrange-series.src.js │ │ │ └── themes │ │ │ │ ├── dark-blue.js │ │ │ │ ├── dark-green.js │ │ │ │ ├── dark-unica.js │ │ │ │ ├── gray.js │ │ │ │ ├── grid-light.js │ │ │ │ ├── grid.js │ │ │ │ ├── sand-signika.js │ │ │ │ └── skies.js │ │ ├── lib │ │ │ ├── canvg.js │ │ │ ├── canvg.src.js │ │ │ ├── jspdf.js │ │ │ ├── jspdf.src.js │ │ │ ├── rgbcolor.js │ │ │ ├── rgbcolor.src.js │ │ │ ├── svg2pdf.js │ │ │ └── svg2pdf.src.js │ │ ├── modules │ │ │ ├── accessibility.js │ │ │ ├── accessibility.js.map │ │ │ ├── accessibility.src.js │ │ │ ├── annotations.js │ │ │ ├── annotations.js.map │ │ │ ├── annotations.src.js │ │ │ ├── boost-canvas.js │ │ │ ├── boost-canvas.js.map │ │ │ ├── boost-canvas.src.js │ │ │ ├── boost.js │ │ │ ├── boost.js.map │ │ │ ├── boost.src.js │ │ │ ├── broken-axis.js │ │ │ ├── broken-axis.js.map │ │ │ ├── broken-axis.src.js │ │ │ ├── canvasrenderer.experimental.js.map │ │ │ ├── data.js │ │ │ ├── data.js.map │ │ │ ├── data.src.js │ │ │ ├── drilldown.js │ │ │ ├── drilldown.js.map │ │ │ ├── drilldown.src.js │ │ │ ├── export-data.js │ │ │ ├── export-data.js.map │ │ │ ├── export-data.src.js │ │ │ ├── exporting.js │ │ │ ├── exporting.js.map │ │ │ ├── exporting.src.js │ │ │ ├── funnel.js │ │ │ ├── funnel.js.map │ │ │ ├── funnel.src.js │ │ │ ├── gantt.js │ │ │ ├── gantt.js.map │ │ │ ├── gantt.src.js │ │ │ ├── grid-axis.js │ │ │ ├── grid-axis.js.map │ │ │ ├── grid-axis.src.js │ │ │ ├── heatmap.js │ │ │ ├── heatmap.js.map │ │ │ ├── heatmap.src.js │ │ │ ├── map-parser.js.map │ │ │ ├── map.js.map │ │ │ ├── no-data-to-display.js │ │ │ ├── no-data-to-display.js.map │ │ │ ├── no-data-to-display.src.js │ │ │ ├── offline-exporting.js │ │ │ ├── offline-exporting.js.map │ │ │ ├── offline-exporting.src.js │ │ │ ├── overlapping-datalabels.js │ │ │ ├── overlapping-datalabels.js.map │ │ │ ├── overlapping-datalabels.src.js │ │ │ ├── series-label.js │ │ │ ├── series-label.js.map │ │ │ ├── series-label.src.js │ │ │ ├── solid-gauge.js │ │ │ ├── solid-gauge.js.map │ │ │ ├── solid-gauge.src.js │ │ │ ├── static-scale.js │ │ │ ├── static-scale.js.map │ │ │ ├── static-scale.src.js │ │ │ ├── stock.js │ │ │ ├── stock.js.map │ │ │ ├── stock.src.js │ │ │ ├── treemap.js │ │ │ ├── treemap.js.map │ │ │ ├── treemap.src.js │ │ │ ├── xrange-series.js │ │ │ ├── xrange-series.js.map │ │ │ └── xrange-series.src.js │ │ ├── readme.txt │ │ └── themes │ │ │ ├── dark-blue.js │ │ │ ├── dark-green.js │ │ │ ├── dark-unica.js │ │ │ ├── gray.js │ │ │ ├── grid-light.js │ │ │ ├── grid.js │ │ │ ├── sand-signika.js │ │ │ └── skies.js │ ├── gfx │ │ └── vml-radial-gradient.png │ └── graphics │ │ ├── earth.svg │ │ ├── meteogram-symbols-30px.png │ │ ├── search.png │ │ ├── skies.jpg │ │ ├── snow.png │ │ └── sun.png ├── icons │ └── rankingfacts.ico ├── images │ ├── DataSynthesizer_Logo.png │ ├── TranspaRank_Logo.png │ ├── grey_shutterstock_bg.jpg │ ├── header_logo.png │ ├── header_logo_grey_small.jpg │ ├── rsz_datasynthesizer_logo.png │ └── rsz_header_logo.png ├── jekyll │ ├── css │ │ ├── animate.css │ │ ├── bootstrap.min.css │ │ ├── font-awesome.min.css │ │ ├── ionicons.min.css │ │ ├── owl.carousel.css │ │ ├── responsive.css │ │ ├── style.css │ │ ├── syntax.css │ │ └── themes.css │ ├── img │ │ └── shutterstock_bg.jpg │ └── js │ │ ├── bootstrap.min.js │ │ ├── jquery.counterup.js │ │ ├── main.js │ │ ├── min │ │ ├── main.min.js │ │ ├── plugins.min.js │ │ └── waypoints.min.js │ │ ├── owl.carousel.min.js │ │ ├── plugins.js │ │ └── vendor │ │ ├── jquery-1.10.2.min.js │ │ └── modernizr-2.6.2.min.js ├── jquery │ └── jquery-3.2.1.min.js ├── metadata │ ├── 1497793782.823068_meta.txt │ ├── 1497793983.712978_meta.txt │ └── 1497794202.294631_meta.txt ├── metisMenu │ ├── metisMenu.css │ ├── metisMenu.js │ ├── metisMenu.min.css │ └── metisMenu.min.js ├── morrisjs │ ├── morris-data.js │ ├── morris.css │ ├── morris.js │ └── morris.min.js ├── others │ ├── css │ │ ├── fileinput.min.css │ │ └── landing-page.css │ └── js │ │ ├── bootstrap-filestyle.min.js │ │ └── fileinput.min.js ├── raphael │ ├── raphael.js │ └── raphael.min.js └── sbadmin │ ├── css │ ├── sb-admin-2-original.css │ ├── sb-admin-2.css │ └── sb-admin-2.min.css │ └── js │ ├── sb-admin-2.js │ └── sb-admin-2.min.js ├── synthesizer ├── __init__.py ├── admin.py ├── apps.py ├── lib │ ├── DataSynthesizerWrapper.py │ └── __init__.py ├── migrations │ └── __init__.py ├── models.py ├── tests.py ├── urls.py └── views.py └── templates ├── base.html ├── synthesizer ├── com_data.html ├── com_histogram.html ├── com_hitmap.html ├── index.html ├── index_back.html └── proc_data_dash.html └── tools.html /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | indent_style = space 7 | indent_size = 4 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | charset = utf-8 11 | end_of_line = lf 12 | 13 | [*.bat] 14 | indent_style = tab 15 | end_of_line = crlf 16 | 17 | [LICENSE] 18 | insert_final_newline = false 19 | 20 | [Makefile] 21 | indent_style = tab 22 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | * DataSynthesizer version: 2 | * Python version: 3 | * Operating System: 4 | 5 | ### Description 6 | 7 | Describe what you were trying to get done. 8 | Tell us what happened, what went wrong, and what you expected to happen. 9 | 10 | ### What I Did 11 | 12 | ``` 13 | Paste the command(s) you ran and the output. 14 | If there was a crash, please include the traceback here. 15 | ``` 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | .pytest_cache/ 49 | 50 | # Translations 51 | *.mo 52 | *.pot 53 | 54 | # Django stuff: 55 | *.log 56 | local_settings.py 57 | 58 | # Flask stuff: 59 | instance/ 60 | .webassets-cache 61 | 62 | # Scrapy stuff: 63 | .scrapy 64 | 65 | # Sphinx documentation 66 | docs/_build/ 67 | 68 | # PyBuilder 69 | target/ 70 | 71 | # Jupyter Notebook 72 | .ipynb_checkpoints 73 | 74 | # pyenv 75 | .python-version 76 | 77 | # celery beat schedule file 78 | celerybeat-schedule 79 | 80 | # SageMath parsed files 81 | *.sage.py 82 | 83 | # dotenv 84 | .env 85 | 86 | # virtualenv 87 | .venv 88 | venv/ 89 | ENV/ 90 | 91 | # Spyder project settings 92 | .spyderproject 93 | .spyproject 94 | 95 | # Rope project settings 96 | .ropeproject 97 | 98 | # mkdocs documentation 99 | /site 100 | 101 | # mypy 102 | .mypy_cache/ 103 | 104 | # IDE settings 105 | .vscode/ 106 | .idea/ 107 | 108 | # This project 109 | **/\.DS_Store 110 | tests/data/output.csv 111 | tests/data/description.json 112 | tests/data/output_uniform.csv 113 | webUI/db.sqlite3 114 | webUI/media/*.csv 115 | webUI/media/*.json 116 | webUI/media/*.py 117 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | # Config file for automatic testing at travis-ci.com 2 | 3 | language: python 4 | python: 5 | - 3.7 6 | 7 | # Command to install dependencies, e.g. pip install -r requirements.txt --use-mirrors 8 | install: pip install -U tox-travis 9 | 10 | # Command to run tests, e.g. python setup.py test 11 | script: tox 12 | 13 | # # Assuming you have installed the travis-ci CLI tool, after you 14 | # # create the Github repo and add it to Travis, run the 15 | # # following command to finish PyPI deployment setup: 16 | # # $ travis encrypt --add deploy.password 17 | # deploy: 18 | # provider: pypi 19 | # distributions: sdist bdist_wheel 20 | # user: dataresponsibly 21 | # password: 22 | # secure: PLEASE_REPLACE_ME 23 | # on: 24 | # tags: true 25 | # repo: DataResponsibly/DataSynthesizer 26 | # python: 3.8 27 | -------------------------------------------------------------------------------- /AUTHORS.rst: -------------------------------------------------------------------------------- 1 | ======= 2 | Credits 3 | ======= 4 | 5 | Development Lead 6 | ---------------- 7 | 8 | * Haoyue Ping 9 | * Ke Yang 10 | 11 | .. Contributors 12 | .. ------------ 13 | 14 | .. None yet. Why not be the first? 15 | -------------------------------------------------------------------------------- /DataSynthesizer/__init__.py: -------------------------------------------------------------------------------- 1 | """Top-level package for DataSynthesizer.""" 2 | 3 | __author__ = """Data, Responsibly""" 4 | __email__ = 'dataresponsibly@gmail.com' 5 | __version__ = '0.1.13' 6 | -------------------------------------------------------------------------------- /DataSynthesizer/datatypes/FloatAttribute.py: -------------------------------------------------------------------------------- 1 | from typing import Union 2 | 3 | from numpy import arange 4 | from pandas import Series 5 | 6 | from DataSynthesizer.datatypes.AbstractAttribute import AbstractAttribute 7 | from DataSynthesizer.datatypes.utils.DataType import DataType 8 | 9 | 10 | class FloatAttribute(AbstractAttribute): 11 | def __init__(self, name: str, is_candidate_key, is_categorical, histogram_size: Union[int, str], data: Series): 12 | super().__init__(name, is_candidate_key, is_categorical, histogram_size, data) 13 | self.is_numerical = True 14 | self.data_type = DataType.FLOAT 15 | 16 | def infer_domain(self, categorical_domain=None, numerical_range=None): 17 | super().infer_domain(categorical_domain, numerical_range) 18 | 19 | def infer_distribution(self): 20 | super().infer_distribution() 21 | 22 | def generate_values_as_candidate_key(self, n): 23 | return arange(self.min, self.max, (self.max - self.min) / n) 24 | 25 | def sample_values_from_binning_indices(self, binning_indices): 26 | return super().sample_values_from_binning_indices(binning_indices) 27 | -------------------------------------------------------------------------------- /DataSynthesizer/datatypes/IntegerAttribute.py: -------------------------------------------------------------------------------- 1 | from typing import Union 2 | 3 | from pandas import Series 4 | 5 | from DataSynthesizer.datatypes.AbstractAttribute import AbstractAttribute 6 | from DataSynthesizer.datatypes.utils.DataType import DataType 7 | 8 | 9 | class IntegerAttribute(AbstractAttribute): 10 | def __init__(self, name: str, is_candidate_key, is_categorical, histogram_size: Union[int, str], data: Series): 11 | super().__init__(name, is_candidate_key, is_categorical, histogram_size, data) 12 | self.is_numerical = True 13 | self.data_type = DataType.INTEGER 14 | 15 | def infer_domain(self, categorical_domain=None, numerical_range=None): 16 | super().infer_domain(categorical_domain, numerical_range) 17 | self.min = int(self.min) 18 | self.max = int(self.max) 19 | 20 | def infer_distribution(self): 21 | super().infer_distribution() 22 | 23 | def generate_values_as_candidate_key(self, n): 24 | return super().generate_values_as_candidate_key(n) 25 | 26 | def sample_values_from_binning_indices(self, binning_indices): 27 | column = super().sample_values_from_binning_indices(binning_indices) 28 | column = column.round() 29 | column[~column.isnull()] = column[~column.isnull()].astype(int) 30 | return column 31 | -------------------------------------------------------------------------------- /DataSynthesizer/datatypes/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataResponsibly/DataSynthesizer/90722857e7f6ed736aaa25068ecf9e77f34f896a/DataSynthesizer/datatypes/__init__.py -------------------------------------------------------------------------------- /DataSynthesizer/datatypes/utils/DataType.py: -------------------------------------------------------------------------------- 1 | from enum import Enum 2 | 3 | 4 | class DataType(Enum): 5 | INTEGER = 'Integer' 6 | FLOAT = 'Float' 7 | STRING = 'String' 8 | DATETIME = 'DateTime' 9 | SOCIAL_SECURITY_NUMBER = 'SocialSecurityNumber' 10 | -------------------------------------------------------------------------------- /DataSynthesizer/datatypes/utils/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataResponsibly/DataSynthesizer/90722857e7f6ed736aaa25068ecf9e77f34f896a/DataSynthesizer/datatypes/utils/__init__.py -------------------------------------------------------------------------------- /DataSynthesizer/lib/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataResponsibly/DataSynthesizer/90722857e7f6ed736aaa25068ecf9e77f34f896a/DataSynthesizer/lib/__init__.py -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright <2018> 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. 22 | 23 | -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include AUTHORS.rst 2 | include CONTRIBUTING.rst 3 | include HISTORY.md 4 | include LICENSE 5 | include README.md 6 | 7 | recursive-include tests * 8 | recursive-exclude * __pycache__ 9 | recursive-exclude * *.py[co] 10 | 11 | recursive-include docs *.rst conf.py Makefile make.bat *.jpg *.png *.gif 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![PyPi Shield](https://img.shields.io/pypi/v/DataSynthesizer.svg)](https://pypi.python.org/pypi/DataSynthesizer) [![Travis CI Shield](https://travis-ci.com/DataResponsibly/DataSynthesizer.svg?branch=master)](https://travis-ci.com/DataResponsibly/DataSynthesizer) 2 | 3 | # DataSynthesizer 4 | 5 | DataSynthesizer generates synthetic data that simulates a given dataset. 6 | 7 | > It aims to facilitate the collaborations between data scientists and owners of sensitive data. It applies Differential Privacy techniques to achieve strong privacy guarantee. 8 | > 9 | > For more details, please refer to [DataSynthesizer: Privacy-Preserving Synthetic Datasets](docs/cr-datasynthesizer-privacy.pdf) 10 | 11 | ### Install DataSynthesizer 12 | 13 | ```bash 14 | pip install DataSynthesizer 15 | ``` 16 | 17 | ### Usage 18 | 19 | ##### Assumptions for the Input Dataset 20 | 21 | 1. The input dataset is a table in first normal form ([1NF](https://en.wikipedia.org/wiki/First_normal_form)). 22 | 2. When implementing differential privacy, DataSynthesizer injects noises into the statistics within **active domain** that are the values presented in the table. 23 | 24 | ##### Use Jupyter Notebook 25 | 26 | After installing DataSynthesizer and [Jupyter Notebook](https://jupyter.org/install), open and try the demos in `./notebooks/` 27 | 28 | - [DataSynthesizer__random_mode.ipynb](notebooks/DataSynthesizer__random_mode.ipynb) 29 | - [DataSynthesizer__independent_attribute_mode.ipynb](notebooks/DataSynthesizer__independent_attribute_mode.ipynb) 30 | - [DataSynthesizer__correlated_attribute_mode.ipynb](notebooks/DataSynthesizer__correlated_attribute_mode.ipynb) 31 | 32 | ##### Use Web UI 33 | 34 | The [dataResponsiblyUI](https://github.com/DataResponsibly/dataResponsiblyUI) is a Django project that includes DataSynthesizer. Please follow the steps in [Run the Web UIs locally](https://github.com/DataResponsibly/dataResponsiblyUI#run-the-web-uis-locally) and run DataSynthesizer by visiting http://127.0.0.1:8000/synthesizer in a browser. 35 | 36 | -------------------------------------------------------------------------------- /docs/cr-datasynthesizer-privacy.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataResponsibly/DataSynthesizer/90722857e7f6ed736aaa25068ecf9e77f34f896a/docs/cr-datasynthesizer-privacy.pdf -------------------------------------------------------------------------------- /requirements_dev.txt: -------------------------------------------------------------------------------- 1 | pip>=19.2.3 2 | bump2version>=0.5.11 3 | wheel>=0.33.6 4 | watchdog>=0.9.0 5 | flake8>=3.7.8 6 | tox>=3.14.0 7 | coverage>=4.5.4 8 | Sphinx>=1.8.5 9 | twine>=1.14.0 10 | 11 | pytest>=4.6.5 12 | pytest-runner>=5.1 -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | [bumpversion] 2 | current_version = 0.1.13 3 | commit = True 4 | tag = True 5 | 6 | [bumpversion:file:setup.py] 7 | search = version='{current_version}' 8 | replace = version='{new_version}' 9 | 10 | [bumpversion:file:DataSynthesizer/__init__.py] 11 | search = __version__ = '{current_version}' 12 | replace = __version__ = '{new_version}' 13 | 14 | [bdist_wheel] 15 | universal = 1 16 | 17 | [flake8] 18 | exclude = docs 19 | max-line-length = 125 20 | 21 | [aliases] 22 | test = pytest 23 | 24 | [egg_info] 25 | tag_build = 26 | tag_date = 0 27 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | """The setup script.""" 4 | 5 | import pathlib 6 | 7 | from setuptools import setup, find_packages 8 | 9 | # The directory containing this file 10 | HERE = pathlib.Path(__file__).parent.absolute() 11 | 12 | with open(HERE / 'README.md') as readme_file: 13 | readme = readme_file.read() 14 | 15 | with open(HERE / 'HISTORY.md') as history_file: 16 | history = history_file.read() 17 | 18 | requirements = [ 19 | "numpy>=1.18.5", 20 | "pandas>=1.0.5", 21 | "scikit-learn>=0.23.1", 22 | "matplotlib>=3.2.2", 23 | "seaborn>=0.10.1", 24 | "python-dateutil>=2.8.1" 25 | ] 26 | 27 | setup_requirements = ['pytest-runner', ] 28 | 29 | test_requirements = ['pytest>=5', ] 30 | 31 | setup( 32 | author="Data, Responsibly", 33 | author_email='dataresponsibly@gmail.com', 34 | python_requires='>=3.7', 35 | classifiers=[ 36 | 'Development Status :: 2 - Pre-Alpha', 37 | 'Intended Audience :: Developers', 38 | 'License :: OSI Approved :: MIT License', 39 | 'Natural Language :: English', 40 | 'Programming Language :: Python :: 3', 41 | 'Programming Language :: Python :: 3.7' 42 | ], 43 | description="Generate synthetic data that simulate a given dataset.", 44 | install_requires=requirements, 45 | license="MIT license", 46 | long_description=readme + '\n\n' + history, 47 | long_description_content_type='text/markdown', 48 | include_package_data=True, 49 | keywords='DataSynthesizer', 50 | name='DataSynthesizer', 51 | packages=find_packages(include=['DataSynthesizer', 'DataSynthesizer.*']), 52 | setup_requires=setup_requirements, 53 | test_suite='tests', 54 | tests_require=test_requirements, 55 | url='https://github.com/DataResponsibly/DataSynthesizer', 56 | version='0.1.13', 57 | zip_safe=False, 58 | ) 59 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataResponsibly/DataSynthesizer/90722857e7f6ed736aaa25068ecf9e77f34f896a/tests/__init__.py -------------------------------------------------------------------------------- /tox.ini: -------------------------------------------------------------------------------- 1 | [tox] 2 | envlist = py37, flake8 3 | 4 | [travis] 5 | python = 6 | 3.7: py37 7 | 8 | [testenv:flake8] 9 | basepython = python 10 | deps = flake8 11 | commands = flake8 DataSynthesizer tests 12 | 13 | [testenv] 14 | setenv = 15 | PYTHONPATH = {toxinidir} 16 | deps = 17 | -r{toxinidir}/requirements_dev.txt 18 | ; If you want to make tox run the tests with the same versions, create a 19 | ; requirements.txt with the pinned versions and uncomment the following line: 20 | ; -r{toxinidir}/requirements.txt 21 | commands = 22 | pip install -U pip 23 | pytest --basetemp={envtmpdir} 24 | 25 | -------------------------------------------------------------------------------- /webUI/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataResponsibly/DataSynthesizer/90722857e7f6ed736aaa25068ecf9e77f34f896a/webUI/__init__.py -------------------------------------------------------------------------------- /webUI/dataResponsiblyUI/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataResponsibly/DataSynthesizer/90722857e7f6ed736aaa25068ecf9e77f34f896a/webUI/dataResponsiblyUI/__init__.py -------------------------------------------------------------------------------- /webUI/dataResponsiblyUI/urls.py: -------------------------------------------------------------------------------- 1 | """dataResponsiblyUI URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/1.10/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Import the include() function: from django.conf.urls import url, include 14 | 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) 15 | """ 16 | from django.conf import settings 17 | from django.conf.urls import include, url 18 | from django.conf.urls.static import static 19 | from django.contrib import admin 20 | from . import views 21 | 22 | urlpatterns = [ 23 | url(r'^$', views.base, name='base'), 24 | # url(r'^rankingfacts/', include('rankingfacts.urls')), 25 | # url(r'^dataflow/', include('dataflow.urls')), 26 | url(r'^synthesizer/', include('synthesizer.urls')), 27 | url(r'^admin/', admin.site.urls), 28 | 29 | ] 30 | if settings.DEBUG is True: 31 | urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 32 | -------------------------------------------------------------------------------- /webUI/dataResponsiblyUI/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | def base(request): 4 | 5 | return render(request, "tools.html",{}) -------------------------------------------------------------------------------- /webUI/dataResponsiblyUI/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for dataResponsiblyUI project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/2.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dataResponsiblyUI.settings") 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /webUI/environment.yml: -------------------------------------------------------------------------------- 1 | name: DataSynthesizerEnvironment 2 | dependencies: 3 | - python 4 | - numpy 5 | - pandas 6 | - scikit-learn 7 | - matplotlib 8 | - seaborn 9 | - jupyter 10 | - django 11 | - python-dateutil 12 | -------------------------------------------------------------------------------- /webUI/manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import sys 4 | 5 | if __name__ == "__main__": 6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dataResponsiblyUI.settings") 7 | try: 8 | from django.core.management import execute_from_command_line 9 | except ImportError: 10 | # The above import may fail for some other reason. Ensure that the 11 | # issue is really that Django is missing to avoid masking other 12 | # exceptions on Python 2. 13 | try: 14 | import django 15 | except ImportError: 16 | raise ImportError( 17 | "Couldn't import Django. Are you sure it's installed and " 18 | "available on your PYTHONPATH environment variable? Did you " 19 | "forget to activate a virtual environment?" 20 | ) 21 | raise 22 | execute_from_command_line(sys.argv) 23 | -------------------------------------------------------------------------------- /webUI/media/git_push_placeholder.txt: -------------------------------------------------------------------------------- 1 | Git push placeholder for media folder. -------------------------------------------------------------------------------- /webUI/static/bootstrap/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataResponsibly/DataSynthesizer/90722857e7f6ed736aaa25068ecf9e77f34f896a/webUI/static/bootstrap/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /webUI/static/bootstrap/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataResponsibly/DataSynthesizer/90722857e7f6ed736aaa25068ecf9e77f34f896a/webUI/static/bootstrap/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /webUI/static/bootstrap/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataResponsibly/DataSynthesizer/90722857e7f6ed736aaa25068ecf9e77f34f896a/webUI/static/bootstrap/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /webUI/static/bootstrap/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/DataResponsibly/DataSynthesizer/90722857e7f6ed736aaa25068ecf9e77f34f896a/webUI/static/bootstrap/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /webUI/static/bootstrap/js/npm.js: -------------------------------------------------------------------------------- 1 | // This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. 2 | require('../../js/transition.js') 3 | require('../../js/alert.js') 4 | require('../../js/button.js') 5 | require('../../js/carousel.js') 6 | require('../../js/collapse.js') 7 | require('../../js/dropdown.js') 8 | require('../../js/modal.js') 9 | require('../../js/tooltip.js') 10 | require('../../js/popover.js') 11 | require('../../js/scrollspy.js') 12 | require('../../js/tab.js') 13 | require('../../js/affix.js') -------------------------------------------------------------------------------- /webUI/static/datatables-plugins/dataTables.bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | DataTables Bootstrap 3 integration 3 | ©2011-2014 SpryMedia Ltd - datatables.net/license 4 | */ 5 | (function(){var f=function(c,b){c.extend(!0,b.defaults,{dom:"<'row'<'col-sm-6'l><'col-sm-6'f>><'row'<'col-sm-12'tr>><'row'<'col-sm-6'i><'col-sm-6'p>>",renderer:"bootstrap"});c.extend(b.ext.classes,{sWrapper:"dataTables_wrapper form-inline dt-bootstrap",sFilterInput:"form-control input-sm",sLengthSelect:"form-control input-sm"});b.ext.renderer.pageButton.bootstrap=function(g,f,p,k,h,l){var q=new b.Api(g),r=g.oClasses,i=g.oLanguage.oPaginate,d,e,o=function(b,f){var j,m,n,a,k=function(a){a.preventDefault(); 6 | c(a.currentTarget).hasClass("disabled")||q.page(a.data.action).draw(!1)};j=0;for(m=f.length;j",{"class":r.sPageButton+" "+ 7 | e,"aria-controls":g.sTableId,tabindex:g.iTabIndex,id:0===p&&"string"===typeof a?g.sTableId+"_"+a:null}).append(c("",{href:"#"}).html(d)).appendTo(b),g.oApi._fnBindAction(n,{action:a},k))}};o(c(f).empty().html('