{"id":33179881,"url":"https://github.com/cardillo/joinery","last_synced_at":"2026-01-23T18:39:33.844Z","repository":{"id":22715197,"uuid":"26059473","full_name":"cardillo/joinery","owner":"cardillo","description":"Data frames for Java","archived":false,"fork":false,"pushed_at":"2025-12-03T16:58:40.000Z","size":683,"stargazers_count":709,"open_issues_count":51,"forks_count":167,"subscribers_count":42,"default_branch":"master","last_synced_at":"2026-01-17T18:11:29.751Z","etag":null,"topics":["data-frame","data-frames","dataframe-library","java","joinery"],"latest_commit_sha":null,"homepage":"https://joinery.sh","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"jstayton/GoogleMapsGeocoder","license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cardillo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":["cardillo"]}},"created_at":"2014-11-01T18:34:43.000Z","updated_at":"2026-01-15T03:35:15.000Z","dependencies_parsed_at":"2022-08-21T10:00:41.400Z","dependency_job_id":null,"html_url":"https://github.com/cardillo/joinery","commit_stats":null,"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"purl":"pkg:github/cardillo/joinery","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cardillo%2Fjoinery","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cardillo%2Fjoinery/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cardillo%2Fjoinery/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cardillo%2Fjoinery/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cardillo","download_url":"https://codeload.github.com/cardillo/joinery/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cardillo%2Fjoinery/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28697534,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-23T17:25:48.045Z","status":"ssl_error","status_checked_at":"2026-01-23T17:25:47.153Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["data-frame","data-frames","dataframe-library","java","joinery"],"created_at":"2025-11-16T03:00:36.844Z","updated_at":"2026-01-23T18:39:33.832Z","avatar_url":"https://github.com/cardillo.png","language":"Java","readme":"joinery\n==========\n\n\u003cdl\u003e\n  \u003cdt\u003ejoinery [joi-nuh-ree]\u003c/dt\u003e\n  \u003cdd\u003e\u003c/dd\u003e\n  \u003cdd\u003e\n    1. In woodworking, the craft of joining together\n    pieces of wood to produce more complex items.\n  \u003c/dd\u003e\n  \u003cdd\u003e\n    2. In Java, a data analysis library for joining together\n    pieces of data to produce insight.\n  \u003c/dd\u003e\n\u003c/dl\u003e\n\n----------\n\n[![Build Status](https://img.shields.io/github/workflow/status/cardillo/joinery/build%20and%20test)](https://github.com/cardillo/joinery/actions/workflows/build.yml)\n[![Codecov](https://img.shields.io/codecov/c/github/cardillo/joinery)](https://codecov.io/gh/cardillo/joinery)\n[![Maven Central](https://img.shields.io/maven-central/v/sh.joinery/joinery-dataframe)](https://search.maven.org/artifact/sh.joinery/joinery-dataframe/1.10/jar)\n\n\nquick start\n==========\n\nRemember **FizzBuzz** (of course you do!), well imagine you have just\nsolved the puzzle (well done!) and you have written the results to\na comma-delimited file for further analysis.  Now you want to know\nhow many times are the strings `Fizz`, `Buzz`, and `FizzBuzz`\nprinted out.\n\nYou could answer this question any number of ways, for example you\ncould modify the original program, or reach for Python/pandas, or even\n(for the sadistic among us, you know who you are) type out a one-liner\nat the command prompt (probably including `cut`, `sort`, and `uniq`).\n\nWell, now you have one more option.  This option is especially good\nif you are 1) using Java already and 2) may need to integrate your\nsolution with other Java applications in the future.\n\nYou can answer this question with **joinery**.\n\n```java\ndf.groupBy(\"value\")\n  .count()\n  .sortBy(\"-number\")\n  .head(3)\n```\n\nPrinting out the resulting data frame gives us the following table.\n\n```\n  \t   value \tnumber\n 0\tFizz    \t    27\n 1\tBuzz    \t    14\n 2\tFizzBuzz\t     6\n```\n\nSee [FizzBuzz.java](https://github.com/cardillo/joinery/blob/master/src/test/java/examples/FizzBuzz.java)\nfor the complete code.\n\n\nnext steps\n==========\n\nGet the [executable jar](https://repo.maven.apache.org/maven2/sh/joinery/joinery-dataframe/1.10/joinery-dataframe-1.10-jar-with-dependencies.jar) and try it for yourself.\n\n```javascript\n$ java -jar joinery-dataframe-1.10-jar-with-dependencies.jar shell\n# Joinery -- Data frames for Java, 1.10-deb702e\n# OpenJDK 64-Bit Server VM, Oracle Corporation, 1.8.0_92-internal\n# Rhino 1.7 release 2 2009 03 22\n\u003e df = new DataFrame()\n[empty data frame]\n\u003e df.add(\"value\")\n[empty data frame]\n\u003e [10, 20, 30].forEach(function(val) {\n      df.append([val])\n  })\n\u003e df\n        value\n 0\t   10\n 1\t   20\n 2\t   30\n\n\u003e\n```\n\n\nmaven\n==========\n\nSince version 1.10, joinery is included in the central repo.  If you are upgrading from a prior version, note the new group id.\n\n```xml\n\u003cdependency\u003e\n  \u003cgroupId\u003esh.joinery\u003c/groupId\u003e\n  \u003cartifactId\u003ejoinery-dataframe\u003c/artifactId\u003e\n  \u003cversion\u003e1.10\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\nutilities\n==========\n\n**joinery** includes some tools to make working with data frames easier.\nThese tools are available by running `joinery.DataFrame` as an application.\n\n```bash\n$ java joinery.DataFrame\nusage: joinery.DataFrame [compare|plot|show|shell] [csv-file ...]\n```\n\nshow\n----------\nShow displays the tabular data of a data frame in a gui window.\n\n```bash\n$ java joinery.DataFrame show data.csv\n```\n\n![Screenshot of show window](https://raw.githubusercontent.com/cardillo/joinery/master/src/main/resources/templates/assets/images/joinery-show.png)\n\nplot\n----------\nPlot displays the numeric data of a data frame as a chart.\n\n```bash\n$ java joinery.DataFrame plot data.csv\n```\n\n![Screenshot of plot window](https://raw.githubusercontent.com/cardillo/joinery/master/src/main/resources/templates/assets/images/joinery-plot.png)\n\nshell\n----------\nLaunches an interactive JavaScript shell for working with data frames.\n\n```javascript\n$ java joinery.DataFrame shell\n# Joinery -- Data frames for Java, 1.10-deb702e\n# OpenJDK 64-Bit Server VM, Oracle Corporation, 1.8.0_92-internal\n# Rhino 1.7 release 2 2009 03 22\n\u003e df = DataFrame.readCsv(\"https://www.quandl.com/api/v1/datasets/GOOG/NASDAQ_AAPL.csv\")\n              Date\t  Open\t  High\t   Low\t        Close\t             Volume\n    0\t2015-03-20\t128.25\t128.4\t125.16\t 125.90000000\t  68695136.00000000\n    1\t2015-03-19\t128.75\t129.25\t127.4\t 127.50000000\t  45809490.00000000\n    2\t2015-03-18\t127.0\t129.16\t126.37\t 128.47000000\t  65270945.00000000\n    3\t2015-03-17\t125.9\t127.32\t125.65\t 127.04000000\t  51023104.00000000\n    4\t2015-03-16\t123.88\t124.95\t122.87\t 124.95000000\t  35874300.00000000\n    5\t2015-03-13\t124.4\t125.4\t122.58\t 123.59000000\t  51827283.00000000\n    6\t2015-03-12\t122.31\t124.9\t121.63\t 124.45000000\t  48362719.00000000\n    7\t2015-03-11\t124.75\t124.77\t122.11\t 122.24000000\t  68938974.00000000\n    8\t2015-03-10\t126.41\t127.22\t123.8\t 124.51000000\t  68856582.00000000\n\n... 8649 rows skipped ...\n\n 8658\t1980-12-12\t0.0\t4.12\t4.11\t   4.11000000\t  14657300.00000000\n\n\u003e df.types()\n[class java.util.Date, class java.lang.String, class java.lang.String, class java.lang.String, class java.lang.Double, class java.lang.Double]\n\u003e df.sortBy(\"Date\")\n              Date     Open     High     Low            Close                Volume\n 8658\t1980-12-12\t0.0\t4.12\t4.11\t   4.11000000\t  14657300.00000000\n 8657\t1980-12-15\t0.0\t3.91\t3.89\t   3.89000000\t   5496400.00000000\n 8656\t1980-12-16\t0.0\t3.62\t3.61\t   3.61000000\t   3304000.00000000\n 8655\t1980-12-17\t0.0\t3.71\t3.7 \t   3.70000000\t   2701300.00000000\n 8654\t1980-12-18\t0.0\t3.82\t3.8 \t   3.80000000\t   2295300.00000000\n 8653\t1980-12-19\t0.0\t4.05\t4.04\t   4.04000000\t   1519700.00000000\n 8652\t1980-12-22\t0.0\t4.25\t4.23\t   4.23000000\t   1167600.00000000\n 8651\t1980-12-23\t0.0\t4.43\t4.41\t   4.41000000\t   1467200.00000000\n 8650\t1980-12-24\t0.0\t4.66\t4.64\t   4.64000000\t   1500100.00000000\n\n... 8649 rows skipped ...\n\n    0\t2015-03-20\t128.25\t128.4\t125.16\t 125.90000000\t  68695136.00000000\n\n\u003e .reindex(\"Date\")\n\t       Open\tHigh\t Low\t        Close\t             Volume\n1980-12-12\t0.0\t4.12\t4.11\t   4.11000000\t  14657300.00000000\n1980-12-15\t0.0\t3.91\t3.89\t   3.89000000\t   5496400.00000000\n1980-12-16\t0.0\t3.62\t3.61\t   3.61000000\t   3304000.00000000\n1980-12-17\t0.0\t3.71\t3.7 \t   3.70000000\t   2701300.00000000\n1980-12-18\t0.0\t3.82\t3.8 \t   3.80000000\t   2295300.00000000\n1980-12-19\t0.0\t4.05\t4.04\t   4.04000000\t   1519700.00000000\n1980-12-22\t0.0\t4.25\t4.23\t   4.23000000\t   1167600.00000000\n1980-12-23\t0.0\t4.43\t4.41\t   4.41000000\t   1467200.00000000\n1980-12-24\t0.0\t4.66\t4.64\t   4.64000000\t   1500100.00000000\n\n... 8649 rows skipped ...\n\n2015-03-20\t128.25\t128.4\t125.16\t 125.90000000\t  68695136.00000000\n\n\u003e .retain(\"Close\")\n\t                Close\n1980-12-12\t   4.11000000\n1980-12-15\t   3.89000000\n1980-12-16\t   3.61000000\n1980-12-17\t   3.70000000\n1980-12-18\t   3.80000000\n1980-12-19\t   4.04000000\n1980-12-22\t   4.23000000\n1980-12-23\t   4.41000000\n1980-12-24\t   4.64000000\n\n... 8649 rows skipped ...\n\n2015-03-20\t 125.90000000\n\n\u003e .plot(PlotType.AREA)\n```\n\ndocumentation\n==========\n\nThe complete api documentation for the `DataFrame` class is available\nat https://joinery.sh\n\n","funding_links":["https://github.com/sponsors/cardillo"],"categories":["数据科学"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcardillo%2Fjoinery","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcardillo%2Fjoinery","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcardillo%2Fjoinery/lists"}