Path: csiph.com!fu-berlin.de!uni-berlin.de!not-for-mail From: Shawn Brown <03sjbrown@gmail.com> Newsgroups: comp.lang.python.announce Subject: [ANN] Squint: Simple query interface for tabular data. Date: Sat, 11 Jan 2020 15:03:28 -0500 Lines: 83 Approved: python-announce-list@python.org Message-ID: <157878285175.21108.python-announce-list@python.org> References: Reply-To: python-list@python.org Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Trace: news.uni-berlin.de RZyr5YLEETuqoheBEijT2goGLQ9taBA3vEsJzrhaXt4A== X-Spam-Status: OK 0.000 X-Spam-Evidence: '*H*': 1.00; '*S*': 0.00; 'tutorial': 0.03; 'objects': 0.05; 'pip': 0.05; 'url-ip:140/8': 0.05; 'url- ip:151.101.0.223/32': 0.05; 'url-ip:151.101.128.223/32': 0.05; 'url-ip:151.101.192.223/32': 0.05; 'url-ip:151.101.64.223/32': 0.05; 'manipulate': 0.07; 'url:project': 0.07; 'url:pypi': 0.07; 'by,': 0.09; 'pandas': 0.09; 'subject:ANN': 0.09; 'subject:query': 0.09; 'url:tutorial': 0.09; 'feedback': 0.09; 'url:github': 0.10; 'python': 0.13; 'install': 0.14; 'subject:] ': 0.15; 'can:': 0.16; 'dictionary': 0.16; 'dropped': 0.16; 'link]': 0.16; 'memory.': 0.16; 'result.': 0.16; 'structure': 0.16; 'url- ip:104.208.221.96/32': 0.16; 'url-ip:104.208.221/24': 0.16; 'url- ip:104.208/16': 0.16; 'url:readthedocs': 0.16; 'url:stable': 0.16; 'to:addr:python-announce-list': 0.17; '8bit%:19': 0.17; 'file,': 0.20; 'uses': 0.23; 'group.': 0.24; 'url:io': 0.27; "skip:' 20": 0.27; 'using': 0.28; 'version': 0.28; 'evaluate': 0.28; 'message- id:@mail.gmail.com': 0.29; 'subject:for': 0.30; 'interface': 0.31; 'returns': 0.31; 'received:google.com': 0.31; 'subject:[': 0.32; 'from:addr:gmail.com': 0.34; 'url-ip:151.101/16': 0.35; 'url- ip:151/8': 0.35; 'header:In-Reply-To:1': 0.36; 'syntax': 0.36; '\xc2\xa0\xc2\xa0\xc2\xa0': 0.36; 'results': 0.37; 'subject:: ': 0.38; "skip:' 10": 0.39; 'selected': 0.60; 'skip:l 10': 0.61; 'completely': 0.63; 'format.': 0.65; 'selection': 0.65; 'sources.': 0.65; 'sql': 0.65; 'links:': 0.73; 'field': 0.84; 'note:': 0.84; 'eagerly': 0.84; 'elements.': 0.84; 'lists,': 0.84; 'previews': 0.84; 'query': 0.84; 'results,': 0.84 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to; bh=0o3ih8zYnnFFVqtRT8Rdy0Od+HBfzuxd/It+sQwZ/wE=; b=PPm8dgy/nd+IqV5yQ4H8AntM3WU4zv6OuPQ4+rs4ECO/pgB4tbFkSwu8OUVGVNqdRN gJ/GR3fiUVOgPYbNVt/VAcQzAsQNRXPKqpGVLqYbTxhVG+lqPNRB6T5wi37lYqbi2mbS waRAWmSEy7M8ndymgaAfWRPWwrPYyuFPFdXl4Oukg1GrKRLudG3sFYKLNKg8EzRmIqNC /TEhu73FlFeEXWWOxzs7GBiZVy2kXVL4UmUJU7X45cQO/jM/KIGPzWlSON5VryNVU6cX cHXcKdC/fyBZ2SBV5oslma+BrJs8oi2PDgLY0gMZCG0Q1hdqqeyVlZXJGUrE/DRHF/Eh JeVQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to; bh=0o3ih8zYnnFFVqtRT8Rdy0Od+HBfzuxd/It+sQwZ/wE=; b=CQcfC8naCJezveLq0nTZyQ0raweowEk0oA+i17XbrvsF0jgZX/LdmbEZ+99zkwYe7c dvxW/aXayfKlz1TuZWgUxlI6wTwLJgwaMv69t4UO6czHuaQwwbvwDCJgRo5CywEpt9Fm EiON95hZbyOIjTdPdzE4x3PAGI9MGqKoHyGQTZHH8QJf2fBvo0SvEsijOnfniXn6BsL3 EZRnSRbu/wBtv9Elyw2sfP/xSrUhawrH5D9FSCTIglS/njj/8v2bhSIXn4n8kXkdukJL T4a5BhorG9p9oHNtLw+FfKV2lwGpvvQt0prgMi7kzjlK/7pEpvtgi4QdzjQQKFqhDie0 ehuw== X-Gm-Message-State: APjAAAXXmwsRi7lcQIPzFBDNdIowVqvaDcuZuq8ljwxIPmCjyHVPnANU YyFv7LeJJWX8/sE81bdWdBtFmlFMcQjAkOJCL/xl7Q== X-Google-Smtp-Source: APXvYqwFUTFELfmGgq0prWMdALSY+tuuxfFyKBEbNKadoaLFYy4qsxe/jq9X+P7qEaXWjZHlR3zNISqNhqa1P6tSpeU= X-Received: by 2002:a17:906:b841:: with SMTP id ga1mr9564195ejb.184.1578773242387; Sat, 11 Jan 2020 12:07:22 -0800 (PST) In-Reply-To: X-MailFrom: 03sjbrown@gmail.com X-Mailman-Rule-Hits: emergency X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved Message-ID-Hash: KWHN7MMULIMZ37DNSRZ2ONM5LHJM3B32 X-Message-ID-Hash: KWHN7MMULIMZ37DNSRZ2ONM5LHJM3B32 X-Mailman-Approved-At: Sat, 11 Jan 2020 17:47:25 -0500 X-Content-Filtered-By: Mailman/MimeDel 3.3.1 X-Mailman-Version: 3.3.1 Precedence: list List-Id: Announcement-only list for the Python programming language Archived-At: List-Archive: List-Help: List-Post: List-Subscribe: List-Unsubscribe: Xref: csiph.com comp.lang.python.announce:3299 [RESEND WITH CORRECTED LINK] Squint version 0.1.0 has been released: * New query previews provide convenient feedback at the interactive prompt. * Completely rewritten tutorial https://squint.readthedocs.io/en/stable/tutorial/ * Added support for Python 3.9 and dropped support for 3.3, 3.2, and 2.6. What is Squint: Squint is a simple query interface for tabular data. A core feature of Squint is that the structure of a query's selection determines the structure of its result. Squint is available from the PyPI: pip install squint With Squint You Can: * Select data using Python literals=E2=80=94sets, lists, dictionaries, etc.= =E2=80=94and fetch results in the same format. * Aggregate, map, filter, reduce, and otherwise manipulate data. * Lazily iterate over results, write them to a file, or eagerly evaluate them in memory. * Analyze data from CSV, Excel, SQL, and other data sources. Links: * Docs: https://squint.readthedocs.io/ * PyPI: https://pypi.org/project/squint/ * Source: https://github.com/shawnbrown/squint Syntax Comparison: # SQL SELECT A, SUM(B) FROM mydata WHERE C=3D'xyz' GROUP BY A; # Pandas df[['A', 'B']][df['C'] =3D=3D 'xyz'].groupby('A').sum() # Squint select({'A': 'B'}, C=3D'xyz').sum() Note: Squint uses `dict` objects to select groups of values=E2=80=94the *ke= y* determines the field to group by, and the *value* determines the contents of each group. Fetching the results of such a query returns a dictionary of selected elements.