{ "info": { "author": "bmcorser", "author_email": "bmcorser@gmail.com", "bugtrack_url": null, "classifiers": [], "description": "expr\n==========\n\n.. figure:: https://raw.githubusercontent.com/bmcorser/expr/master/expr.png\n :alt: expr\n\nCreate simple visualisations of mathematical operations on `small datasets`_\nby rendering an `expression graph`_, show your friends or serialise it for later.\n\n.. _`expression graph`: https://code.google.com/p/pydot/\n.. _`small datasets`: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.html\n\nContents\n--------\n\n- `Usage`_\n\n * `Starting out`_\n * `Less verbosity`_\n * `Involving pandas`_\n * `Serialising`_\n\n- `Known issues`_\n- `Also`_\n\nUsage\n~~~~~\n\nExamples follow using the Python interactive shell\n\nStarting out\n^^^^^^^^^^^^\n\nImport some things from the module\n\n.. code:: python\n\n from expr import Expr, NumExpr\n\nConstruct an expression\n\n.. code:: python\n\n expr = Expr(\n operation_name='+',\n arguments=[\n NumExpr(number=1),\n Expr(\n operation_name='/',\n arguments=[\n NumExpr(number=2),\n NumExpr(number=3),\n ]\n )\n ]\n )\n\nGet an answer\n\n.. code:: python\n\n >> expr.resolve()\n 1.6666666666666665\n\nDraw a graph\n\n.. code:: python\n\n >> graph = expr.graph()\n >> graph.write_png('example.png')\n True\n\n``example.png``\n\n.. figure:: https://raw.githubusercontent.com/bmcorser/expr/master/example.png\n :alt: example\n\n\nLess verbosity\n^^^^^^^^^^^^^^\n\nImport things using ``as`` to save your typing fingers by aliasing those\ncharacters away. In Python we don't really need to care if functions specify\nkeyword or positional signatures, so let's not bother with those wordy\nkeywords, hey.\n\n.. code:: python\n\n >>> from expr import Expr as E, NumExpr as N\n >>> expr = E('/', [N(22), N(7)])\n >>> expr.resolve()\n 3.142857142857143\n >>> expr.graph().write_png('pi.png')\n True\n\n``pi.png``\n\n.. figure:: https://raw.githubusercontent.com/bmcorser/expr/master/pi.png\n :alt: pi\n\n\nInvolving pandas\n^^^^^^^^^^^^^^^^\n\nWe can create expressions that involve more than just numbers ...\n\n.. code:: python\n\n >>> import pandas\n >>> from expr import (\n ... Expr as E,\n ... NumExpr as N,\n ... DataFrameExpr as D,\n ... )\n\nCreate some stupid datasets\n\n.. code:: python\n\n >>> def two_by_four():\n ... data = [(n + 1, n + 1) for n in range(4)]\n ... return pandas.DataFrame.from_records(data=data, columns=['a', 'b'])\n\n >>> df_A = two_by_four()\n >>> df_B = two_by_four()\n >>> df_A\n a b\n 0 1 1\n 1 2 2\n 2 3 3\n 3 4 4\n\nCreate the expression object, the ``DataFrameExpr`` object (aliased here\nas ``D``) takes an optional argument ``name`` which will be used as a label if\npresent, otherwise an automatically generated label will applied.\n\n.. code:: python\n\n >>> expr = E('*', [N(3), E('+', [D(df_A, 'A'), D(df_B, 'B')])])\n >>> expr.graph().write_png('dataframe.png')\n True\n >>> expr.resolve()\n 0 1\n 0 6 6\n 1 12 12\n 2 18 18\n 3 24 24\n\n``dataframe.png``\n\n.. figure:: https://raw.githubusercontent.com/bmcorser/expr/master/dataframe.png\n :alt: dataframe\n\nSerialising\n~~~~~~~~~~~\n\nLet's serialise the above example using JSON, any arguments passed to the\n``serialise`` method are used when the serialiser function is applied.\n\n.. code:: python\n\n >>> import json\n >>> print(expr.serialise(json.dumps, indent=4))\n {\n \"__type__\": \"Expr\",\n \"operation_name\": \"*\",\n \"arguments\": [\n {\n \"__type__\": \"NumExpr\",\n \"number\": 3.0\n },\n {\n \"__type__\": \"Expr\",\n \"operation_name\": \"+\",\n \"arguments\": [\n {\n \"__type__\": \"DataFrameExpr\",\n \"name\": \"A\",\n \"dataframe\": {\n \"a\": {\n \"0\": 1,\n \"1\": 2,\n \"2\": 3,\n \"3\": 4\n },\n \"b\": {\n \"0\": 1,\n \"1\": 2,\n \"2\": 3,\n \"3\": 4\n }\n }\n },\n {\n \"__type__\": \"DataFrameExpr\",\n \"name\": \"B\",\n \"dataframe\": {\n \"a\": {\n \"0\": 1,\n \"1\": 2,\n \"2\": 3,\n \"3\": 4\n },\n \"b\": {\n \"0\": 1,\n \"1\": 2,\n \"2\": 3,\n \"3\": 4\n }\n }\n }\n ]\n }\n ]\n }\n\nGetting funccy\n^^^^^^^^^^^^^^\n\nThe final expression provided in this package is ``FuncExpr``, which applies\narbitrary functions to the arguments supplied (which should be objects\nimplementing a ``resolve`` method). Keywords are also applied, probably for\nspecifying options, which do not have to be expression objects. A contrived\nexample of ``FuncExpr`` use follows.\n\nDo some smart imports\n\n.. code:: python\n\n import pandas\n from expr import (\n Expr as E,\n NumExpr as N,\n DataFrameExpr as D,\n FuncExpr as F,\n )\n\nDefine a factory function for creating ``DataFrame`` objects\n\n.. code:: python\n\n def x_by_y(x, y, columns=False):\n data = [[a + b for b in range(x)] for a in range(y)]\n if columns is False:\n columns = [chr(97 + c) for c in range(x)]\n return pandas.DataFrame.from_records(data=data, columns=columns)\n\nCrank out some df's for later use\n\n.. code:: python\n\n df_A = x_by_y(3, 4)\n df_B = x_by_y(3, 4)\n df_C = x_by_y(3, 4)\n\nNow set up out expression and look at its graph\n\n.. code:: python\n\n expr = E('+',\n [\n E('*',\n [\n N(3),\n F('pandas.concat',\n [\n D(x_by_y(1, 4, ['a'])),\n D(x_by_y(1, 4, ['b'])),\n D(x_by_y(1, 4, ['c'])),\n ], axis=1\n )\n ]\n ),\n D(x_by_y(3, 4))\n ]\n )\n G = expr.graph()\n G.write_png('func.png')\n\n``func.png``\n\n.. figure:: https://raw.githubusercontent.com/bmcorser/expr/master/func.png\n :alt: func\n\nCrazy ish\n^^^^^^^^^\n\nWhy not very clumsily visualise a call stack for your audience's pleasure?\n\n\nKnown Issues\n~~~~~~~~~~~~\n\nIf you like YAML, serialising ``pandas`` objects, may_ be problematic_, but\nJSON should be fine.\n\n.. _may: http://pyyaml.org/ticket/254\n.. _problematic: http://pyyaml.org/ticket/192\n\nAlso\n~~~~\n\nColours courtesy of clrs.cc_\n\n.. _clrs.cc: http://clrs.cc", "description_content_type": null, "docs_url": null, "download_url": "UNKNOWN", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/bmcorser/expr", "keywords": null, "license": "UNKNOWN", "maintainer": null, "maintainer_email": null, "name": "expr", "package_url": "https://pypi.org/project/expr/", "platform": "UNKNOWN", "project_url": "https://pypi.org/project/expr/", "project_urls": { "Download": "UNKNOWN", "Homepage": "https://github.com/bmcorser/expr" }, "release_url": "https://pypi.org/project/expr/0.0.1h/", "requires_dist": null, "requires_python": null, "summary": "Draw little expression graphs; made to be hacked on.", "version": "0.0.1h" }, "last_serial": 1242937, "releases": { "0.0.1e": [ { "comment_text": "", "digests": { "md5": "ef940f4dc925bd55b554ada1083b8fa5", "sha256": "6071d41306185fb6f87a2a25da06fc43176c3268da0a98e835d0b516c4d7e8bd" }, "downloads": -1, "filename": "expr-0.0.1e.tar.gz", "has_sig": false, "md5_digest": "ef940f4dc925bd55b554ada1083b8fa5", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4894, "upload_time": "2014-09-29T00:35:37", "url": "https://files.pythonhosted.org/packages/90/5d/fb1e06f3e23de2b85078e07ae36fd056469df98d2b83c50234dba0029678/expr-0.0.1e.tar.gz" } ], "0.0.1f": [ { "comment_text": "", "digests": { "md5": "78a821aa6790f0e5e0709bcbead0b6a8", "sha256": "a0890a9022c886652aa21bf014e9ab0c63cb964fdc895acfbb29915e9e3e8bc5" }, "downloads": -1, "filename": "expr-0.0.1f.tar.gz", "has_sig": false, "md5_digest": "78a821aa6790f0e5e0709bcbead0b6a8", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 4929, "upload_time": "2014-09-29T06:10:32", "url": "https://files.pythonhosted.org/packages/31/98/f988dbdda015d54a1bd9436406c86b59e7270ddc3e736736503cd955e74a/expr-0.0.1f.tar.gz" } ], "0.0.1g": [ { "comment_text": "", "digests": { "md5": "b87b63469b250fa3a4a3b2c14a202504", "sha256": "e716783a62d02b0a86a8c1596acae730ed3ec78bfae6d6018a8d8240519d7646" }, "downloads": -1, "filename": "expr-0.0.1g.tar.gz", "has_sig": false, "md5_digest": "b87b63469b250fa3a4a3b2c14a202504", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 5353, "upload_time": "2014-09-29T06:27:52", "url": "https://files.pythonhosted.org/packages/8d/c7/5c44702f14de6cdc5638d960320a78ff9dcc521103237c3ca1458e0003c6/expr-0.0.1g.tar.gz" } ], "0.0.1h": [ { "comment_text": "", "digests": { "md5": "654bd5c0eca933e190d27f0d4209017f", "sha256": "6b99490b24bf91e63b3fb12dba679b3092b467fcce5ba62efc6c4e839059a805" }, "downloads": -1, "filename": "expr-0.0.1h.tar.gz", "has_sig": false, "md5_digest": "654bd5c0eca933e190d27f0d4209017f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6546, "upload_time": "2014-09-30T10:43:39", "url": "https://files.pythonhosted.org/packages/2b/cd/89c913fd7faf9e277def5cc1d5926c9cadd9f9e0318dc021b9755c6800a9/expr-0.0.1h.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "654bd5c0eca933e190d27f0d4209017f", "sha256": "6b99490b24bf91e63b3fb12dba679b3092b467fcce5ba62efc6c4e839059a805" }, "downloads": -1, "filename": "expr-0.0.1h.tar.gz", "has_sig": false, "md5_digest": "654bd5c0eca933e190d27f0d4209017f", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 6546, "upload_time": "2014-09-30T10:43:39", "url": "https://files.pythonhosted.org/packages/2b/cd/89c913fd7faf9e277def5cc1d5926c9cadd9f9e0318dc021b9755c6800a9/expr-0.0.1h.tar.gz" } ] }