Showing with 5,182 additions and 3,724 deletions.
  1. +43 −9 .circleci/config.yml
  2. +2 −0 .isort.cfg
  3. +5 −0 .pep8speaks.yml
  4. +21 −6 .pre-commit-config.yaml
  5. +14 −8 Makefile
  6. +3 −3 README.md
  7. +87 −70 azure-pipelines.yml
  8. +6 −6 ci/.env
  9. +10 −6 ci/Dockerfile.dev
  10. +9 −5 ci/Dockerfile.docs
  11. +3 −5 ci/asvconfig.py
  12. +1 −1 ci/build.sh
  13. +23 −15 ci/datamgr.py
  14. +16 −17 ci/docker-compose.yml
  15. +1 −1 ci/docs.sh
  16. +4 −5 ci/feedstock.py
  17. +2 −6 ci/impalamgr.py
  18. +1 −1 ci/load-data.sh
  19. +1 −0 ci/{mapd.conf → omnisci.conf}
  20. +51 −0 ci/requirements-3.5-dev.yml
  21. +47 −0 ci/requirements-3.6-dev.yml
  22. +47 −0 ci/requirements-3.7-dev.yml
  23. +0 −39 ci/requirements-dev.yml
  24. +1 −1 ci/requirements-docs.yml
  25. 0 ci/schema/{mapd.sql → omnisci.sql}
  26. +58 −0 ci/schema/postgresql.sql
  27. +1 −1 ci/test.sh
  28. +1 −12 conftest.py
  29. +63 −20 dev/merge-pr.py
  30. +9 −10 docs/source/conf.py
  31. +2 −2 docs/source/configuration.rst
  32. +27 −18 docs/source/contributing.rst
  33. +21 −22 docs/source/design.rst
  34. +0 −145 docs/source/developer.rst
  35. +56 −44 docs/source/getting-started.rst
  36. +95 −120 docs/source/impala.rst
  37. +0 −1 docs/source/index.rst
  38. +2 −2 docs/source/notebooks/tutorial/1-Intro-and-Setup.ipynb
  39. +3 −4 docs/source/notebooks/tutorial/2-Basics-Aggregate-Filter-Limit.ipynb
  40. +2 −2 docs/source/notebooks/tutorial/3-Projection-Join-Sort.ipynb
  41. +2 −2 docs/source/notebooks/tutorial/4-More-Value-Expressions.ipynb
  42. +2 −2 docs/source/notebooks/tutorial/5-IO-Create-Insert-External-Data.ipynb
  43. +2 −2 docs/source/notebooks/tutorial/6-Advanced-Topics-TopK-SelfJoins.ipynb
  44. +2 −2 docs/source/notebooks/tutorial/7-Advanced-Topics-ComplexFiltering.ipynb
  45. +2 −2 docs/source/notebooks/tutorial/8-More-Analytics-Helpers.ipynb
  46. +40 −0 docs/source/release.rst
  47. +2 −8 docs/source/sql.rst
  48. +16 −50 docs/source/udf.rst
  49. +7 −11 ibis/__init__.py
  50. +158 −127 ibis/_version.py
  51. +2 −3 ibis/bigquery/api.py
  52. +7 −12 ibis/bigquery/client.py
  53. +44 −42 ibis/bigquery/compiler.py
  54. +0 −1 ibis/bigquery/tests/conftest.py
  55. +6 −12 ibis/bigquery/tests/test_client.py
  56. +29 −8 ibis/bigquery/tests/test_compiler.py
  57. +5 −5 ibis/bigquery/tests/test_datatypes.py
  58. +3 −7 ibis/bigquery/udf/api.py
  59. +1 −4 ibis/bigquery/udf/core.py
  60. +3 −1 ibis/bigquery/udf/tests/test_core.py
  61. +5 −0 ibis/bigquery/udf/tests/test_find.py
  62. +6 −9 ibis/bigquery/udf/tests/test_udf_execute.py
  63. +1 −3 ibis/clickhouse/api.py
  64. +7 −11 ibis/clickhouse/client.py
  65. +2 −2 ibis/clickhouse/compiler.py
  66. +3 −4 ibis/clickhouse/operations.py
  67. +2 −1 ibis/clickhouse/tests/conftest.py
  68. +4 −2 ibis/clickhouse/tests/test_aggregations.py
  69. +3 −4 ibis/clickhouse/tests/test_client.py
  70. +7 −19 ibis/clickhouse/tests/test_functions.py
  71. +1 −1 ibis/clickhouse/tests/test_identifiers.py
  72. +0 −1 ibis/clickhouse/tests/test_literals.py
  73. +3 −3 ibis/clickhouse/tests/test_operators.py
  74. +2 −8 ibis/clickhouse/tests/test_select.py
  75. +0 −1 ibis/clickhouse/tests/test_types.py
  76. +4 −5 ibis/client.py
  77. +2 −4 ibis/config.py
  78. +72 −75 ibis/expr/analysis.py
  79. +1 −2 ibis/expr/analytics.py
  80. +95 −112 ibis/expr/api.py
  81. +4 −8 ibis/expr/datatypes.py
  82. +2 −3 ibis/expr/format.py
  83. +2 −2 ibis/expr/groupby.py
  84. +14 −9 ibis/expr/lineage.py
  85. +9 −10 ibis/expr/operations.py
  86. +8 −8 ibis/expr/rules.py
  87. +1 −1 ibis/expr/schema.py
  88. +3 −3 ibis/expr/signature.py
  89. +3 −1 ibis/expr/tests/conftest.py
  90. +62 −12 ibis/expr/tests/mocks.py
  91. +5 −10 ibis/expr/tests/test_analysis.py
  92. +0 −1 ibis/expr/tests/test_analytics.py
  93. +1 −0 ibis/expr/tests/test_array.py
  94. +2 −3 ibis/expr/tests/test_case.py
  95. +7 −6 ibis/expr/tests/test_datatypes.py
  96. +1 −1 ibis/expr/tests/test_decimal.py
  97. +0 −1 ibis/expr/tests/test_format.py
  98. +2 −1 ibis/expr/tests/test_geospatial.py
  99. +1 −1 ibis/expr/tests/test_interactive.py
  100. +6 −7 ibis/expr/tests/test_lineage.py
  101. +3 −4 ibis/expr/tests/test_operations.py
  102. +1 −0 ibis/expr/tests/test_pipe.py
  103. +5 −6 ibis/expr/tests/test_rules.py
  104. +4 −2 ibis/expr/tests/test_signature.py
  105. +0 −1 ibis/expr/tests/test_sql_builtins.py
  106. +2 −3 ibis/expr/tests/test_string.py
  107. +16 −6 ibis/expr/tests/test_table.py
  108. +14 −17 ibis/expr/tests/test_temporal.py
  109. +4 −4 ibis/expr/tests/test_timestamp.py
  110. +121 −24 ibis/expr/tests/test_value_exprs.py
  111. +8 −6 ibis/expr/tests/test_visualize.py
  112. +34 −1 ibis/expr/tests/test_window_functions.py
  113. +7 −15 ibis/expr/types.py
  114. +1 −1 ibis/expr/visualize.py
  115. +139 −67 ibis/expr/window.py
  116. +13 −5 ibis/file/client.py
  117. +4 −6 ibis/file/csv.py
  118. +3 −2 ibis/file/hdf5.py
  119. +4 −7 ibis/file/parquet.py
  120. +2 −2 ibis/file/tests/conftest.py
  121. +5 −8 ibis/file/tests/test_csv.py
  122. +8 −14 ibis/file/tests/test_hdf5.py
  123. +10 −18 ibis/file/tests/test_parquet.py
  124. +4 −2 ibis/file/tests/test_schema.py
  125. +2 −3 ibis/filesystems.py
  126. +8 −6 ibis/impala/api.py
  127. +11 −13 ibis/impala/client.py
  128. +1 −1 ibis/impala/compat.py
  129. +53 −30 ibis/impala/compiler.py
  130. +6 −7 ibis/impala/ddl.py
  131. +15 −44 ibis/impala/kudu_support.py
  132. +1 −0 ibis/impala/metadata.py
  133. +1 −2 ibis/impala/pandas_interop.py
  134. +1 −2 ibis/impala/tests/conftest.py
  135. +5 −5 ibis/impala/tests/test_client.py
  136. +1 −0 ibis/impala/tests/test_connection_pool.py
  137. +1 −2 ibis/impala/tests/test_ddl.py
  138. +3 −3 ibis/impala/tests/test_ddl_compilation.py
  139. +19 −15 ibis/impala/tests/test_exprs.py
  140. +12 −9 ibis/impala/tests/test_kudu_support.py
  141. +4 −2 ibis/impala/tests/test_metadata.py
  142. +18 −21 ibis/impala/tests/test_pandas_interop.py
  143. +2 −1 ibis/impala/tests/test_parquet_ddl.py
  144. +3 −5 ibis/impala/tests/test_partition.py
  145. +1 −2 ibis/impala/tests/test_patched.py
  146. +3 −3 ibis/impala/tests/test_sql.py
  147. +6 −11 ibis/impala/tests/test_udf.py
  148. +1 −2 ibis/impala/tests/test_window.py
  149. +3 −4 ibis/impala/udf.py
  150. +2 −2 ibis/mapd/README.rst
  151. +7 −5 ibis/mapd/api.py
  152. +43 −22 ibis/mapd/client.py
  153. +7 −7 ibis/mapd/compiler.py
  154. +3 −7 ibis/mapd/ddl.py
  155. +149 −24 ibis/mapd/operations.py
  156. +29 −13 ibis/mapd/tests/conftest.py
  157. +53 −4 ibis/mapd/tests/test_client.py
  158. +6 −6 ibis/mapd/tests/test_operations.py
  159. +65 −29 ibis/pandas/aggcontext.py
  160. +1 −2 ibis/pandas/api.py
  161. +48 −31 ibis/pandas/client.py
  162. +213 −277 ibis/pandas/core.py
  163. +52 −3 ibis/pandas/dispatch.py
  164. +1 −0 ibis/pandas/execution/__init__.py
  165. +0 −2 ibis/pandas/execution/arrays.py
  166. +2 −1 ibis/pandas/execution/constants.py
  167. +71 −17 ibis/pandas/execution/generic.py
  168. +2 −3 ibis/pandas/execution/join.py
  169. +14 −16 ibis/pandas/execution/maps.py
  170. +10 −9 ibis/pandas/execution/selection.py
  171. +10 −11 ibis/pandas/execution/strings.py
  172. +31 −0 ibis/pandas/execution/structs.py
  173. +81 −9 ibis/pandas/execution/temporal.py
  174. +2 −4 ibis/pandas/execution/tests/conftest.py
  175. +0 −2 ibis/pandas/execution/tests/test_arrays.py
  176. +3 −5 ibis/pandas/execution/tests/test_cast.py
  177. +144 −5 ibis/pandas/execution/tests/test_functions.py
  178. +79 −4 ibis/pandas/execution/tests/test_join.py
  179. +2 −2 ibis/pandas/execution/tests/test_maps.py
  180. +1 −4 ibis/pandas/execution/tests/test_operations.py
  181. +1 −2 ibis/pandas/execution/tests/test_strings.py
  182. +83 −0 ibis/pandas/execution/tests/test_structs.py
  183. +4 −10 ibis/pandas/execution/tests/test_temporal.py
  184. +6 −9 ibis/pandas/execution/tests/test_window.py
  185. +0 −2 ibis/pandas/execution/util.py
  186. +75 −39 ibis/pandas/execution/window.py
  187. +2 −6 ibis/pandas/tests/test_client.py
  188. +61 −5 ibis/pandas/tests/test_core.py
  189. +5 −8 ibis/pandas/tests/test_datatypes.py
  190. +17 −18 ibis/pandas/tests/test_schema.py
  191. +29 −17 ibis/pandas/tests/test_udf.py
  192. +74 −47 ibis/pandas/udf.py
  193. +80 −95 ibis/sql/alchemy.py
  194. +20 −20 ibis/sql/compiler.py
  195. +1 −2 ibis/sql/mysql/api.py
  196. +5 −5 ibis/sql/mysql/client.py
  197. +27 −4 ibis/sql/mysql/compiler.py
  198. +1 −2 ibis/sql/postgres/api.py
  199. +2 −2 ibis/sql/postgres/client.py
  200. +47 −35 ibis/sql/postgres/compiler.py
  201. +6 −0 ibis/sql/postgres/tests/conftest.py
  202. +68 −3 ibis/sql/postgres/tests/test_client.py
  203. +279 −218 ibis/sql/postgres/tests/test_functions.py
  204. +1 −1 ibis/sql/sqlite/api.py
  205. +4 −5 ibis/sql/sqlite/client.py
  206. +3 −7 ibis/sql/sqlite/compiler.py
  207. +1 −1 ibis/sql/sqlite/tests/conftest.py
  208. +2 −5 ibis/sql/sqlite/tests/test_client.py
  209. +8 −31 ibis/sql/sqlite/tests/test_functions.py
  210. +2 −4 ibis/sql/tests/test_compiler.py
  211. +27 −31 ibis/sql/tests/test_sqlalchemy.py
  212. +2 −2 ibis/sql/transforms.py
  213. +116 −26 ibis/tests/all/conftest.py
  214. +63 −31 ibis/tests/all/test_aggregation.py
  215. +8 −30 ibis/tests/all/test_array.py
  216. +3 −5 ibis/tests/all/test_client.py
  217. +1 −3 ibis/tests/all/test_column.py
  218. +27 −44 ibis/tests/all/test_generic.py
  219. +9 −9 ibis/tests/all/test_geospatial.py
  220. +1 −3 ibis/tests/all/test_join.py
  221. +9 −12 ibis/tests/all/test_numeric.py
  222. +6 −7 ibis/tests/all/test_param.py
  223. +1 −2 ibis/tests/all/test_string.py
  224. +101 −56 ibis/tests/all/test_temporal.py
  225. +89 −70 ibis/tests/all/test_window.py
  226. +12 −13 ibis/tests/backends.py
  227. +5 −7 ibis/tests/test_filesystems.py
  228. +6 −9 ibis/tests/test_version.py
  229. +6 −66 ibis/tests/util.py
  230. +70 −56 ibis/util.py
  231. +2 −0 pyproject.toml
  232. +39 −2 setup.cfg
  233. +30 −8 setup.py
  234. +487 −426 versioneer.py
52 changes: 43 additions & 9 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,13 @@ test: &test
steps:
- checkout:
path: ~/ibis
- run:
name: Fetch tags
command: git -C ~/ibis fetch --tags
- run:
name: Show tags
command: |
git -C ~/ibis tag | cat
- run:
name: Setup Google Credentials for BigQuery
command: |
Expand All @@ -22,7 +29,7 @@ test: &test
fi
- run:
name: Start Databases
command: docker-compose up -d --no-build mysql postgres impala clickhouse mapd kudu-tserver kudu-master
command: docker-compose up -d --no-build mysql postgres impala clickhouse omnisci kudu-tserver kudu-master
- run:
name: Show Running Containers
command: docker ps
Expand Down Expand Up @@ -55,7 +62,7 @@ test: &test
- run:
name: Execute Pytest
command: |
docker-compose run -e PYTHONHASHSEED=$PYTHONHASHSEED ibis \
docker-compose run -e PYTHONHASHSEED=$PYTHONHASHSEED -e CIRCLECI=$CIRCLECI ibis \
pytest ibis -m "not udf" \
-ra \
--numprocesses auto \
Expand All @@ -76,12 +83,18 @@ test: &test
bash <(curl -s https://codecov.io/bash) \
-f /tmp/ibis/test-reports/pytest-cov/coverage.xml
build: &build
<<: *base
steps:
- checkout:
path: ~/ibis
- run:
name: Fetch tags
command: git -C ~/ibis fetch --tags
- run:
name: Show tags
command: |
git -C ~/ibis tag | cat
- run:
name: Build Ibis Image
command: docker-compose build ibis
Expand All @@ -105,6 +118,13 @@ benchmark: &benchmark
steps:
- checkout:
path: ~/ibis
- run:
name: Fetch tags
command: git -C ~/ibis fetch --tags
- run:
name: Show tags
command: |
git -C ~/ibis tag | cat
- run:
name: Build Ibis Image
command: docker-compose build ibis
Expand All @@ -119,12 +139,19 @@ docs: &docs
steps:
- checkout:
path: ~/ibis
- run:
name: Fetch tags
command: git -C ~/ibis fetch --tags
- run:
name: Show tags
command: |
git -C ~/ibis tag | cat
- add_ssh_keys:
fingerprints:
- "8d:b0:36:4d:f6:75:f2:5f:00:01:a1:53:63:52:f0:e2"
- run:
name: Start Databases
command: docker-compose up -d --no-build mysql postgres impala clickhouse mapd kudu-master kudu-tserver
command: docker-compose up -d --no-build mysql postgres impala clickhouse omnisci kudu-master kudu-tserver
- run:
name: Show Running Containers
command: docker ps
Expand All @@ -145,7 +172,7 @@ docs: &docs
command: docker-compose run ibis-docs ci/load-data.sh
- run:
name: Ping the Notebook Impala Hostname
command: docker-compose run ibis-docs ping -c 1 quickstart.cloudera
command: docker-compose run ibis-docs ping -c 1 impala
- run:
name: Clone Documentation Repository
command: docker-compose run ibis-docs git clone --branch gh-pages https://github.com/ibis-project/docs.ibis-project.org /tmp/docs.ibis-project.org
Expand Down Expand Up @@ -181,16 +208,22 @@ docs: &docs
path: /tmp/ibis/docs.ibis-project.org

jobs:
python35_test:
<<: *test
environment:
- PYTHONHASHSEED: 0
- PYTHON_VERSION: 3.5

python36_test:
<<: *test
environment:
- PYTHONHASHSEED: ""
- PYTHONHASHSEED: "random"
- PYTHON_VERSION: 3.6

python37_test:
<<: *test
environment:
- PYTHONHASHSEED: ""
- PYTHONHASHSEED: "random"
- PYTHON_VERSION: 3.7

python36_conda_build:
Expand Down Expand Up @@ -218,9 +251,10 @@ workflows:
version: 2
test:
jobs:
- python35_test
- python36_test
- python37_test
- python36_docs
- python36_benchmark
#- python36_conda_build
#- python37_conda_build
- python36_conda_build
- python37_conda_build
2 changes: 2 additions & 0 deletions .isort.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
[settings]
known_third_party = asv,click,clickhouse_driver,dateutil,google,graphviz,impala,jinja2,kudu,multipledispatch,numpy,pandas,pkg_resources,plumbum,psycopg2,pyarrow,pydata_google_auth,pymapd,pymysql,pytest,pytz,regex,requests,ruamel,setuptools,sphinx_rtd_theme,sqlalchemy,toolz
5 changes: 5 additions & 0 deletions .pep8speaks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
# File : .pep8speaks.yml

scanner:
diff_only: True # If True, errors caused by only the patch are shown
linter: flake8
27 changes: 21 additions & 6 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -1,13 +1,28 @@
repos:
- repo: https://github.com/asottile/seed-isort-config
rev: v1.7.0
hooks:
- id: seed-isort-config
- repo: https://github.com/pre-commit/mirrors-isort
rev: v4.3.17
hooks:
- id: isort
- repo: https://github.com/ambv/black
# we need to use this commit or later, to pickup the fix that splits
# trailing comma syntax into call vs def, both of which weren't implemented
# until python 3.6 (3.5 has just the call syntax) and we need to support
# 3.5 for a few months.
rev: cea13f498418784e22f8fbd78db3f9240a2bad11
hooks:
- id: black
# a side effect of black running exclude filters and then include
# filters (the built-in black behavior) is that a command line such as
# black --exclude foo.py foo.py will still format foo.py. We avoid this
# in pre-commit by not passing staged files.
pass_filenames: false
- repo: git://github.com/pre-commit/pre-commit-hooks
rev: v2.1.0
hooks:
- id: flake8
types:
- python
args: ['--config=setup.cfg']

- repo: https://github.com/ambv/black
rev: stable
hooks:
- id: black
22 changes: 14 additions & 8 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,13 @@

SHELL := /bin/bash
MAKEFILE_DIR = $(patsubst %/,%,$(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
PYTHON_VERSION := 3.6
PYTHONHASHSEED := "random"
COMPOSE_FILE := "$(MAKEFILE_DIR)/ci/docker-compose.yml"
DOCKER := docker-compose -f $(COMPOSE_FILE)
DOCKER_RUN := $(DOCKER) run --rm
DOCKER_RUN := PYTHON_VERSION=${PYTHON_VERSION} $(DOCKER) run --rm
PYTEST_OPTIONS :=
SERVICES := mapd postgres mysql clickhouse impala kudu-master kudu-tserver
SERVICES := omnisci postgres mysql clickhouse impala kudu-master kudu-tserver

clean:
python setup.py clean
Expand All @@ -33,7 +35,7 @@ build:

start:
# start all docker compose services
$(DOCKER) up -d --no-build ${SERVICES}
$(DOCKER) up --remove-orphans -d --no-build ${SERVICES}
# wait for services to start
$(DOCKER_RUN) waiter

Expand All @@ -48,21 +50,25 @@ init: restart
$(MAKE) load

testparallel:
$(MAKEFILE_DIR)/ci/test.sh -n auto -m 'not udf' \
PYTHONHASHSEED=${PYTHONHASHSEED} $(MAKEFILE_DIR)/ci/test.sh -n auto -m 'not udf' -k 'not test_import_time' \
--doctest-modules --doctest-ignore-import-errors ${PYTEST_OPTIONS}

test:
$(MAKEFILE_DIR)/ci/test.sh ${PYTEST_OPTIONS} \
PYTHONHASHSEED=${PYTHONHASHSEED} $(MAKEFILE_DIR)/ci/test.sh ${PYTEST_OPTIONS} -k 'not test_import_time' \
--doctest-modules --doctest-ignore-import-errors

testmost:
$(MAKEFILE_DIR)/ci/test.sh -n auto -m 'not (udf or impala or hdfs)' \
PYTHONHASHSEED=${PYTHONHASHSEED} $(MAKEFILE_DIR)/ci/test.sh -n auto -m 'not (udf or impala or hdfs)' -k 'not test_import_time' \
--doctest-modules --doctest-ignore-import-errors ${PYTEST_OPTIONS}

testfast:
$(MAKEFILE_DIR)/ci/test.sh -n auto -m 'not (udf or impala or hdfs or bigquery)' \
PYTHONHASHSEED=${PYTHONHASHSEED} $(MAKEFILE_DIR)/ci/test.sh -n auto -m 'not (udf or impala or hdfs or bigquery)' -k 'not test_import_time' \
--doctest-modules --doctest-ignore-import-errors ${PYTEST_OPTIONS}

testlocal:
PYTHONHASHSEED=${PYTHONHASHSEED} pytest -n auto -m 'not (udf or impala or hdfs or bigquery or mysql or mapd or postgresql or clickhouse)' -k 'not test_import_time' \
${PYTEST_OPTIONS}

docclean:
$(DOCKER_RUN) ibis-docs rm -rf /tmp/docs.ibis-project.org

Expand All @@ -71,7 +77,7 @@ builddoc:
$(DOCKER) build ibis-docs

doc: builddoc docclean
$(DOCKER_RUN) ibis-docs ping -c 1 quickstart.cloudera
$(DOCKER_RUN) ibis-docs ping -c 1 impala
$(DOCKER_RUN) ibis-docs git clone --branch gh-pages https://github.com/ibis-project/docs.ibis-project.org /tmp/docs.ibis-project.org --depth 1
$(DOCKER_RUN) ibis-docs find /tmp/docs.ibis-project.org -maxdepth 1 ! -wholename /tmp/docs.ibis-project.org \
! -name '*.git' \
Expand Down
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@
| -------------: | :---- |
| Documentation | [![Documentation Status](https://img.shields.io/badge/docs-docs.ibis--project.org-blue.svg)](http://docs.ibis-project.org) |
| Conda packages | [![Anaconda-Server Badge](https://anaconda.org/conda-forge/ibis-framework/badges/version.svg)](https://anaconda.org/conda-forge/ibis-framework) |
| PyPI | ![PyPI](https://img.shields.io/pypi/v/ibis-framework.svg) |
| PyPI | [![PyPI](https://img.shields.io/pypi/v/ibis-framework.svg)](https://pypi.org/project/ibis-framework) |
| CircleCI | [![CircleCI Status](https://circleci.com/gh/ibis-project/ibis.svg?style=shield&circle-token=b84ff8383cbb0d6788ee0f9635441cb962949a4f)](https://circleci.com/gh/ibis-project/ibis/tree/master) |
| Azure | [![Azure Status](https://dev.azure.com/ibis-project/ibis/_apis/build/status/ibis-project.ibis)](https://dev.azure.com/ibis-project/ibis/_build) |
| Coverage | ![Codecov branch](https://img.shields.io/codecov/c/github/ibis-project/ibis/master.svg) |
| Coverage | [![Codecov branch](https://img.shields.io/codecov/c/github/ibis-project/ibis/master.svg)](https://codecov.io/gh/ibis-project/ibis) |


Ibis is a toolbox to bridge the gap between local Python environments, remote
Expand Down Expand Up @@ -38,6 +38,6 @@ Ibis currently provides tools for interacting with the following systems:
- [Pandas](https://pandas.pydata.org/) [DataFrames](http://pandas.pydata.org/pandas-docs/stable/dsintro.html#dataframe) (Experimental)
- [Clickhouse](https://clickhouse.yandex)
- [BigQuery](https://cloud.google.com/bigquery)
- [MapD](https://www.mapd.com) (Experimental)
- [OmniSci](https://www.omnisci.com) (Experimental)

Learn more about using the library at http://docs.ibis-project.org.
Loading