Last active
February 28, 2024 19:01
-
-
Save alimanfoo/eea0fdec41333a8c39d04f72a89dfd9b to your computer and use it in GitHub Desktop.
How to create links with zarr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Examples of creating links using Zarr, addressing comments in [GH297](https://github.com/zarr-developers/zarr/issues/297)." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"mkdir: created directory 'data'\r\n" | |
] | |
} | |
], | |
"source": [ | |
"import zarr\n", | |
"!mkdir -pv data" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"An automated process dumps data every day. They use Zarr and create a new root group for the data from each data. E.g.:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"# day 1\n", | |
"root = zarr.open('data/daily/2018-01-01')\n", | |
"# ... save some data.\n", | |
"# day 2\n", | |
"root = zarr.open('data/daily/2018-01-02')\n", | |
"# ... save some data.\n", | |
"# day 3\n", | |
"root = zarr.open('data/daily/2018-01-03')\n", | |
"# ... save some data.\n", | |
"# etc." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"\u001b[01;34mdata\u001b[00m\r\n", | |
"└── \u001b[01;34mdaily\u001b[00m\r\n", | |
" ├── \u001b[01;34m2018-01-01\u001b[00m\r\n", | |
" │ └── .zgroup\r\n", | |
" ├── \u001b[01;34m2018-01-02\u001b[00m\r\n", | |
" │ └── .zgroup\r\n", | |
" └── \u001b[01;34m2018-01-03\u001b[00m\r\n", | |
" └── .zgroup\r\n", | |
"\r\n", | |
"4 directories, 3 files\r\n" | |
] | |
} | |
], | |
"source": [ | |
"!tree -a data" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# View as single dataset" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"A user now wants to view this as one big dataset, rather than separate datasets." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Option 1 - turn the parent directory into a group\n", | |
"\n", | |
"In Zarr there is nothing special about a root group. You can turn any directory into a group, and a directory that was initially created as a root group can become a child group. E.g.:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<link rel=\"stylesheet\" href=\"//cdnjs.cloudflare.com/ajax/libs/jstree/3.3.3/themes/default/style.min.css\"/><div id=\"12e8336e-ecfa-45fc-9312-70a392528517\" class=\"zarr-tree\"><ul><li data-jstree='{\"type\": \"Group\"}' class='jstree-open'><span>/</span><ul><li data-jstree='{\"type\": \"Group\"}' class=''><span>2018-01-01</span></li><li data-jstree='{\"type\": \"Group\"}' class=''><span>2018-01-02</span></li><li data-jstree='{\"type\": \"Group\"}' class=''><span>2018-01-03</span></li></ul></li></ul></div>\n", | |
"<script>\n", | |
" if (!require.defined('jquery')) {\n", | |
" require.config({\n", | |
" paths: {\n", | |
" jquery: '//cdnjs.cloudflare.com/ajax/libs/jquery/1.12.1/jquery.min'\n", | |
" },\n", | |
" });\n", | |
" }\n", | |
" if (!require.defined('jstree')) {\n", | |
" require.config({\n", | |
" paths: {\n", | |
" jstree: '//cdnjs.cloudflare.com/ajax/libs/jstree/3.3.3/jstree.min'\n", | |
" },\n", | |
" });\n", | |
" }\n", | |
" require(['jstree'], function() {\n", | |
" $('#12e8336e-ecfa-45fc-9312-70a392528517').jstree({\n", | |
" types: {\n", | |
" Group: {\n", | |
" icon: \"fa fa-folder\"\n", | |
" },\n", | |
" Array: {\n", | |
" icon: \"fa fa-table\"\n", | |
" }\n", | |
" },\n", | |
" plugins: [\"types\"]\n", | |
" });\n", | |
" });\n", | |
"</script>\n" | |
], | |
"text/plain": [ | |
"/\n", | |
" ├── 2018-01-01\n", | |
" ├── 2018-01-02\n", | |
" └── 2018-01-03" | |
] | |
}, | |
"execution_count": 4, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"daily = zarr.open('data/daily')\n", | |
"daily.tree()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<zarr.hierarchy.Group '/2018-01-03'>" | |
] | |
}, | |
"execution_count": 5, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"daily['2018-01-03']" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"\u001b[01;34mdata\u001b[00m\r\n", | |
"└── \u001b[01;34mdaily\u001b[00m\r\n", | |
" ├── \u001b[01;34m2018-01-01\u001b[00m\r\n", | |
" │ └── .zgroup\r\n", | |
" ├── \u001b[01;34m2018-01-02\u001b[00m\r\n", | |
" │ └── .zgroup\r\n", | |
" ├── \u001b[01;34m2018-01-03\u001b[00m\r\n", | |
" │ └── .zgroup\r\n", | |
" └── .zgroup\r\n", | |
"\r\n", | |
"4 directories, 4 files\r\n" | |
] | |
} | |
], | |
"source": [ | |
"!tree -a data" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Note that a new '.zgroup' file has been created within the \"daily\" directory." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Option 2 - use file system links\n", | |
"\n", | |
"This approach is more flexible, as you can create any kind of view you want. E.g.:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"mkdir: created directory 'data/all'\n", | |
"'data/daily/2018-01-01' -> 'data/all/2018-01-01'\n", | |
"'data/daily/2018-01-01/.zgroup' -> 'data/all/2018-01-01/.zgroup'\n", | |
"'data/daily/2018-01-02' -> 'data/all/2018-01-02'\n", | |
"'data/daily/2018-01-02/.zgroup' -> 'data/all/2018-01-02/.zgroup'\n", | |
"'data/daily/2018-01-03' -> 'data/all/2018-01-03'\n", | |
"'data/daily/2018-01-03/.zgroup' -> 'data/all/2018-01-03/.zgroup'\n" | |
] | |
} | |
], | |
"source": [ | |
"!mkdir -pv data/all\n", | |
"!cp -rv --link data/daily/* data/all" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<link rel=\"stylesheet\" href=\"//cdnjs.cloudflare.com/ajax/libs/jstree/3.3.3/themes/default/style.min.css\"/><div id=\"123d4430-5e8e-48db-b449-b9466a1306d0\" class=\"zarr-tree\"><ul><li data-jstree='{\"type\": \"Group\"}' class='jstree-open'><span>/</span><ul><li data-jstree='{\"type\": \"Group\"}' class=''><span>2018-01-01</span></li><li data-jstree='{\"type\": \"Group\"}' class=''><span>2018-01-02</span></li><li data-jstree='{\"type\": \"Group\"}' class=''><span>2018-01-03</span></li></ul></li></ul></div>\n", | |
"<script>\n", | |
" if (!require.defined('jquery')) {\n", | |
" require.config({\n", | |
" paths: {\n", | |
" jquery: '//cdnjs.cloudflare.com/ajax/libs/jquery/1.12.1/jquery.min'\n", | |
" },\n", | |
" });\n", | |
" }\n", | |
" if (!require.defined('jstree')) {\n", | |
" require.config({\n", | |
" paths: {\n", | |
" jstree: '//cdnjs.cloudflare.com/ajax/libs/jstree/3.3.3/jstree.min'\n", | |
" },\n", | |
" });\n", | |
" }\n", | |
" require(['jstree'], function() {\n", | |
" $('#123d4430-5e8e-48db-b449-b9466a1306d0').jstree({\n", | |
" types: {\n", | |
" Group: {\n", | |
" icon: \"fa fa-folder\"\n", | |
" },\n", | |
" Array: {\n", | |
" icon: \"fa fa-table\"\n", | |
" }\n", | |
" },\n", | |
" plugins: [\"types\"]\n", | |
" });\n", | |
" });\n", | |
"</script>\n" | |
], | |
"text/plain": [ | |
"/\n", | |
" ├── 2018-01-01\n", | |
" ├── 2018-01-02\n", | |
" └── 2018-01-03" | |
] | |
}, | |
"execution_count": 8, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"data = zarr.open('data/all')\n", | |
"data.tree()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"\u001b[01;34mdata/all\u001b[00m\r\n", | |
"├── \u001b[01;34m2018-01-01\u001b[00m\r\n", | |
"│ └── .zgroup\r\n", | |
"├── \u001b[01;34m2018-01-02\u001b[00m\r\n", | |
"│ └── .zgroup\r\n", | |
"├── \u001b[01;34m2018-01-03\u001b[00m\r\n", | |
"│ └── .zgroup\r\n", | |
"└── .zgroup\r\n", | |
"\r\n", | |
"3 directories, 4 files\r\n" | |
] | |
} | |
], | |
"source": [ | |
"!tree -a data/all" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# View latest day of data\n", | |
"\n", | |
"Could be done with file system links. E.g.:" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"'data/daily/2018-01-01' -> 'data/daily/latest'\r\n", | |
"'data/daily/2018-01-01/.zgroup' -> 'data/daily/latest/.zgroup'\r\n" | |
] | |
} | |
], | |
"source": [ | |
"!cp -rv --link data/daily/2018-01-01 data/daily/latest" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<link rel=\"stylesheet\" href=\"//cdnjs.cloudflare.com/ajax/libs/jstree/3.3.3/themes/default/style.min.css\"/><div id=\"3ba59d64-f93c-414a-9482-419440ce857f\" class=\"zarr-tree\"><ul><li data-jstree='{\"type\": \"Group\"}' class='jstree-open'><span>/</span><ul><li data-jstree='{\"type\": \"Group\"}' class=''><span>2018-01-01</span></li><li data-jstree='{\"type\": \"Group\"}' class=''><span>2018-01-02</span></li><li data-jstree='{\"type\": \"Group\"}' class=''><span>2018-01-03</span></li><li data-jstree='{\"type\": \"Group\"}' class=''><span>latest</span></li></ul></li></ul></div>\n", | |
"<script>\n", | |
" if (!require.defined('jquery')) {\n", | |
" require.config({\n", | |
" paths: {\n", | |
" jquery: '//cdnjs.cloudflare.com/ajax/libs/jquery/1.12.1/jquery.min'\n", | |
" },\n", | |
" });\n", | |
" }\n", | |
" if (!require.defined('jstree')) {\n", | |
" require.config({\n", | |
" paths: {\n", | |
" jstree: '//cdnjs.cloudflare.com/ajax/libs/jstree/3.3.3/jstree.min'\n", | |
" },\n", | |
" });\n", | |
" }\n", | |
" require(['jstree'], function() {\n", | |
" $('#3ba59d64-f93c-414a-9482-419440ce857f').jstree({\n", | |
" types: {\n", | |
" Group: {\n", | |
" icon: \"fa fa-folder\"\n", | |
" },\n", | |
" Array: {\n", | |
" icon: \"fa fa-table\"\n", | |
" }\n", | |
" },\n", | |
" plugins: [\"types\"]\n", | |
" });\n", | |
" });\n", | |
"</script>\n" | |
], | |
"text/plain": [ | |
"/\n", | |
" ├── 2018-01-01\n", | |
" ├── 2018-01-02\n", | |
" ├── 2018-01-03\n", | |
" └── latest" | |
] | |
}, | |
"execution_count": 11, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"daily = zarr.open('data/daily')\n", | |
"daily.tree()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 12, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"removed 'data/daily/latest/.zgroup'\n", | |
"removed directory 'data/daily/latest'\n", | |
"'data/daily/2018-01-02' -> 'data/daily/latest'\n", | |
"'data/daily/2018-01-02/.zgroup' -> 'data/daily/latest/.zgroup'\n" | |
] | |
} | |
], | |
"source": [ | |
"# update latest link\n", | |
"!rm -rv data/daily/latest\n", | |
"!cp -rv --link data/daily/2018-01-02 data/daily/latest" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# More examples\n", | |
"\n", | |
"Here's a possible solution to a similar requirement, expressed slightly differently, by @onalant:\n", | |
"\n", | |
">Here is my understanding of the problem. Take some zarr store, a.zarr.\n", | |
"Every day, some application writes some data to a.zarr. However, it\n", | |
"groups the data together by the date on which it was written. We may\n", | |
"have have groups like /2018/08/30, for example. What @mrocklin seems\n", | |
"to be proposing is having multiple metadata files that \"transmute\" the\n", | |
"user-facing appearance of a.zarr. Suppose we also had b.zarr and\n", | |
"c.zarr, two stores that refer to a.zarr for data. However, b.zarr\n", | |
"specifies in its metadata that it shows the \"latest\" data entries\n", | |
"(/2018/08/30, e.g.), while c.zarr \"flattens\" all of the data in\n", | |
"a.zarr to appear as though everything were under the root group.\n", | |
"\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<zarr.hierarchy.Group '/2018/09/01'>" | |
] | |
}, | |
"execution_count": 13, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"a = zarr.open('data/a.zarr')\n", | |
"# day 1\n", | |
"a.create_group('2018/08/30')\n", | |
"# day 2\n", | |
"a.create_group('2018/08/31')\n", | |
"# day 3\n", | |
"a.create_group('2018/09/01')\n", | |
"# etc." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<link rel=\"stylesheet\" href=\"//cdnjs.cloudflare.com/ajax/libs/jstree/3.3.3/themes/default/style.min.css\"/><div id=\"8b291562-d4f0-482e-af3f-a08445395ba7\" class=\"zarr-tree\"><ul><li data-jstree='{\"type\": \"Group\"}' class='jstree-open'><span>/</span><ul><li data-jstree='{\"type\": \"Group\"}' class='jstree-open'><span>2018</span><ul><li data-jstree='{\"type\": \"Group\"}' class='jstree-open'><span>08</span><ul><li data-jstree='{\"type\": \"Group\"}' class='jstree-open'><span>30</span></li><li data-jstree='{\"type\": \"Group\"}' class='jstree-open'><span>31</span></li></ul></li><li data-jstree='{\"type\": \"Group\"}' class='jstree-open'><span>09</span><ul><li data-jstree='{\"type\": \"Group\"}' class='jstree-open'><span>01</span></li></ul></li></ul></li></ul></li></ul></div>\n", | |
"<script>\n", | |
" if (!require.defined('jquery')) {\n", | |
" require.config({\n", | |
" paths: {\n", | |
" jquery: '//cdnjs.cloudflare.com/ajax/libs/jquery/1.12.1/jquery.min'\n", | |
" },\n", | |
" });\n", | |
" }\n", | |
" if (!require.defined('jstree')) {\n", | |
" require.config({\n", | |
" paths: {\n", | |
" jstree: '//cdnjs.cloudflare.com/ajax/libs/jstree/3.3.3/jstree.min'\n", | |
" },\n", | |
" });\n", | |
" }\n", | |
" require(['jstree'], function() {\n", | |
" $('#8b291562-d4f0-482e-af3f-a08445395ba7').jstree({\n", | |
" types: {\n", | |
" Group: {\n", | |
" icon: \"fa fa-folder\"\n", | |
" },\n", | |
" Array: {\n", | |
" icon: \"fa fa-table\"\n", | |
" }\n", | |
" },\n", | |
" plugins: [\"types\"]\n", | |
" });\n", | |
" });\n", | |
"</script>\n" | |
], | |
"text/plain": [ | |
"/\n", | |
" └── 2018\n", | |
" ├── 08\n", | |
" │ ├── 30\n", | |
" │ └── 31\n", | |
" └── 09\n", | |
" └── 01" | |
] | |
}, | |
"execution_count": 14, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"a.tree(expand=True)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 15, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"mkdir: created directory 'data/b.zarr'\n", | |
"'data/a.zarr/2018/09/01' -> 'data/b.zarr/latest'\n", | |
"'data/a.zarr/2018/09/01/.zgroup' -> 'data/b.zarr/latest/.zgroup'\n" | |
] | |
} | |
], | |
"source": [ | |
"# create a \"latest\" dataset\n", | |
"!mkdir -pv data/b.zarr\n", | |
"!cp -rv --link data/a.zarr/2018/09/01 data/b.zarr/latest" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 16, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<link rel=\"stylesheet\" href=\"//cdnjs.cloudflare.com/ajax/libs/jstree/3.3.3/themes/default/style.min.css\"/><div id=\"cb8ff541-f6d3-4f34-bf5f-e5b5e7b444e1\" class=\"zarr-tree\"><ul><li data-jstree='{\"type\": \"Group\"}' class='jstree-open'><span>/</span><ul><li data-jstree='{\"type\": \"Group\"}' class=''><span>latest</span></li></ul></li></ul></div>\n", | |
"<script>\n", | |
" if (!require.defined('jquery')) {\n", | |
" require.config({\n", | |
" paths: {\n", | |
" jquery: '//cdnjs.cloudflare.com/ajax/libs/jquery/1.12.1/jquery.min'\n", | |
" },\n", | |
" });\n", | |
" }\n", | |
" if (!require.defined('jstree')) {\n", | |
" require.config({\n", | |
" paths: {\n", | |
" jstree: '//cdnjs.cloudflare.com/ajax/libs/jstree/3.3.3/jstree.min'\n", | |
" },\n", | |
" });\n", | |
" }\n", | |
" require(['jstree'], function() {\n", | |
" $('#cb8ff541-f6d3-4f34-bf5f-e5b5e7b444e1').jstree({\n", | |
" types: {\n", | |
" Group: {\n", | |
" icon: \"fa fa-folder\"\n", | |
" },\n", | |
" Array: {\n", | |
" icon: \"fa fa-table\"\n", | |
" }\n", | |
" },\n", | |
" plugins: [\"types\"]\n", | |
" });\n", | |
" });\n", | |
"</script>\n" | |
], | |
"text/plain": [ | |
"/\n", | |
" └── latest" | |
] | |
}, | |
"execution_count": 16, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"b = zarr.open('data/b.zarr')\n", | |
"b.tree()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 17, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"mkdir: created directory 'data/c.zarr'\n", | |
"year: 2018\n", | |
"month: 08\n", | |
"'data/a.zarr/2018/08/30' -> 'data/c.zarr/2018-08-30'\n", | |
"'data/a.zarr/2018/08/30/.zgroup' -> 'data/c.zarr/2018-08-30/.zgroup'\n", | |
"'data/a.zarr/2018/08/31' -> 'data/c.zarr/2018-08-31'\n", | |
"'data/a.zarr/2018/08/31/.zgroup' -> 'data/c.zarr/2018-08-31/.zgroup'\n", | |
"month: 09\n", | |
"'data/a.zarr/2018/09/01' -> 'data/c.zarr/2018-09-01'\n", | |
"'data/a.zarr/2018/09/01/.zgroup' -> 'data/c.zarr/2018-09-01/.zgroup'\n" | |
] | |
} | |
], | |
"source": [ | |
"%%bash\n", | |
"# create a flattened hierarchy\n", | |
"mkdir -pv data/c.zarr\n", | |
"for year in $(ls -1 data/a.zarr); do\n", | |
" echo year: $year\n", | |
" for month in $(ls -1 data/a.zarr/${year}); do\n", | |
" echo month: $month\n", | |
" for day in $(ls -1 data/a.zarr/${year}/${month}); do\n", | |
" cp -rv --link data/a.zarr/${year}/${month}/${day} data/c.zarr/${year}-${month}-${day}\n", | |
" done\n", | |
" done\n", | |
"done\n" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 18, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<link rel=\"stylesheet\" href=\"//cdnjs.cloudflare.com/ajax/libs/jstree/3.3.3/themes/default/style.min.css\"/><div id=\"bbff88d5-8c1b-44e3-b83a-dce582f3c9ea\" class=\"zarr-tree\"><ul><li data-jstree='{\"type\": \"Group\"}' class='jstree-open'><span>/</span><ul><li data-jstree='{\"type\": \"Group\"}' class=''><span>2018-08-30</span></li><li data-jstree='{\"type\": \"Group\"}' class=''><span>2018-08-31</span></li><li data-jstree='{\"type\": \"Group\"}' class=''><span>2018-09-01</span></li></ul></li></ul></div>\n", | |
"<script>\n", | |
" if (!require.defined('jquery')) {\n", | |
" require.config({\n", | |
" paths: {\n", | |
" jquery: '//cdnjs.cloudflare.com/ajax/libs/jquery/1.12.1/jquery.min'\n", | |
" },\n", | |
" });\n", | |
" }\n", | |
" if (!require.defined('jstree')) {\n", | |
" require.config({\n", | |
" paths: {\n", | |
" jstree: '//cdnjs.cloudflare.com/ajax/libs/jstree/3.3.3/jstree.min'\n", | |
" },\n", | |
" });\n", | |
" }\n", | |
" require(['jstree'], function() {\n", | |
" $('#bbff88d5-8c1b-44e3-b83a-dce582f3c9ea').jstree({\n", | |
" types: {\n", | |
" Group: {\n", | |
" icon: \"fa fa-folder\"\n", | |
" },\n", | |
" Array: {\n", | |
" icon: \"fa fa-table\"\n", | |
" }\n", | |
" },\n", | |
" plugins: [\"types\"]\n", | |
" });\n", | |
" });\n", | |
"</script>\n" | |
], | |
"text/plain": [ | |
"/\n", | |
" ├── 2018-08-30\n", | |
" ├── 2018-08-31\n", | |
" └── 2018-09-01" | |
] | |
}, | |
"execution_count": 18, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"c = zarr.open('data/c.zarr')\n", | |
"c.tree()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"language": "python", | |
"name": "python3" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 3 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython3", | |
"version": "3.6.5" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment