├── .gitattributes ├── .github ├── stale.yml └── workflows │ ├── azure-pipelines.yml │ ├── codeql-analysis.yml │ └── publish_package.yml ├── .gitignore ├── LICENSE.txt ├── MANIFEST.in ├── README.rst ├── ci ├── code_checks.sh ├── run_tests.sh ├── setup_env.sh └── test-requirements.txt ├── dataframe_sql ├── __init__.py ├── _version.py ├── data │ ├── DigiDB_digimonlist.csv │ ├── DigiDB_movelist.csv │ ├── DigiDB_supportlist.csv │ ├── avocado.csv │ └── forestfires.csv ├── sql_select_query.py └── tests │ ├── __init__.py │ ├── markers.py │ ├── pandas_sql_functionality_test.py │ ├── performance_tests.py │ └── utils.py ├── environment.yml ├── requirements.txt ├── scripts └── validate_docstrings.py ├── setup.cfg ├── setup.py └── versioneer.py /.gitattributes: -------------------------------------------------------------------------------- 1 | dataframe_sql/_version.py export-subst 2 | -------------------------------------------------------------------------------- /.github/stale.yml: -------------------------------------------------------------------------------- 1 | # Number of days of inactivity before an issue becomes stale 2 | daysUntilStale: 60 3 | # Number of days of inactivity before a stale issue is closed 4 | daysUntilClose: 7 5 | # Issues with these labels will never be considered stale 6 | exemptLabels: 7 | - pinned 8 | - security 9 | # Label to use when marking an issue as stale 10 | staleLabel: stale 11 | # Comment to post when marking an issue as stale. Set to `false` to disable 12 | markComment: > 13 | This issue has been automatically marked as stale because it has not had 14 | recent activity. It will be closed in 7 days if no further activity occurs. 15 | # Comment to post when closing a stale issue. Set to `false` to disable 16 | closeComment: false -------------------------------------------------------------------------------- /.github/workflows/azure-pipelines.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: master 6 | pull_request: 7 | branches: master 8 | 9 | env: 10 | ENV_FILE: environment.yml 11 | 12 | jobs: 13 | checks: 14 | name: Checks 15 | runs-on: ubuntu-latest 16 | strategy: 17 | fail-fast: false 18 | matrix: 19 | python-version: ["3.7", "3.8"] 20 | steps: 21 | 22 | - name: Checkout 23 | uses: actions/checkout@v1 24 | 25 | - name: Cache conda 26 | uses: actions/cache@v1 27 | env: 28 | # Increase this value to reset cache if environment.yml has not changed 29 | CACHE_NUMBER: 0 30 | with: 31 | path: ~/conda_pkgs_dir 32 | key: ${{ runner.os }}-conda-${{ matrix.python }}-${{ env.CACHE_NUMBER }}-${{ hashFiles('environment.yml') }} 33 | 34 | - uses: conda-incubator/setup-miniconda@v2 35 | with: 36 | auto-update-conda: true 37 | activate-environment: dataframe_sql 38 | python-version: ${{ matrix.python-version }} 39 | channel-priority: strict 40 | environment-file: environment.yml 41 | use-only-tar-bz2: true # IMPORTANT: This needs to be set for caching to work properly! 42 | 43 | - name: Looking for unwanted patterns 44 | shell: bash -l {0} 45 | run: | 46 | chmod +x ci/code_checks.sh 47 | ci/code_checks.sh patterns 48 | if: always() 49 | 50 | - name: Linting 51 | shell: bash -l {0} 52 | run: | 53 | ci/code_checks.sh lint 54 | if: always() 55 | 56 | - name: Dependencies consistency 57 | shell: bash -l {0} 58 | run: | 59 | ci/code_checks.sh dependencies 60 | if: always() 61 | 62 | - name: Checks on imported code 63 | shell: bash -l {0} 64 | run: | 65 | ci/code_checks.sh code 66 | if: always() 67 | 68 | - name: Running doctests 69 | shell: bash -l {0} 70 | run: | 71 | ci/code_checks.sh doctests 72 | if: always() 73 | 74 | - name: Docstring validation 75 | shell: bash -l {0} 76 | run: | 77 | ci/code_checks.sh docstrings 78 | if: always() 79 | 80 | - name: Typing validation 81 | shell: bash -l {0} 82 | run: | 83 | ci/code_checks.sh typing 84 | if: always() 85 | 86 | - name: Unit tests 87 | shell: bash -l {0} 88 | run: | 89 | chmod +x ci/run_tests.sh 90 | ci/run_tests.sh 91 | if: always() -------------------------------------------------------------------------------- /.github/workflows/codeql-analysis.yml: -------------------------------------------------------------------------------- 1 | # For most projects, this workflow file will not need changing; you simply need 2 | # to commit it to your repository. 3 | # 4 | # You may wish to alter this file to override the set of languages analyzed, 5 | # or to provide custom queries or build logic. 6 | # 7 | # ******** NOTE ******** 8 | # We have attempted to detect the languages in your repository. Please check 9 | # the `language` matrix defined below to confirm you have the correct set of 10 | # supported CodeQL languages. 11 | # 12 | name: "CodeQL" 13 | 14 | on: 15 | push: 16 | branches: [ master ] 17 | pull_request: 18 | # The branches below must be a subset of the branches above 19 | branches: [ master ] 20 | schedule: 21 | - cron: '37 20 * * 4' 22 | 23 | jobs: 24 | analyze: 25 | name: Analyze 26 | runs-on: ubuntu-latest 27 | 28 | strategy: 29 | fail-fast: false 30 | matrix: 31 | language: [ 'python' ] 32 | # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] 33 | # Learn more: 34 | # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed 35 | 36 | steps: 37 | - name: Checkout repository 38 | uses: actions/checkout@v2 39 | 40 | # Initializes the CodeQL tools for scanning. 41 | - name: Initialize CodeQL 42 | uses: github/codeql-action/init@v1 43 | with: 44 | languages: ${{ matrix.language }} 45 | # If you wish to specify custom queries, you can do so here or in a config file. 46 | # By default, queries listed here will override any specified in a config file. 47 | # Prefix the list here with "+" to use these queries and those in the config file. 48 | # queries: ./path/to/local/query, your-org/your-repo/queries@main 49 | 50 | # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). 51 | # If this step fails, then you should remove it and run the build manually (see below) 52 | - name: Autobuild 53 | uses: github/codeql-action/autobuild@v1 54 | 55 | # ℹ️ Command-line programs to run using the OS shell. 56 | # 📚 https://git.io/JvXDl 57 | 58 | # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines 59 | # and modify them (or add more) to build your code if your project 60 | # uses a compiled language 61 | 62 | #- run: | 63 | # make bootstrap 64 | # make release 65 | 66 | - name: Perform CodeQL Analysis 67 | uses: github/codeql-action/analyze@v1 68 | -------------------------------------------------------------------------------- /.github/workflows/publish_package.yml: -------------------------------------------------------------------------------- 1 | # This workflow will upload a Python Package using Twine when a release is created 2 | # For more information see: https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#publishing-to-package-registries 3 | 4 | name: Upload Python Package 5 | 6 | on: 7 | release: 8 | types: [created] 9 | 10 | jobs: 11 | deploy: 12 | 13 | runs-on: ubuntu-latest 14 | 15 | steps: 16 | - uses: actions/checkout@v2 17 | - name: Set up Python 18 | uses: actions/setup-python@v2 19 | with: 20 | python-version: '3.x' 21 | - name: Install dependencies 22 | run: | 23 | python -m pip install --upgrade pip 24 | pip install setuptools wheel twine 25 | - name: Build and publish 26 | env: 27 | TWINE_USERNAME: ${{ secrets.PYPI_USERNAME }} 28 | TWINE_PASSWORD: ${{ secrets.PYPI_PASSWORD }} 29 | run: | 30 | python setup.py sdist 31 | twine upload dist/* -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.names 2 | .pytest_cache 3 | .mypy_cache 4 | *__pycache__* 5 | *.DS_Store* 6 | *.idea 7 | *.c 8 | build/* 9 | *.so 10 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | BSD 3-Clause License 2 | 3 | Copyright (c) 2011-2020, Open source contributors. 4 | 5 | Redistribution and use in source and binary forms, with or without 6 | modification, are permitted provided that the following conditions are met: 7 | 8 | * Redistributions of source code must retain the above copyright notice, this 9 | list of conditions and the following disclaimer. 10 | 11 | * Redistributions in binary form must reproduce the above copyright notice, 12 | this list of conditions and the following disclaimer in the documentation 13 | and/or other materials provided with the distribution. 14 | 15 | * Neither the name of the copyright holder nor the names of its 16 | contributors may be used to endorse or promote products derived from 17 | this software without specific prior written permission. 18 | 19 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 20 | AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 22 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 23 | FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 | DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 25 | SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 26 | CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 27 | OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include versioneer.py 2 | include dataframe_sql/_version.py 3 | include dataframe_sql/grammar/sql.grammar -------------------------------------------------------------------------------- /README.rst: -------------------------------------------------------------------------------- 1 | dataframe_sql 2 | ============= 3 | 4 | .. image:: https://github.com/zbrookle/dataframe_sql/workflows/CI/badge.svg?branch=master 5 | :target: https://github.com/zbrookle/dataframe_sql/actions?query=workflow 6 | 7 | .. image:: https://pepy.tech/badge/dataframe-sql 8 | :target: https://pepy.tech/project/dataframe-sql 9 | 10 | .. image:: https://img.shields.io/pypi/l/dataframe_sql.svg 11 | :target: https://github.com/zbrookle/dataframe_sql/blob/master/LICENSE.txt 12 | 13 | .. image:: https://img.shields.io/pypi/status/dataframe_sql.svg 14 | :target: https://pypi.python.org/pypi/dataframe_sql/ 15 | 16 | .. image:: https://img.shields.io/pypi/v/dataframe_sql.svg 17 | :target: https://pypi.python.org/pypi/dataframe_sql/ 18 | 19 | .. image:: https://img.shields.io/badge/code%20style-black-000000.svg 20 | :target: https://github.com/psf/black 21 | 22 | ``dataframe_sql`` is a Python_ package that translates SQL syntax into operations on 23 | pandas_ DataFrames, a functionality which is not available in the central pandas 24 | package. 25 | 26 | .. _Python: https://www.python.org/ 27 | 28 | Installation 29 | ------------ 30 | 31 | .. code-block:: bash 32 | 33 | pip install dataframe_sql 34 | 35 | 36 | Usage 37 | ----- 38 | 39 | In this simple example, a DataFrame is read in from a csv and then using the query 40 | function you can produce a new DataFrame from the sql query. 41 | 42 | .. code-block:: python 43 | 44 | from pandas import read_csv 45 | from dataframe_sql import register_temp_table, query 46 | 47 | my_table = read_csv("some_file.csv") 48 | 49 | register_temp_table(my_table, "my_table") 50 | 51 | query("""select * from my_table""") 52 | 53 | 54 | The package currently only supports pandas_ but there are plans to support dask_, 55 | rapids_, and modin_ in the future. 56 | 57 | .. _pandas: https://github.com/pandas-dev/pandas 58 | .. _dask: https://github.com/dask/dask 59 | .. _rapids: https://github.com/rapidsai/cudf 60 | .. _modin: https://github.com/modin-project/modin 61 | 62 | SQL Syntax 63 | ---------- 64 | The SQL syntax for ``dataframe_sql`` is exactly the same as the syntax in 65 | ``sql_to_ibis``, its underlying package. 66 | 67 | You can find the full SQL syntax 68 | `here `__ 69 | 70 | Why use dataframe_sql? 71 | ---------------------- 72 | 73 | While there are other packages that accomplish the goal of using SQL with pandas 74 | DataFrames, all other packages such as pandasql_ actually use a database on the 75 | backend which defeats the purpose of using pandas_ to begin with. In the case of 76 | pandasql_ which uses SQLite, this can result in major performance bottlenecks. 77 | ``dataframe_sql`` actually performs native pandas operations in memory on DataFrames, 78 | which avoids conflicts that may arise from using external databases. 79 | 80 | .. _pandasql: https://github.com/yhat/pandasql 81 | 82 | -------------------------------------------------------------------------------- /ci/code_checks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # 3 | # Run checks related to code quality. 4 | # 5 | # This script is intended for both the CI and to check locally that code standards are 6 | # respected. We are currently linting (PEP-8 and similar), looking for patterns of 7 | # common mistakes (sphinx directives with missing blank lines, old style classes, 8 | # unwanted imports...), we run doctests here (currently some files only), and we 9 | # validate formatting error in docstrings. 10 | # 11 | # Usage: 12 | # $ ./ci/code_checks.sh # run all checks 13 | # $ ./ci/code_checks.sh lint # run linting only 14 | # $ ./ci/code_checks.sh patterns # check for patterns that should not exist 15 | # $ ./ci/code_checks.sh code # checks on imported code 16 | # $ ./ci/code_checks.sh doctests # run doctests 17 | # $ ./ci/code_checks.sh docstrings # validate docstring errors 18 | # $ ./ci/code_checks.sh dependencies # check that dependencies are consistent 19 | # $ ./ci/code_checks.sh typing # run static type analysis 20 | 21 | [[ -z "$1" || "$1" == "lint" || "$1" == "patterns" || "$1" == "code" || "$1" == "doctests" || "$1" == "docstrings" || "$1" == "dependencies" || "$1" == "typing" ]] || \ 22 | { echo "Unknown command $1. Usage: $0 [lint|patterns|code|doctests|docstrings|dependencies|typing]"; exit 9999; } 23 | 24 | RET=0 25 | CHECK=$1 26 | 27 | function invgrep { 28 | # grep with inverse exist status and formatting for azure-pipelines 29 | # 30 | # This function works exactly as grep, but with opposite exit status: 31 | # - 0 (success) when no patterns are found 32 | # - 1 (fail) when the patterns are found 33 | # 34 | # This is useful for the CI, as we want to fail if one of the patterns 35 | # that we want to avoid is found by grep. 36 | grep -n "$@" | sed "s/^/$INVGREP_PREPEND/" | sed "s/$/$INVGREP_APPEND/" ; EXIT_STATUS=${PIPESTATUS[0]} 37 | return $((! $EXIT_STATUS)) 38 | } 39 | 40 | if [[ "$GITHUB_ACTIONS" == "true" ]]; then 41 | FLAKE8_FORMAT="##[error]%(path)s:%(row)s:%(col)s:%(code)s:%(text)s" 42 | INVGREP_PREPEND="##[error]" 43 | else 44 | FLAKE8_FORMAT="default" 45 | fi 46 | 47 | ### LINTING ### 48 | if [[ -z "$CHECK" || "$CHECK" == "lint" ]]; then 49 | 50 | echo "black --version" 51 | black --version 52 | 53 | MSG='Checking black formatting' ; echo $MSG 54 | black . --check 55 | RET=$(($RET + $?)) ; echo $MSG "DONE" 56 | 57 | # `setup.cfg` contains the list of error codes that are being ignored in flake8 58 | 59 | echo "flake8 --version" 60 | flake8 --version 61 | 62 | MSG='Linting .py code' ; echo $MSG 63 | flake8 --format="$FLAKE8_FORMAT" . 64 | RET=$(($RET + $?)) ; echo $MSG "DONE" 65 | 66 | echo "isort --version-number" 67 | isort --version-number 68 | 69 | # Imports - Check formatting using isort see setup.cfg for settings 70 | MSG='Check import format using isort' ; echo $MSG 71 | ISORT_CMD="isort --check-only dataframe_sql" 72 | if [[ "$GITHUB_ACTIONS" == "true" ]]; then 73 | eval $ISORT_CMD | awk '{print "##[error]" $0}'; RET=$(($RET + ${PIPESTATUS[0]})) 74 | else 75 | eval $ISORT_CMD 76 | fi 77 | RET=$(($RET + $?)) ; echo $MSG "DONE" 78 | 79 | fi 80 | 81 | ### PATTERNS ### 82 | if [[ -z "$CHECK" || "$CHECK" == "patterns" ]]; then 83 | 84 | # Check for imports from collections.abc instead of `from collections import abc` 85 | MSG='Check for non-standard imports' ; echo $MSG 86 | invgrep -R --include="*.py*" -E "from collections.abc import" dataframe_sql 87 | invgrep -R --include="*.py*" -E "from numpy import nan" dataframe_sql 88 | 89 | # Checks for function_object suite 90 | # Check for imports from pandas.util.testing instead of `import pandas.util.testing as tm` 91 | invgrep -R --include="*.py*" -E "from pandas.util.testing import" dataframe_sql/tests 92 | invgrep -R --include="*.py*" -E "from pandas.util import testing as tm" dataframe_sql/tests 93 | RET=$(($RET + $?)) ; echo $MSG "DONE" 94 | 95 | MSG='Check for use of exec' ; echo $MSG 96 | invgrep -R --include="*.py*" -E "[^a-zA-Z0-9_]exec\(" --exclude performance_tests.py dataframe_sql 97 | RET=$(($RET + $?)) ; echo $MSG "DONE" 98 | 99 | MSG='Check for pytest warns' ; echo $MSG 100 | invgrep -r -E --include '*.py' 'pytest\.warns' dataframe_sql/tests/ 101 | RET=$(($RET + $?)) ; echo $MSG "DONE" 102 | 103 | MSG='Check for pytest raises without context' ; echo $MSG 104 | invgrep -r -E --include '*.py' "[[:space:]] pytest.raises" dataframe_sql/tests/ 105 | RET=$(($RET + $?)) ; echo $MSG "DONE" 106 | 107 | MSG='Check for python2-style file encodings' ; echo $MSG 108 | invgrep -R --include="*.py" --include="*.pyx" -E "# -\*- coding: utf-8 -\*-" dataframe_sql 109 | RET=$(($RET + $?)) ; echo $MSG "DONE" 110 | 111 | MSG='Check for python2-style super usage' ; echo $MSG 112 | invgrep -R --include="*.py" -E "super\(\w*, (self|cls)\)" dataframe_sql 113 | RET=$(($RET + $?)) ; echo $MSG "DONE" 114 | 115 | # Check for the following code in testing: `np.testing` and `np.array_equal` 116 | MSG='Check for invalid testing' ; echo $MSG 117 | invgrep -r -E --include '*.py' --exclude testing.py '(numpy|np)(\.testing|\.array_equal)' dataframe_sql/tests/ 118 | RET=$(($RET + $?)) ; echo $MSG "DONE" 119 | 120 | MSG='Check for deprecated messages without sphinx directive' ; echo $MSG 121 | invgrep -R --include="*.py" --include="*.pyx" -E "(DEPRECATED|DEPRECATE|Deprecated)(:|,|\.)" dataframe_sql 122 | RET=$(($RET + $?)) ; echo $MSG "DONE" 123 | 124 | MSG='Check for python2 new-style classes and for empty parentheses' ; echo $MSG 125 | invgrep -R --include="*.py" --include="*.pyx" -E "class\s\S*\((object)?\):" dataframe_sql 126 | RET=$(($RET + $?)) ; echo $MSG "DONE" 127 | 128 | MSG='Check for incorrect sphinx directives' ; echo $MSG 129 | invgrep -R --include="*.py" --include="*.pyx" --include="*.rst" -E "\.\. (autosummary|contents|currentmodule|deprecated|function|image|important|include|ipython|literalinclude|math|module|note|raw|seealso|toctree|versionadded|versionchanged|warning):[^:]" ./dataframe_sql 130 | RET=$(($RET + $?)) ; echo $MSG "DONE" 131 | 132 | # Check for the following code in testing: `unittest.mock`, `mock.Mock()` or `mock.patch` 133 | MSG='Check that unittest.mock is not used (pytest builtin monkeypatch fixture should be used instead)' ; echo $MSG 134 | invgrep -r -E --include '*.py' '(unittest(\.| import )mock|mock\.Mock\(\)|mock\.patch)' dataframe_sql/tests/ 135 | RET=$(($RET + $?)) ; echo $MSG "DONE" 136 | 137 | MSG='Check for extra blank lines after the class definition' ; echo $MSG 138 | invgrep -R --include="*.py" -E 'class.*:\n\n( )+"""' . 139 | RET=$(($RET + $?)) ; echo $MSG "DONE" 140 | 141 | MSG='Check for use of comment-based annotation syntax' ; echo $MSG 142 | invgrep -R --include="*.py" '# type: (?!ignore)' dataframe_sql 143 | RET=$(($RET + $?)) ; echo $MSG "DONE" 144 | 145 | MSG='Check for use of foo.__class__ instead of type(foo)' ; echo $MSG 146 | invgrep -R --include="*.py" '\.__class__' dataframe_sql 147 | RET=$(($RET + $?)) ; echo $MSG "DONE" 148 | 149 | MSG='Check for use of xrange instead of range' ; echo $MSG 150 | invgrep -R --include="*.py" 'xrange' dataframe_sql 151 | RET=$(($RET + $?)) ; echo $MSG "DONE" 152 | 153 | MSG='Check that no file in the repo contains trailing whitespaces' ; echo $MSG 154 | INVGREP_APPEND=" <- trailing whitespaces found" 155 | invgrep -RI --exclude=\*.{svg,c,cpp,html,js} --exclude-dir=env "\s$" * 156 | RET=$(($RET + $?)) ; echo $MSG "DONE" 157 | 158 | unset INVGREP_APPEND 159 | fi 160 | 161 | ### TYPING ### 162 | if [[ -z "$CHECK" || "$CHECK" == "typing" ]]; then 163 | 164 | echo "mypy --version" 165 | mypy --version 166 | 167 | MSG='Performing static analysis using mypy' ; echo $MSG 168 | mypy dataframe_sql 169 | RET=$(($RET + $?)) ; echo $MSG "DONE" 170 | fi 171 | 172 | 173 | exit $RET -------------------------------------------------------------------------------- /ci/run_tests.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | pytest dataframe_sql/tests -------------------------------------------------------------------------------- /ci/setup_env.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash -e 2 | 3 | # edit the locale file if needed 4 | if [[ "$(uname)" == "Linux" && -n "$LC_ALL" ]]; then 5 | echo "Adding locale to the first line of pandas/__init__.py" 6 | rm -f pandas/__init__.pyc 7 | SEDC="3iimport locale\nlocale.setlocale(locale.LC_ALL, '$LC_ALL')\n" 8 | sed -i "$SEDC" pandas/__init__.py 9 | 10 | echo "[head -4 pandas/__init__.py]" 11 | head -4 pandas/__init__.py 12 | echo 13 | fi 14 | 15 | MINICONDA_DIR="$HOME/miniconda3" 16 | 17 | 18 | if [ -d "$MINICONDA_DIR" ]; then 19 | echo 20 | echo "rm -rf "$MINICONDA_DIR"" 21 | rm -rf "$MINICONDA_DIR" 22 | fi 23 | 24 | echo "Install Miniconda" 25 | UNAME_OS=$(uname) 26 | if [[ "$UNAME_OS" == 'Linux' ]]; then 27 | if [[ "$BITS32" == "yes" ]]; then 28 | CONDA_OS="Linux-x86" 29 | else 30 | CONDA_OS="Linux-x86_64" 31 | fi 32 | elif [[ "$UNAME_OS" == 'Darwin' ]]; then 33 | CONDA_OS="MacOSX-x86_64" 34 | else 35 | echo "OS $UNAME_OS not supported" 36 | exit 1 37 | fi 38 | 39 | wget -q "https://repo.continuum.io/miniconda/Miniconda3-latest-$CONDA_OS.sh" -O miniconda.sh 40 | chmod +x miniconda.sh 41 | ./miniconda.sh -b 42 | 43 | export PATH=$MINICONDA_DIR/bin:$PATH 44 | 45 | echo 46 | echo "which conda" 47 | which conda 48 | 49 | echo 50 | echo "update conda" 51 | conda config --set ssl_verify false 52 | conda config --set quiet true --set always_yes true --set changeps1 false 53 | conda install pip # create conda to create a historical artifact for pip & setuptools 54 | conda update -n base conda 55 | 56 | echo "conda info -a" 57 | conda info -a 58 | 59 | echo 60 | echo "set the compiler cache to work" 61 | if [ -z "$NOCACHE" ] && [ "${TRAVIS_OS_NAME}" == "linux" ]; then 62 | echo "Using ccache" 63 | export PATH=/usr/lib/ccache:/usr/lib64/ccache:$PATH 64 | GCC=$(which gcc) 65 | echo "gcc: $GCC" 66 | CCACHE=$(which ccache) 67 | echo "ccache: $CCACHE" 68 | export CC='ccache gcc' 69 | elif [ -z "$NOCACHE" ] && [ "${TRAVIS_OS_NAME}" == "osx" ]; then 70 | echo "Install ccache" 71 | brew install ccache > /dev/null 2>&1 72 | echo "Using ccache" 73 | export PATH=/usr/local/opt/ccache/libexec:$PATH 74 | gcc=$(which gcc) 75 | echo "gcc: $gcc" 76 | CCACHE=$(which ccache) 77 | echo "ccache: $CCACHE" 78 | else 79 | echo "Not using ccache" 80 | fi 81 | 82 | echo "source deactivate" 83 | source deactivate 84 | 85 | echo "conda list (root environment)" 86 | conda list 87 | 88 | # Clean up any left-over from a previous build 89 | # (note workaround for https://github.com/conda/conda/issues/2679: 90 | # `conda env remove` issue) 91 | conda remove --all -q -y -n dataframe_sql 92 | 93 | echo 94 | echo "conda create -n dataframe_sql python=3.7 -y" 95 | time conda create -n dataframe_sql python=3.7 -y 96 | 97 | 98 | if [[ "$BITS32" == "yes" ]]; then 99 | # activate 32-bit compiler 100 | export CONDA_BUILD=1 101 | fi 102 | 103 | echo "activate dataframe_sql" 104 | conda activate dataframe_sql 105 | pip install -r ci/test-requirements.txt 106 | pip install -r requirements.txt 107 | 108 | echo 109 | echo "remove qt" 110 | echo "causes problems with the clipboard, we use xsel for that" 111 | conda remove qt -y --force || true 112 | 113 | echo 114 | echo "conda list" 115 | conda list 116 | 117 | # Install DB for Linux 118 | 119 | if [[ -n ${SQL:0} ]]; then 120 | echo "installing dbs" 121 | mysql -e 'create database pandas_nosetest;' 122 | psql -c 'create database pandas_nosetest;' -U postgres 123 | else 124 | echo "not using dbs on non-linux Travis builds or Azure Pipelines" 125 | fi 126 | 127 | echo "done" -------------------------------------------------------------------------------- /ci/test-requirements.txt: -------------------------------------------------------------------------------- 1 | pandas>=1.0.1 2 | black 3 | flake8 4 | flake8-comprehensions>=3.1.0 5 | isort 6 | mypy 7 | freezegun 8 | pytest -------------------------------------------------------------------------------- /dataframe_sql/__init__.py: -------------------------------------------------------------------------------- 1 | # flake8: noqa 2 | from dataframe_sql.sql_select_query import query, register_temp_table, remove_temp_table 3 | 4 | from ._version import get_versions 5 | 6 | __version__ = get_versions()["version"] 7 | del get_versions 8 | -------------------------------------------------------------------------------- /dataframe_sql/_version.py: -------------------------------------------------------------------------------- 1 | # This file helps to compute a version number in source trees obtained from 2 | # git-archive tarball (such as those provided by githubs download-from-tag 3 | # feature). Distribution tarballs (built by setup.py sdist) and build 4 | # directories (produced by setup.py build) will contain a much shorter file 5 | # that just contains the computed version number. 6 | 7 | # This file is released into the public domain. Generated by 8 | # versioneer-0.18 (https://github.com/warner/python-versioneer) 9 | 10 | """Git implementation of _version.py. 11 | isort:skip_file 12 | """ 13 | 14 | import errno 15 | import os 16 | import re 17 | import subprocess 18 | import sys 19 | 20 | 21 | def get_keywords(): 22 | """Get the keywords needed to look up the version information.""" 23 | # these strings will be replaced by git during git-archive. 24 | # setup.py/versioneer.py will grep for the variable names, so they must 25 | # each be defined on a line of their own. _version.py will just call 26 | # get_keywords(). 27 | git_refnames = " (HEAD -> master, tag: v0.4.0)" 28 | git_full = "816d00e4e5cbbf1be8bde42699d14e184a292c96" 29 | git_date = "2021-04-18 13:53:08 -0400" 30 | keywords = {"refnames": git_refnames, "full": git_full, "date": git_date} 31 | return keywords 32 | 33 | 34 | class VersioneerConfig: 35 | """Container for Versioneer configuration parameters.""" 36 | 37 | 38 | def get_config(): 39 | """Create, populate and return the VersioneerConfig() object.""" 40 | # these strings are filled in when 'setup.py versioneer' creates 41 | # _version.py 42 | cfg = VersioneerConfig() 43 | cfg.VCS = "git" 44 | cfg.style = "pep440" 45 | cfg.tag_prefix = "v" 46 | cfg.parentdir_prefix = "dataframe_sql-" 47 | cfg.versionfile_source = "dataframe_sql/_version.py" 48 | cfg.verbose = False 49 | return cfg 50 | 51 | 52 | class NotThisMethod(Exception): 53 | """Exception raised if a method is not valid for the current scenario.""" 54 | 55 | 56 | LONG_VERSION_PY = {} 57 | HANDLERS = {} 58 | 59 | 60 | def register_vcs_handler(vcs, method): # decorator 61 | """Decorator to mark a method as the handler for a particular VCS.""" 62 | 63 | def decorate(f): 64 | """Store f in HANDLERS[vcs][method].""" 65 | if vcs not in HANDLERS: 66 | HANDLERS[vcs] = {} 67 | HANDLERS[vcs][method] = f 68 | return f 69 | 70 | return decorate 71 | 72 | 73 | def run_command(commands, args, cwd=None, verbose=False, hide_stderr=False, env=None): 74 | """Call the given command(s).""" 75 | assert isinstance(commands, list) 76 | p = None 77 | for c in commands: 78 | try: 79 | dispcmd = str([c] + args) 80 | # remember shell=False, so use git.cmd on windows, not just git 81 | p = subprocess.Popen( 82 | [c] + args, 83 | cwd=cwd, 84 | env=env, 85 | stdout=subprocess.PIPE, 86 | stderr=(subprocess.PIPE if hide_stderr else None), 87 | ) 88 | break 89 | except EnvironmentError: 90 | e = sys.exc_info()[1] 91 | if e.errno == errno.ENOENT: 92 | continue 93 | if verbose: 94 | print("unable to run %s" % dispcmd) 95 | print(e) 96 | return None, None 97 | else: 98 | if verbose: 99 | print("unable to find command, tried %s" % (commands,)) 100 | return None, None 101 | stdout = p.communicate()[0].strip() 102 | if sys.version_info[0] >= 3: 103 | stdout = stdout.decode() 104 | if p.returncode != 0: 105 | if verbose: 106 | print("unable to run %s (error)" % dispcmd) 107 | print("stdout was %s" % stdout) 108 | return None, p.returncode 109 | return stdout, p.returncode 110 | 111 | 112 | def versions_from_parentdir(parentdir_prefix, root, verbose): 113 | """Try to determine the version from the parent directory name. 114 | 115 | Source tarballs conventionally unpack into a directory that includes both 116 | the project name and a version string. We will also support searching up 117 | two directory levels for an appropriately named parent directory 118 | """ 119 | rootdirs = [] 120 | 121 | for i in range(3): 122 | dirname = os.path.basename(root) 123 | if dirname.startswith(parentdir_prefix): 124 | return { 125 | "version": dirname[len(parentdir_prefix) :], 126 | "full-revisionid": None, 127 | "dirty": False, 128 | "error": None, 129 | "date": None, 130 | } 131 | else: 132 | rootdirs.append(root) 133 | root = os.path.dirname(root) # up a level 134 | 135 | if verbose: 136 | print( 137 | "Tried directories %s but none started with prefix %s" 138 | % (str(rootdirs), parentdir_prefix) 139 | ) 140 | raise NotThisMethod("rootdir doesn't start with parentdir_prefix") 141 | 142 | 143 | @register_vcs_handler("git", "get_keywords") 144 | def git_get_keywords(versionfile_abs): 145 | """Extract version information from the given file.""" 146 | # the code embedded in _version.py can just fetch the value of these 147 | # keywords. When used from setup.py, we don't want to import _version.py, 148 | # so we do it with a regexp instead. This function is not used from 149 | # _version.py. 150 | keywords = {} 151 | try: 152 | f = open(versionfile_abs, "r") 153 | for line in f.readlines(): 154 | if line.strip().startswith("git_refnames ="): 155 | mo = re.search(r'=\s*"(.*)"', line) 156 | if mo: 157 | keywords["refnames"] = mo.group(1) 158 | if line.strip().startswith("git_full ="): 159 | mo = re.search(r'=\s*"(.*)"', line) 160 | if mo: 161 | keywords["full"] = mo.group(1) 162 | if line.strip().startswith("git_date ="): 163 | mo = re.search(r'=\s*"(.*)"', line) 164 | if mo: 165 | keywords["date"] = mo.group(1) 166 | f.close() 167 | except EnvironmentError: 168 | pass 169 | return keywords 170 | 171 | 172 | @register_vcs_handler("git", "keywords") 173 | def git_versions_from_keywords(keywords, tag_prefix, verbose): 174 | """Get version information from git keywords.""" 175 | if not keywords: 176 | raise NotThisMethod("no keywords at all, weird") 177 | date = keywords.get("date") 178 | if date is not None: 179 | # git-2.2.0 added "%cI", which expands to an ISO-8601 -compliant 180 | # datestamp. However we prefer "%ci" (which expands to an "ISO-8601 181 | # -like" string, which we must then edit to make compliant), because 182 | # it's been around since git-1.5.3, and it's too difficult to 183 | # discover which version we're using, or to work around using an 184 | # older one. 185 | date = date.strip().replace(" ", "T", 1).replace(" ", "", 1) 186 | refnames = keywords["refnames"].strip() 187 | if refnames.startswith("$Format"): 188 | if verbose: 189 | print("keywords are unexpanded, not using") 190 | raise NotThisMethod("unexpanded keywords, not a git-archive tarball") 191 | refs = set([r.strip() for r in refnames.strip("()").split(",")]) 192 | # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of 193 | # just "foo-1.0". If we see a "tag: " prefix, prefer those. 194 | TAG = "tag: " 195 | tags = set([r[len(TAG) :] for r in refs if r.startswith(TAG)]) 196 | if not tags: 197 | # Either we're using git < 1.8.3, or there really are no tags. We use 198 | # a heuristic: assume all version tags have a digit. The old git %d 199 | # expansion behaves like git log --decorate=short and strips out the 200 | # refs/heads/ and refs/tags/ prefixes that would let us distinguish 201 | # between branches and tags. By ignoring refnames without digits, we 202 | # filter out many common branch names like "release" and 203 | # "stabilization", as well as "HEAD" and "master". 204 | tags = set([r for r in refs if re.search(r"\d", r)]) 205 | if verbose: 206 | print("discarding '%s', no digits" % ",".join(refs - tags)) 207 | if verbose: 208 | print("likely tags: %s" % ",".join(sorted(tags))) 209 | for ref in sorted(tags): 210 | # sorting will prefer e.g. "2.0" over "2.0rc1" 211 | if ref.startswith(tag_prefix): 212 | r = ref[len(tag_prefix) :] 213 | if verbose: 214 | print("picking %s" % r) 215 | return { 216 | "version": r, 217 | "full-revisionid": keywords["full"].strip(), 218 | "dirty": False, 219 | "error": None, 220 | "date": date, 221 | } 222 | # no suitable tags, so version is "0+unknown", but full hex is still there 223 | if verbose: 224 | print("no suitable tags, using unknown + full revision id") 225 | return { 226 | "version": "0+unknown", 227 | "full-revisionid": keywords["full"].strip(), 228 | "dirty": False, 229 | "error": "no suitable tags", 230 | "date": None, 231 | } 232 | 233 | 234 | @register_vcs_handler("git", "pieces_from_vcs") 235 | def git_pieces_from_vcs(tag_prefix, root, verbose, run_command=run_command): 236 | """Get version from 'git describe' in the root of the source tree. 237 | 238 | This only gets called if the git-archive 'subst' keywords were *not* 239 | expanded, and _version.py hasn't already been rewritten with a short 240 | version string, meaning we're inside a checked out source tree. 241 | """ 242 | GITS = ["git"] 243 | if sys.platform == "win32": 244 | GITS = ["git.cmd", "git.exe"] 245 | 246 | out, rc = run_command(GITS, ["rev-parse", "--git-dir"], cwd=root, hide_stderr=True) 247 | if rc != 0: 248 | if verbose: 249 | print("Directory %s not under git control" % root) 250 | raise NotThisMethod("'git rev-parse --git-dir' returned error") 251 | 252 | # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] 253 | # if there isn't one, this yields HEX[-dirty] (no NUM) 254 | describe_out, rc = run_command( 255 | GITS, 256 | [ 257 | "describe", 258 | "--tags", 259 | "--dirty", 260 | "--always", 261 | "--long", 262 | "--match", 263 | "%s*" % tag_prefix, 264 | ], 265 | cwd=root, 266 | ) 267 | # --long was added in git-1.5.5 268 | if describe_out is None: 269 | raise NotThisMethod("'git describe' failed") 270 | describe_out = describe_out.strip() 271 | full_out, rc = run_command(GITS, ["rev-parse", "HEAD"], cwd=root) 272 | if full_out is None: 273 | raise NotThisMethod("'git rev-parse' failed") 274 | full_out = full_out.strip() 275 | 276 | pieces = {} 277 | pieces["long"] = full_out 278 | pieces["short"] = full_out[:7] # maybe improved later 279 | pieces["error"] = None 280 | 281 | # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] 282 | # TAG might have hyphens. 283 | git_describe = describe_out 284 | 285 | # look for -dirty suffix 286 | dirty = git_describe.endswith("-dirty") 287 | pieces["dirty"] = dirty 288 | if dirty: 289 | git_describe = git_describe[: git_describe.rindex("-dirty")] 290 | 291 | # now we have TAG-NUM-gHEX or HEX 292 | 293 | if "-" in git_describe: 294 | # TAG-NUM-gHEX 295 | mo = re.search(r"^(.+)-(\d+)-g([0-9a-f]+)$", git_describe) 296 | if not mo: 297 | # unparseable. Maybe git-describe is misbehaving? 298 | pieces["error"] = "unable to parse git-describe output: '%s'" % describe_out 299 | return pieces 300 | 301 | # tag 302 | full_tag = mo.group(1) 303 | if not full_tag.startswith(tag_prefix): 304 | if verbose: 305 | fmt = "tag '%s' doesn't start with prefix '%s'" 306 | print(fmt % (full_tag, tag_prefix)) 307 | pieces["error"] = "tag '%s' doesn't start with prefix '%s'" % ( 308 | full_tag, 309 | tag_prefix, 310 | ) 311 | return pieces 312 | pieces["closest-tag"] = full_tag[len(tag_prefix) :] 313 | 314 | # distance: number of commits since tag 315 | pieces["distance"] = int(mo.group(2)) 316 | 317 | # commit: short hex revision ID 318 | pieces["short"] = mo.group(3) 319 | 320 | else: 321 | # HEX: no tags 322 | pieces["closest-tag"] = None 323 | count_out, rc = run_command(GITS, ["rev-list", "HEAD", "--count"], cwd=root) 324 | pieces["distance"] = int(count_out) # total number of commits 325 | 326 | # commit date: see ISO-8601 comment in git_versions_from_keywords() 327 | date = run_command(GITS, ["show", "-s", "--format=%ci", "HEAD"], cwd=root)[ 328 | 0 329 | ].strip() 330 | pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) 331 | 332 | return pieces 333 | 334 | 335 | def plus_or_dot(pieces): 336 | """Return a + if we don't already have one, else return a .""" 337 | if "+" in pieces.get("closest-tag", ""): 338 | return "." 339 | return "+" 340 | 341 | 342 | def render_pep440(pieces): 343 | """Build up version string, with post-release "local version identifier". 344 | 345 | Our goal: TAG[+DISTANCE.gHEX[.dirty]] . Note that if you 346 | get a tagged build and then dirty it, you'll get TAG+0.gHEX.dirty 347 | 348 | Exceptions: 349 | 1: no tags. git_describe was just HEX. 0+untagged.DISTANCE.gHEX[.dirty] 350 | """ 351 | if pieces["closest-tag"]: 352 | rendered = pieces["closest-tag"] 353 | if pieces["distance"] or pieces["dirty"]: 354 | rendered += plus_or_dot(pieces) 355 | rendered += "%d.g%s" % (pieces["distance"], pieces["short"]) 356 | if pieces["dirty"]: 357 | rendered += ".dirty" 358 | else: 359 | # exception #1 360 | rendered = "0+untagged.%d.g%s" % (pieces["distance"], pieces["short"]) 361 | if pieces["dirty"]: 362 | rendered += ".dirty" 363 | return rendered 364 | 365 | 366 | def render_pep440_pre(pieces): 367 | """TAG[.post.devDISTANCE] -- No -dirty. 368 | 369 | Exceptions: 370 | 1: no tags. 0.post.devDISTANCE 371 | """ 372 | if pieces["closest-tag"]: 373 | rendered = pieces["closest-tag"] 374 | if pieces["distance"]: 375 | rendered += ".post.dev%d" % pieces["distance"] 376 | else: 377 | # exception #1 378 | rendered = "0.post.dev%d" % pieces["distance"] 379 | return rendered 380 | 381 | 382 | def render_pep440_post(pieces): 383 | """TAG[.postDISTANCE[.dev0]+gHEX] . 384 | 385 | The ".dev0" means dirty. Note that .dev0 sorts backwards 386 | (a dirty tree will appear "older" than the corresponding clean one), 387 | but you shouldn't be releasing software with -dirty anyways. 388 | 389 | Exceptions: 390 | 1: no tags. 0.postDISTANCE[.dev0] 391 | """ 392 | if pieces["closest-tag"]: 393 | rendered = pieces["closest-tag"] 394 | if pieces["distance"] or pieces["dirty"]: 395 | rendered += ".post%d" % pieces["distance"] 396 | if pieces["dirty"]: 397 | rendered += ".dev0" 398 | rendered += plus_or_dot(pieces) 399 | rendered += "g%s" % pieces["short"] 400 | else: 401 | # exception #1 402 | rendered = "0.post%d" % pieces["distance"] 403 | if pieces["dirty"]: 404 | rendered += ".dev0" 405 | rendered += "+g%s" % pieces["short"] 406 | return rendered 407 | 408 | 409 | def render_pep440_old(pieces): 410 | """TAG[.postDISTANCE[.dev0]] . 411 | 412 | The ".dev0" means dirty. 413 | 414 | Eexceptions: 415 | 1: no tags. 0.postDISTANCE[.dev0] 416 | """ 417 | if pieces["closest-tag"]: 418 | rendered = pieces["closest-tag"] 419 | if pieces["distance"] or pieces["dirty"]: 420 | rendered += ".post%d" % pieces["distance"] 421 | if pieces["dirty"]: 422 | rendered += ".dev0" 423 | else: 424 | # exception #1 425 | rendered = "0.post%d" % pieces["distance"] 426 | if pieces["dirty"]: 427 | rendered += ".dev0" 428 | return rendered 429 | 430 | 431 | def render_git_describe(pieces): 432 | """TAG[-DISTANCE-gHEX][-dirty]. 433 | 434 | Like 'git describe --tags --dirty --always'. 435 | 436 | Exceptions: 437 | 1: no tags. HEX[-dirty] (note: no 'g' prefix) 438 | """ 439 | if pieces["closest-tag"]: 440 | rendered = pieces["closest-tag"] 441 | if pieces["distance"]: 442 | rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) 443 | else: 444 | # exception #1 445 | rendered = pieces["short"] 446 | if pieces["dirty"]: 447 | rendered += "-dirty" 448 | return rendered 449 | 450 | 451 | def render_git_describe_long(pieces): 452 | """TAG-DISTANCE-gHEX[-dirty]. 453 | 454 | Like 'git describe --tags --dirty --always -long'. 455 | The distance/hash is unconditional. 456 | 457 | Exceptions: 458 | 1: no tags. HEX[-dirty] (note: no 'g' prefix) 459 | """ 460 | if pieces["closest-tag"]: 461 | rendered = pieces["closest-tag"] 462 | rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) 463 | else: 464 | # exception #1 465 | rendered = pieces["short"] 466 | if pieces["dirty"]: 467 | rendered += "-dirty" 468 | return rendered 469 | 470 | 471 | def render(pieces, style): 472 | """Render the given version pieces into the requested style.""" 473 | if pieces["error"]: 474 | return { 475 | "version": "unknown", 476 | "full-revisionid": pieces.get("long"), 477 | "dirty": None, 478 | "error": pieces["error"], 479 | "date": None, 480 | } 481 | 482 | if not style or style == "default": 483 | style = "pep440" # the default 484 | 485 | if style == "pep440": 486 | rendered = render_pep440(pieces) 487 | elif style == "pep440-pre": 488 | rendered = render_pep440_pre(pieces) 489 | elif style == "pep440-post": 490 | rendered = render_pep440_post(pieces) 491 | elif style == "pep440-old": 492 | rendered = render_pep440_old(pieces) 493 | elif style == "git-describe": 494 | rendered = render_git_describe(pieces) 495 | elif style == "git-describe-long": 496 | rendered = render_git_describe_long(pieces) 497 | else: 498 | raise ValueError("unknown style '%s'" % style) 499 | 500 | return { 501 | "version": rendered, 502 | "full-revisionid": pieces["long"], 503 | "dirty": pieces["dirty"], 504 | "error": None, 505 | "date": pieces.get("date"), 506 | } 507 | 508 | 509 | def get_versions(): 510 | """Get version information or return default if unable to do so.""" 511 | # I am in _version.py, which lives at ROOT/VERSIONFILE_SOURCE. If we have 512 | # __file__, we can work backwards from there to the root. Some 513 | # py2exe/bbfreeze/non-CPython implementations don't do __file__, in which 514 | # case we can only use expanded keywords. 515 | 516 | cfg = get_config() 517 | verbose = cfg.verbose 518 | 519 | try: 520 | return git_versions_from_keywords(get_keywords(), cfg.tag_prefix, verbose) 521 | except NotThisMethod: 522 | pass 523 | 524 | try: 525 | root = os.path.realpath(__file__) 526 | # versionfile_source is the relative path from the top of the source 527 | # tree (where the .git directory might live) to this file. Invert 528 | # this to find the root from __file__. 529 | for i in cfg.versionfile_source.split("/"): 530 | root = os.path.dirname(root) 531 | except NameError: 532 | return { 533 | "version": "0+unknown", 534 | "full-revisionid": None, 535 | "dirty": None, 536 | "error": "unable to find root of source tree", 537 | "date": None, 538 | } 539 | 540 | try: 541 | pieces = git_pieces_from_vcs(cfg.tag_prefix, root, verbose) 542 | return render(pieces, cfg.style) 543 | except NotThisMethod: 544 | pass 545 | 546 | try: 547 | if cfg.parentdir_prefix: 548 | return versions_from_parentdir(cfg.parentdir_prefix, root, verbose) 549 | except NotThisMethod: 550 | pass 551 | 552 | return { 553 | "version": "0+unknown", 554 | "full-revisionid": None, 555 | "dirty": None, 556 | "error": "unable to compute version", 557 | "date": None, 558 | } 559 | -------------------------------------------------------------------------------- /dataframe_sql/data/DigiDB_digimonlist.csv: -------------------------------------------------------------------------------- 1 | Number,Digimon,Stage,Type,Attribute,Memory,Equip Slots,Lv 50 HP,Lv50 SP,Lv50 Atk,Lv50 Def,Lv50 Int,Lv50 Spd 2 | 1,Kuramon,Baby,Free,Neutral,2,0,590,77,79,69,68,95 3 | 2,Pabumon,Baby,Free,Neutral,2,0,950,62,76,76,69,68 4 | 3,Punimon,Baby,Free,Neutral,2,0,870,50,97,87,50,75 5 | 4,Botamon,Baby,Free,Neutral,2,0,690,68,77,95,76,61 6 | 5,Poyomon,Baby,Free,Neutral,2,0,540,98,54,59,95,86 7 | 6,Koromon,In-Training,Free,Fire,3,0,940,52,109,93,52,76 8 | 7,Tanemon,In-Training,Free,Plant,3,0,1030,64,85,82,73,69 9 | 8,Tsunomon,In-Training,Free,Earth,3,0,930,54,107,92,54,76 10 | 9,Tsumemon,In-Training,Free,Dark,3,0,930,64,108,64,54,93 11 | 10,Tokomon,In-Training,Free,Neutral,3,0,640,86,76,74,74,103 12 | 11,Nyaromon,In-Training,Free,Light,3,0,540,107,54,64,103,94 13 | 12,Pagumon,In-Training,Free,Dark,3,0,550,103,60,63,102,93 14 | 13,Yokomon,In-Training,Free,Plant,3,0,1040,64,82,82,75,69 15 | 14,Bukamon,In-Training,Free,Water,3,0,830,93,54,74,103,69 16 | 15,Motimon,In-Training,Free,Neutral,3,0,1030,63,82,81,78,69 17 | 16,Wanyamon,In-Training,Free,Wind,3,0,830,82,79,75,75,82 18 | 17,Agumon,Rookie,Vaccine,Fire,5,1,1030,59,131,103,54,86 19 | 18,Agumon (Blk),Rookie,Virus,Fire,5,1,1020,56,124,108,56,85 20 | 19,Armadillomon,Rookie,Free,Earth,4,1,1160,85,67,111,65,72 21 | 20,Impmon,Rookie,Virus,Dark,5,1,530,114,83,65,114,102 22 | 21,Elecmon,Rookie,Data,Electric,4,1,930,93,82,79,79,90 23 | 22,Otamamon,Rookie,Virus,Water,4,1,930,105,52,75,113,78 24 | 23,Gaomon,Rookie,Data,Neutral,5,1,1030,69,118,74,66,101 25 | 24,Gazimon,Rookie,Virus,Dark,4,1,970,71,123,64,59,102 26 | 25,Gabumon,Rookie,Data,Fire,5,1,980,88,94,81,79,91 27 | 26,Gabumon (Blk),Rookie,Virus,Fire,5,1,950,83,99,89,74,91 28 | 27,Guilmon,Rookie,Virus,Fire,5,1,1050,69,133,74,54,101 29 | 28,Kudamon,Rookie,Vaccine,Light,5,1,590,128,53,74,117,105 30 | 29,Keramon,Rookie,Free,Dark,5,1,1030,74,123,69,61,101 31 | 30,Gotsumon,Rookie,Data,Earth,5,1,790,79,93,118,90,72 32 | 31,Goblimon,Rookie,Virus,Earth,4,1,1050,51,115,110,51,84 33 | 32,Gomamon,Rookie,Vaccine,Water,5,1,1160,69,93,93,81,79 34 | 33,Syakomon,Rookie,Virus,Water,4,1,870,100,53,86,112,78 35 | 34,Solarmon,Rookie,Vaccine,Light,4,1,1030,88,69,108,71,77 36 | 35,Terriermon,Rookie,Vaccine,Wind,4,1,690,93,84,75,84,112 37 | 36,Tentomon,Rookie,Vaccine,Plant,4,1,750,79,86,110,93,73 38 | 37,ToyAgumon,Rookie,Vaccine,Neutral,4,1,1110,87,72,112,63,71 39 | 38,Dorumon,Rookie,Data,Neutral,5,1,1020,65,128,79,56,101 40 | 39,Hagurumon,Rookie,Virus,Electric,4,1,1090,91,66,110,69,71 41 | 40,Patamon,Rookie,Data,Wind,4,1,880,93,79,74,92,90 42 | 41,Hackmon,Rookie,Data,Fire,5,1,1030,59,118,108,63,85 43 | 42,Palmon,Rookie,Data,Plant,5,1,1140,65,103,90,80,79 44 | 43,DemiDevimon,Rookie,Virus,Dark,4,1,650,87,89,76,89,111 45 | 44,Biyomon,Rookie,Vaccine,Wind,4,1,830,93,85,79,85,91 46 | 45,Falcomon,Rookie,Vaccine,Wind,5,1,740,93,94,79,79,113 47 | 46,Veemon,Rookie,Free,Neutral,5,1,1040,74,130,74,53,101 48 | 47,Salamon,Rookie,Vaccine,Light,4,1,540,118,59,69,119,97 49 | 48,Betamon,Rookie,Virus,Water,4,1,870,101,61,76,113,78 50 | 49,Hawkmon,Rookie,Free,Wind,5,1,690,88,99,79,83,114 51 | 50,Lalamon,Rookie,Data,Plant,4,1,1100,74,87,87,79,79 52 | 51,Lucemon,Rookie,Vaccine,Light,14,1,1230,148,59,104,208,119 53 | 52,Renamon,Rookie,Data,Plant,5,1,930,93,89,74,89,93 54 | 53,Lopmon,Rookie,Data,Earth,4,1,790,79,103,68,103,85 55 | 54,Wormmon,Rookie,Free,Plant,4,1,760,76,92,111,90,71 56 | 55,IceDevimon,Champion,Virus,Water,8,1,990,94,140,89,118,92 57 | 56,Aquilamon,Champion,Free,Wind,8,1,840,108,109,89,89,143 58 | 57,Ankylomon,Champion,Free,Earth,6,2,1330,98,89,133,79,79 59 | 58,Ikkakumon,Champion,Vaccine,Water,8,1,1330,84,118,102,94,90 60 | 59,Wizardmon,Champion,Data,Dark,8,1,690,138,74,79,143,118 61 | 60,Woodmon,Champion,Virus,Plant,6,2,1480,74,109,103,89,88 62 | 61,ExVeemon,Champion,Free,Neutral,8,1,1030,118,104,94,94,118 63 | 62,Angemon,Champion,Vaccine,Light,8,1,940,94,128,89,128,99 64 | 63,Ogremon,Champion,Virus,Earth,8,1,1230,64,155,118,64,97 65 | 64,Guardromon,Champion,Virus,Electric,6,2,990,84,108,138,103,79 66 | 65,GaoGamon,Champion,Data,Wind,8,1,740,108,109,94,99,138 67 | 66,Kabuterimon,Champion,Vaccine,Plant,6,2,890,89,108,128,116,81 68 | 67,ShellNumemon,Champion,Virus,Water,6,2,1280,103,79,148,74,79 69 | 68,Gargomon,Champion,Vaccine,Electric,6,2,1030,103,109,99,89,108 70 | 69,Garurumon,Champion,Vaccine,Fire,8,1,890,108,99,94,94,138 71 | 70,Garurumon (Blk),Champion,Virus,Fire,8,1,890,108,109,104,79,133 72 | 71,Kyubimon,Champion,Data,Fire,8,1,740,138,59,84,138,128 73 | 72,Growlmon,Champion,Virus,Fire,8,1,1180,79,143,113,69,109 74 | 73,Kurisarimon,Champion,Free,Dark,8,1,1280,84,153,79,64,113 75 | 74,Greymon,Champion,Vaccine,Fire,8,1,1230,74,148,118,64,104 76 | 75,Greymon (Blue),Champion,Virus,Fire,8,1,1280,74,153,118,59,99 77 | 76,Clockmon,Champion,Data,Electric,6,2,1030,118,64,101,133,92 78 | 77,Kuwagamon,Champion,Virus,Plant,6,2,1180,69,153,113,59,99 79 | 78,Gekomon,Champion,Virus,Water,6,2,1130,123,68,89,128,90 80 | 79,Geremon,Champion,Virus,Electric,6,2,1380,99,104,128,64,78 81 | 80,GoldNumemon,Champion,Virus,Light,6,2,1130,124,59,84,143,88 82 | 81,Cyclonemon,Champion,Virus,Earth,6,2,940,84,131,128,93,81 83 | 82,Sunflowmon,Champion,Data,Plant,6,2,1180,113,64,89,141,86 84 | 83,Seadramon,Champion,Data,Water,6,2,1080,118,64,99,134,88 85 | 84,GeoGreymon,Champion,Vaccine,Fire,8,1,1330,89,143,84,64,118 86 | 85,Sukamon,Champion,Virus,Earth,6,2,1430,98,89,133,69,79 87 | 86,Starmon,Champion,Data,Neutral,6,2,1080,98,104,109,91,101 88 | 87,Stingmon,Champion,Free,Plant,8,1,1130,84,143,74,74,133 89 | 88,Socerimon,Champion,Vaccine,Water,8,1,1030,123,64,93,148,90 90 | 89,Tankmon,Champion,Data,Electric,6,2,940,84,113,141,98,81 91 | 90,Tyrannomon,Champion,Data,Fire,6,2,1230,59,148,125,59,97 92 | 91,Gatomon,Champion,Vaccine,Light,8,1,640,143,69,79,143,123 93 | 92,Devimon,Champion,Virus,Dark,8,1,990,94,133,84,125,97 94 | 93,Togemon,Champion,Data,Plant,8,1,1330,84,108,113,93,90 95 | 94,Dorugamon,Champion,Data,Earth,8,1,1180,84,138,89,69,123 96 | 95,Nanimon,Champion,Virus,Earth,6,2,1070,84,108,133,98,81 97 | 96,Numemon,Champion,Virus,Earth,6,2,1380,99,84,138,69,83 98 | 97,Birdramon,Champion,Vaccine,Fire,8,1,940,113,94,84,109,128 99 | 98,Bakemon,Champion,Virus,Dark,6,2,590,148,64,74,138,128 100 | 99,Veedramon,Champion,Vaccine,Wind,8,1,1180,84,138,113,64,114 101 | 100,PlatinumSukamon,Champion,Virus,Neutral,6,2,1380,98,79,138,79,79 102 | 101,BlackGatomon,Champion,Virus,Dark,8,1,690,133,84,84,133,118 103 | 102,Vegiemon,Champion,Virus,Plant,6,2,1380,79,113,106,87,88 104 | 103,Peckmon,Champion,Vaccine,Wind,8,1,790,113,104,84,94,148 105 | 104,Meramon,Champion,Data,Fire,6,2,1130,69,138,113,79,99 106 | 105,Frigimon,Champion,Vaccine,Water,6,2,1380,83,103,98,99,90 107 | 106,Leomon,Champion,Vaccine,Earth,8,1,1180,69,143,123,71,97 108 | 107,Reppamon,Champion,Vaccine,Light,8,1,790,118,94,99,99,143 109 | 108,Waspmon,Champion,Virus,Electric,6,2,1180,74,133,99,74,113 110 | 109,MegaKabuterimon,Ultimate,Vaccine,Plant,12,2,1430,115,94,163,109,92 111 | 110,Antylamon,Ultimate,Data,Neutral,12,2,940,123,124,109,114,168 112 | 111,Andromon,Ultimate,Vaccine,Electric,12,2,1040,94,133,157,133,95 113 | 112,Meteormon,Ultimate,Data,Earth,12,2,1090,104,123,163,128,89 114 | 113,Infermon,Ultimate,Free,Dark,14,1,1330,99,198,89,74,153 115 | 114,Myotismon,Ultimate,Virus,Dark,14,1,1290,113,148,99,148,110 116 | 115,AeroVeedramon,Ultimate,Vaccine,Wind,14,1,1430,94,163,99,94,153 117 | 116,Etemon,Ultimate,Virus,Dark,12,2,1130,133,104,119,129,133 118 | 117,Angewomon,Ultimate,Vaccine,Light,14,1,890,163,69,94,188,143 119 | 118,Okuwamon,Ultimate,Virus,Plant,12,2,1330,74,158,158,74,119 120 | 119,Garudamon,Ultimate,Vaccine,Fire,12,2,1040,123,124,109,129,143 121 | 120,Gigadramon,Ultimate,Virus,Wind,12,2,1240,94,137,148,113,100 122 | 121,CannonBeemon,Ultimate,Virus,Electric,12,2,990,123,129,139,99,143 123 | 122,GrapLeomon,Ultimate,Vaccine,Electric,12,2,1580,89,163,99,79,143 124 | 123,Cyberdramon,Ultimate,Vaccine,Dark,14,1,1480,81,173,143,79,122 125 | 124,Shakkoumon,Ultimate,Free,Light,14,1,1530,135,84,158,139,92 126 | 125,Cherrymon,Ultimate,Virus,Plant,12,2,1630,108,113,133,114,100 127 | 126,Silphymon,Ultimate,Free,Wind,14,1,1040,138,119,119,124,158 128 | 127,SuperStarmon,Ultimate,Data,Light,12,2,1180,128,122,134,109,120 129 | 128,SkullGreymon,Ultimate,Virus,Dark,14,1,1230,79,203,153,69,119 130 | 129,Zudomon,Ultimate,Vaccine,Water,12,2,1630,84,150,128,104,102 131 | 130,Taomon,Ultimate,Data,Dark,12,2,990,148,69,104,173,138 132 | 131,Chirinmon,Ultimate,Vaccine,Light,14,1,940,133,124,119,124,168 133 | 132,Digitamamon,Ultimate,Data,Neutral,12,2,1380,89,128,148,111,102 134 | 133,SkullMeramon,Ultimate,Data,Fire,12,2,1530,79,183,133,70,113 135 | 134,ShogunGekomon,Ultimate,Virus,Water,12,2,1980,96,113,113,99,97 136 | 135,DoruGreymon,Ultimate,Data,Fire,14,1,1480,84,161,153,84,116 137 | 136,Knightmon,Ultimate,Data,Neutral,12,2,1140,109,135,158,123,92 138 | 137,Datamon,Ultimate,Virus,Electric,12,2,1180,133,74,114,175,102 139 | 138,Paildramon,Ultimate,Free,Neutral,14,1,1280,133,139,124,109,128 140 | 139,Panjyamon,Ultimate,Vaccine,Water,12,2,1280,128,124,114,111,126 141 | 140,Pumpkinmon,Ultimate,Data,Earth,10,3,1480,97,123,108,119,111 142 | 141,Piximon,Ultimate,Data,Light,12,2,990,123,104,104,134,153 143 | 142,BlackKingNumemon,Ultimate,Virus,Dark,10,3,1580,113,89,168,89,89 144 | 143,BlueMeramon,Ultimate,Virus,Fire,12,2,1140,109,148,94,133,119 145 | 144,Vademon,Ultimate,Virus,Dark,10,3,1130,165,64,94,173,97 146 | 145,Whamon,Ultimate,Vaccine,Water,12,2,1680,93,123,123,124,100 147 | 146,MagnaAngemon,Ultimate,Vaccine,Light,14,1,1180,143,98,119,163,105 148 | 147,MachGaogamon,Ultimate,Data,Wind,12,2,1480,89,158,89,89,158 149 | 148,Mamemon,Ultimate,Data,Earth,10,3,1480,113,111,153,84,97 150 | 149,MegaSeadramon,Ultimate,Data,Water,12,2,1330,138,86,114,158,102 151 | 150,Megadramon,Ultimate,Virus,Wind,12,2,1430,79,158,148,69,119 152 | 151,WarGrowlmon,Ultimate,Virus,Fire,14,1,1430,84,178,138,87,116 153 | 152,MetalGreymon,Ultimate,Vaccine,Fire,14,1,1530,84,168,148,80,113 154 | 153,MetalGreymon (Blue),Ultimate,Virus,Fire,14,1,1670,84,173,143,69,110 155 | 154,MetalTyrannomon,Ultimate,Virus,Electric,12,2,1090,104,130,178,118,92 156 | 155,MetalMamemon,Ultimate,Data,Electric,10,3,1040,99,123,153,128,103 157 | 156,Monzaemon,Ultimate,Vaccine,Neutral,12,2,1580,93,128,118,119,100 158 | 157,Crowmon,Ultimate,Vaccine,Wind,12,2,890,128,119,104,119,173 159 | 158,RizeGreymon,Ultimate,Vaccine,Fire,14,1,1530,94,178,109,69,143 160 | 159,Lilamon,Ultimate,Data,Plant,12,2,1280,148,69,104,168,114 161 | 160,Rapidmon,Ultimate,Vaccine,Electric,12,2,1180,113,114,109,119,143 162 | 161,Lillymon,Ultimate,Data,Plant,12,2,890,153,74,94,163,158 163 | 162,Lucemon FM,Ultimate,Virus,Neutral,22,1,1390,139,163,114,203,139 164 | 163,LadyDevimon,Ultimate,Virus,Dark,14,1,890,163,99,94,158,143 165 | 164,WereGarurumon,Ultimate,Vaccine,Earth,12,2,1430,89,178,89,79,153 166 | 165,WereGarurumon (Blk),Ultimate,Virus,Earth,12,2,1480,79,183,104,69,148 167 | 166,Wisemon,Ultimate,Virus,Dark,12,2,790,168,69,84,198,133 168 | 167,Alphamon,Mega,Vaccine,Neutral,22,1,1390,128,158,183,158,130 169 | 168,UlforceVeedramon,Mega,Vaccine,Wind,22,1,1680,129,188,109,104,198 170 | 169,Ebemon,Mega,Virus,Electric,16,3,1230,178,74,114,198,129 171 | 170,Imperialdramon DM,Mega,Free,Fire,20,2,1730,143,139,139,139,148 172 | 171,Imperialdramon FM,Mega,Free,Neutral,20,2,1780,114,198,124,114,153 173 | 172,Vikemon,Mega,Free,Water,18,3,1780,105,158,143,129,133 174 | 173,VenomMyotismon,Mega,Virus,Dark,20,2,1540,120,193,104,148,138 175 | 174,WarGreymon,Mega,Vaccine,Fire,20,2,1630,98,193,163,99,140 176 | 175,Examon,Mega,Data,Wind,22,1,1630,148,174,129,129,153 177 | 176,Ophanimon,Mega,Vaccine,Light,20,2,840,183,104,164,193,153 178 | 177,Gaiomon,Mega,Virus,Fire,18,3,1630,99,203,129,94,158 179 | 178,ChaosGallantmon,Mega,Virus,Dark,22,1,1340,139,178,139,163,144 180 | 179,Gankoomon,Mega,Data,Fire,22,1,2080,90,188,163,109,138 181 | 180,Kuzuhamon,Mega,Data,Dark,18,3,1380,163,84,129,193,139 182 | 181,GranKuwagamon,Mega,Virus,Plant,18,3,1530,88,178,178,89,140 183 | 182,GroundLocomon,Mega,Data,Electric,18,3,1140,114,144,213,133,128 184 | 183,Craniamon,Mega,Vaccine,Earth,22,1,1630,143,124,208,134,124 185 | 184,Kerpymon (Good),Mega,Vaccine,Light,20,1,1290,188,94,104,208,158 186 | 185,SaberLeomon,Mega,Data,Wind,18,3,1680,99,228,104,84,163 187 | 186,Sakuyamon,Mega,Data,Light,18,3,990,178,94,114,188,173 188 | 187,Jesmon,Mega,Data,Neutral,22,1,1480,119,198,149,114,168 189 | 188,ShineGreymon,Mega,Vaccine,Light,20,2,1880,114,203,109,84,158 190 | 189,Justimon,Mega,Vaccine,Light,18,3,1530,99,193,158,99,144 191 | 190,Kentaurosmon,Mega,Vaccine,Light,22,1,1140,153,139,154,154,183 192 | 191,Seraphimon,Mega,Vaccine,Light,20,2,1480,162,94,144,198,135 193 | 192,MegaGargomon,Mega,Vaccine,Electric,18,3,1430,132,149,139,119,144 194 | 193,TigerVespamon,Mega,Virus,Electric,18,3,1630,104,193,114,99,173 195 | 194,Titamon,Mega,Virus,Earth,18,3,1930,99,183,128,114,129 196 | 195,Dianamon,Mega,Data,Water,20,1,790,178,89,154,198,183 197 | 196,Diaboromon,Mega,Free,Dark,20,2,1680,114,243,104,79,173 198 | 197,Creepymon,Mega,Virus,Dark,22,1,1440,133,183,114,183,140 199 | 198,Gallantmon,Mega,Virus,Light,22,1,1480,148,149,154,149,148 200 | 199,Dynasmon,Mega,Data,Wind,22,1,1680,114,213,129,94,178 201 | 200,Leopardmon,Mega,Data,Light,22,1,990,188,124,114,183,188 202 | 201,Leopardmon LM,Mega,Data,Earth,25,1,1290,153,159,129,139,218 203 | 202,HiAndromon,Mega,Vaccine,Electric,18,3,1190,114,153,178,138,124 204 | 203,Barbamon,Mega,Virus,Dark,22,1,1330,184,84,129,233,133 205 | 204,BanchoLeomon,Mega,Vaccine,Earth,18,3,1630,84,193,188,80,138 206 | 205,Piedmon,Mega,Virus,Dark,18,3,890,178,129,104,183,163 207 | 206,Puppetmon,Mega,Virus,Plant,18,3,1140,114,163,163,148,124 208 | 207,PlatinumNumemon,Mega,Virus,Neutral,16,3,1830,132,94,178,109,120 209 | 208,BlackWarGreymon,Mega,Virus,Fire,20,2,1730,93,183,178,89,140 210 | 209,PrinceMamemon,Mega,Data,Neutral,16,3,1630,137,104,173,109,130 211 | 210,Plesiomon,Mega,Data,Water,18,3,1680,153,74,114,188,129 212 | 211,HerculesKabuterimon,Mega,Vaccine,Plant,18,3,1680,128,114,168,124,124 213 | 212,Beelzemon,Mega,Virus,Dark,22,1,1680,114,228,119,99,168 214 | 213,Belphemon SM,Mega,Virus,Dark,22,1,1730,178,89,114,203,139 215 | 214,Hououmon,Mega,Vaccine,Fire,18,3,1390,173,84,99,193,158 216 | 215,Magnadramon,Mega,Vaccine,Light,20,2,1880,168,89,124,183,129 217 | 216,Boltmon,Mega,Data,Electric,18,3,1580,83,198,163,84,140 218 | 217,Mastemon,Mega,Vaccine,Neutral,22,1,1340,144,173,134,173,149 219 | 218,MarineAngemon,Mega,Vaccine,Water,18,3,1190,198,64,89,203,153 220 | 219,Minervamon,Mega,Virus,Neutral,20,1,1580,114,208,114,119,168 221 | 220,MirageGaogamon,Mega,Data,Wind,18,3,1480,114,183,114,109,178 222 | 221,Machinedramon,Mega,Virus,Electric,18,3,1240,114,173,183,128,124 223 | 222,MetalEtemon,Mega,Virus,Earth,18,3,1630,128,134,188,89,124 224 | 223,MetalGarurumon,Mega,Data,Water,18,3,1140,143,154,129,129,178 225 | 224,MetalGarurumon (Blk),Mega,Virus,Electric,18,3,1190,128,163,173,133,130 226 | 225,MetalSeadramon,Mega,Data,Water,18,3,1430,148,99,139,168,129 227 | 226,RustTyranomon,Mega,Virus,Electric,18,3,1680,83,218,163,74,140 228 | 227,Leviamon,Mega,Virus,Water,22,1,1730,120,168,158,144,133 229 | 228,Lilithmon,Mega,Virus,Dark,22,1,940,203,99,104,223,173 230 | 229,Ravemon,Mega,Vaccine,Wind,18,3,1040,143,139,119,139,203 231 | 230,Crusadermon,Mega,Virus,Dark,22,1,1240,153,144,139,144,193 232 | 231,Rosemon,Mega,Data,Plant,18,3,1330,147,144,129,149,144 233 | 232,Lotosmon,Mega,Data,Plant,18,3,940,188,74,109,213,168 234 | 233,Imperialdramon PM,Ultra,Vaccine,Light,25,1,1530,158,154,154,154,153 235 | 234,Omnimon,Ultra,Vaccine,Light,25,1,1680,104,208,168,134,144 236 | 235,Omnimon Zwart,Ultra,Vaccine,Dark,25,1,1490,139,153,193,158,134 237 | 236,Belphemon RM,Ultra,Virus,Dark,25,0,1780,84,247,168,109,140 238 | 237,Lucemon SM,Ultra,Virus,Dark,25,0,1490,173,89,124,233,158 239 | 238,Flamedramon,Armor,Free,Fire,8,3,1130,93,119,99,89,138 240 | 239,Magnamon,Armor,Free,Earth,22,2,1240,124,168,208,148,124 241 | 240,Rapidmon (Armor),Armor,Vaccine,Light,18,3,1140,114,158,178,158,124 242 | 241,Kerpymon (Blk),Mega,Virus,Dark,20,1,1290,188,94,94,223,153 243 | 242,Beelzemon BM,Mega,Virus,Dark,25,1,1680,114,238,124,104,178 244 | 243,Darkdramon,Mega,Virus,Electric,18,3,1580,94,188,148,99,139 245 | 244,Chaosmon,Ultra,Vaccine,Neutral,25,2,1080,129,318,94,89,188 246 | 245,Valkyrimon,Mega,Free,Wind,18,3,1330,139,148,129,129,168 247 | 246,ShineGreymon BM,Mega,Vaccine,Fire,22,2,1980,114,228,104,84,168 248 | 247,MirageGaogamon BM,Mega,Data,Light,20,2,1440,124,178,104,158,174 249 | 248,Ravemon BM,Mega,Vaccine,Wind,20,2,1040,133,149,139,144,213 250 | 249,Rosemon BM,Mega,Data,Plant,20,2,1480,143,149,139,159,143 251 | -------------------------------------------------------------------------------- /dataframe_sql/data/DigiDB_movelist.csv: -------------------------------------------------------------------------------- 1 | Move,SP Cost,Type,Power,Attribute,Inheritable,Description 2 | Wolkenapalm I,3,Physical,65,Fire,Yes,"Physical attack, 65 Fire damage to one foe. 95% accuracy." 3 | Wolkenapalm II,6,Physical,85,Fire,Yes,"Physical attack, 85 Fire damage to one foe. 95% accuracy." 4 | Wolkenapalm III,9,Physical,105,Fire,Yes,"Physical attack, 105 Fire damage to one foe. 95% accuracy." 5 | Burst Flame I,3,Magic,55,Fire,Yes,"Magic attack, 55 Fire damage to one foe. 95% accuracy." 6 | Burst Flame II,6,Magic,75,Fire,Yes,"Magic attack, 75 Fire damage to one foe. 95% accuracy." 7 | Burst Flame III,9,Magic,95,Fire,Yes,"Magic attack, 95 Fire damage to one foe. 95% accuracy." 8 | Meteor Fall I,4,Physical,30,Fire,Yes,"Physical attack, 30 Fire damage to all foes. 95% accuracy." 9 | Meteor Fall II,7,Physical,45,Fire,Yes,"Physical attack, 45 Fire damage to all foes. 95% accuracy." 10 | Meteor Fall III,10,Physical,75,Fire,Yes,"Physical attack, 75 Fire damage to all foes. 95% accuracy." 11 | Panic Wisp,10,Magic,30,Fire,Yes,"Magic attack, 30 Fire damage to one foe. Inflicts Panic status effect." 12 | Ice Archery I,3,Physical,65,Water,Yes,"Physical attack, 65 Water damage to one foe. 95% accuracy." 13 | Ice Archery II,6,Physical,85,Water,Yes,"Physical attack, 85 Water damage to one foe. 95% accuracy." 14 | Ice Archery III,9,Physical,105,Water,Yes,"Physical attack, 105 Water damage to one foe. 95% accuracy." 15 | Hydro Water I,3,Magic,55,Water,Yes,"Magic attack, 55 Water damage to one foe. 95% accuracy." 16 | Hydro Water II,6,Magic,75,Water,Yes,"Magic attack, 75 Water damage to one foe. 95% accuracy." 17 | Hydro Water III,9,Magic,95,Water,Yes,"Magic attack, 95 Water damage to one foe. 95% accuracy." 18 | Ocean Wave I,4,Magic,20,Water,Yes,"Magic attack, 20 Water damage to all foes. 95% accuracy." 19 | Ocean Wave II,7,Magic,35,Water,Yes,"Magic attack, 35 Water damage to all foes. 95% accuracy." 20 | Ocean Wave III,10,Magic,65,Water,Yes,"Magic attack, 65 Water damage to all foes. 95% accuracy." 21 | Idle Bubble,10,Magic,30,Water,Yes,"Magic attack, 30 Water damage to one foe. Inflicts Sleep status effect." 22 | Crescent Leaf I,3,Physical,65,Plant,Yes,"Physical attack, 65 Plant damage to one foe. 95% accuracy." 23 | Crescent Leaf II,6,Physical,85,Plant,Yes,"Physical attack, 85 Plant damage to one foe. 95% accuracy." 24 | Crescent Leaf III,9,Physical,105,Plant,Yes,"Physical attack, 105 Plant damage to one foe. 95% accuracy." 25 | Gaia Element I,3,Magic,55,Plant,Yes,"Magic attack, 55 Plant damage to one foe. 95% accuracy." 26 | Gaia Element II,6,Magic,75,Plant,Yes,"Magic attack, 75 Plant damage to one foe. 95% accuracy." 27 | Gaia Element III,9,Magic,95,Plant,Yes,"Magic attack, 95 Plant damage to one foe. 95% accuracy." 28 | Rune Forest I,4,Magic,20,Plant,Yes,"Magic attack, 20 Plant damage to all foes. 95% accuracy." 29 | Rune Forest II,7,Magic,35,Plant,Yes,"Magic attack, 35 Plant damage to all foes. 95% accuracy." 30 | Rune Forest III,10,Magic,65,Plant,Yes,"Magic attack, 65 Plant damage to all foes. 95% accuracy." 31 | Venom Trap,10,Physical,40,Plant,Yes,"Physical attack, 40 Plant damage to one foe. Inflicts Poison status effect." 32 | Nanomachine Break I,3,Physical,65,Thunder,Yes,"Physical attack, 65 Thunder damage to one foe. 95% accuracy." 33 | Nanomachine Break II,6,Physical,85,Thunder,Yes,"Physical attack, 85 Thunder damage to one foe. 95% accuracy." 34 | Nanomachine Break III,9,Physical,105,Thunder,Yes,"Physical attack, 105 Thunder damage to one foe. 95% accuracy." 35 | Heaven's Thunder I,3,Magic,55,Thunder,Yes,"Magic attack, 55 Thunder damage to one foe. 95% accuracy." 36 | Heaven's Thunder II,6,Magic,75,Thunder,Yes,"Magic attack, 75 Thunder damage to one foe. 95% accuracy." 37 | Heaven's Thunder III,9,Magic,95,Thunder,Yes,"Magic attack, 95 Thunder damage to one foe. 95% accuracy." 38 | Thunder Fall I,4,Physical,30,Thunder,Yes,"Physical attack, 30 Thunder damage to all foes. 95% accuracy." 39 | Thunder Fall II,7,Physical,45,Thunder,Yes,"Physical attack, 45 Thunder damage to all foes. 95% accuracy." 40 | Thunder Fall III,10,Physical,75,Thunder,Yes,"Physical attack, 75 Thunder damage to all foes. 95% accuracy." 41 | Ripping Net,10,Physical,40,Thunder,Yes,"Physical attack, 40 Thunder damage to one foe. Inflicts Paralyze status effect." 42 | Comet Hammer I,3,Physical,65,Earth,Yes,"Physical attack, 65 Earth damage to one foe. 95% accuracy." 43 | Comet Hammer II,6,Physical,85,Earth,Yes,"Physical attack, 85 Earth damage to one foe. 95% accuracy." 44 | Comet Hammer III,9,Physical,105,Earth,Yes,"Physical attack, 105 Earth damage to one foe. 95% accuracy." 45 | Grand Rock I,3,Magic,55,Earth,Yes,"Magic attack, 55 Earth damage to one foe. 95% accuracy." 46 | Grand Rock II,6,Magic,75,Earth,Yes,"Magic attack, 75 Earth damage to one foe. 95% accuracy." 47 | Grand Rock III,9,Magic,95,Earth,Yes,"Magic attack, 95 Earth damage to one foe. 95% accuracy." 48 | Awesome Quake I,4,Physical,30,Earth,Yes,"Physical attack, 30 Earth damage to all foes. 95% accuracy." 49 | Awesome Quake II,7,Physical,45,Earth,Yes,"Physical attack, 45 Earth damage to all foes. 95% accuracy." 50 | Awesome Quake III,10,Physical,75,Earth,Yes,"Physical attack, 75 Earth damage to all foes. 95% accuracy." 51 | Shock,10,Physical,40,Earth,Yes,"Physical attack, 40 Earth damage to one foe. Inflicts Stun status effect." 52 | Wind Claw I,3,Physical,65,Wind,Yes,"Physical attack, 65 Wind damage to one foe. 95% accuracy." 53 | Wind Claw II,6,Physical,85,Wind,Yes,"Physical attack, 85 Wind damage to one foe. 95% accuracy." 54 | Wind Claw III,9,Physical,105,Wind,Yes,"Physical attack, 105 Wind damage to one foe. 95% accuracy." 55 | Sonic Void I,3,Magic,55,Wind,Yes,"Magic attack, 55 Wind damage to one foe. 95% accuracy." 56 | Sonic Void II,6,Magic,75,Wind,Yes,"Magic attack, 75 Wind damage to one foe. 95% accuracy." 57 | Sonic Void III,9,Magic,95,Wind,Yes,"Magic attack, 95 Wind damage to one foe. 95% accuracy." 58 | Gale Storm I,4,Physical,30,Wind,Yes,"Physical attack, 30 Wind damage to all foes. 95% accuracy." 59 | Gale Storm II,7,Physical,45,Wind,Yes,"Physical attack, 45 Wind damage to all foes. 95% accuracy." 60 | Gale Storm III,10,Physical,75,Wind,Yes,"Physical attack, 75 Wind damage to all foes. 95% accuracy." 61 | Texture Blow,10,Physical,40,Wind,Yes,"Physical attack, 40 Wind damage to one foe. Inflicts Dot status effect." 62 | Saint Knuckle I,3,Physical,65,Light,Yes,"Physical attack, 65 Light damage to one foe. 95% accuracy." 63 | Saint Knuckle II,6,Physical,85,Light,Yes,"Physical attack, 85 Light damage to one foe. 95% accuracy." 64 | Saint Knuckle III,9,Physical,105,Light,Yes,"Physical attack, 105 Light damage to one foe. 95% accuracy." 65 | Holy Light I,3,Magic,55,Light,Yes,"Magic attack, 55 Light damage to one foe. 95% accuracy." 66 | Holy Light II,6,Magic,75,Light,Yes,"Magic attack, 75 Light damage to one foe. 95% accuracy." 67 | Holy Light III,9,Magic,95,Light,Yes,"Magic attack, 95 Light damage to one foe. 95% accuracy." 68 | Shining Laser I,4,Magic,20,Light,Yes,"Magic attack, 20 Light damage to all foes. 95% accuracy." 69 | Shining Laser II,7,Magic,35,Light,Yes,"Magic attack, 35 Light damage to all foes. 95% accuracy." 70 | Shining Laser III,10,Magic,65,Light,Yes,"Magic attack, 65 Light damage to all foes. 95% accuracy." 71 | Support End,10,Magic,30,Light,Yes,"Magic attack, 30 Light damage to one foe. Prevents the use of support skills." 72 | Destruction Cannon I,3,Physical,65,Dark,Yes,"Physical attack, 65 Dark damage to one foe. 95% accuracy." 73 | Destruction Cannon II,6,Physical,85,Dark,Yes,"Physical attack, 85 Dark damage to one foe. 95% accuracy." 74 | Destruction Cannon III,9,Physical,105,Dark,Yes,"Physical attack, 105 Dark damage to one foe. 95% accuracy." 75 | Nightmare I,3,Magic,55,Dark,Yes,"Magic attack, 55 Dark damage to one foe. 95% accuracy." 76 | Nightmare II,6,Magic,75,Dark,Yes,"Magic attack, 75 Dark damage to one foe. 95% accuracy." 77 | Nightmare III,9,Magic,95,Dark,Yes,"Magic attack, 95 Dark damage to one foe. 95% accuracy." 78 | Hell Crusher I,4,Magic,20,Dark,Yes,"Magic attack, 20 Dark damage to all foes. 95% accuracy." 79 | Hell Crusher II,7,Magic,35,Dark,Yes,"Magic attack, 35 Dark damage to all foes. 95% accuracy." 80 | Hell Crusher III,10,Magic,65,Dark,Yes,"Magic attack, 65 Dark damage to all foes. 95% accuracy." 81 | Destruction,10,Physical,40,Dark,Yes,"Physical attack, 40 Dark damage to one foe. 10% chance to inflict Death." 82 | Heavy Strike I,3,Physical,70,Neutral,Yes,"Physical attack, 70 Neutral damage to one foe. 95% accuracy." 83 | Heavy Strike II,6,Physical,90,Neutral,Yes,"Physical attack, 90 Neutral damage to one foe. 95% accuracy." 84 | Heavy Strike III,9,Physical,110,Neutral,Yes,"Physical attack, 110 Neutral damage to one foe. 95% accuracy." 85 | Power Energy I,3,Magic,60,Neutral,Yes,"Magic attack, 60 Neutral damage to one foe. 95% accuracy." 86 | Power Energy II,6,Magic,80,Neutral,Yes,"Magic attack, 80 Neutral damage to one foe. 95% accuracy." 87 | Power Energy III,9,Magic,100,Neutral,Yes,"Magic attack, 100 Neutral damage to one foe. 95% accuracy." 88 | Mach Rush I,4,Physical,35,Neutral,Yes,"Physical attack, 35 Neutral damage to all foes. 95% accuracy." 89 | Mach Rush II,7,Physical,50,Neutral,Yes,"Physical attack, 50 Neutral damage to all foes. 95% accuracy." 90 | Mach Rush III,10,Physical,80,Neutral,Yes,"Physical attack, 80 Neutral damage to all foes. 95% accuracy." 91 | Physical Drain,3,Physical,50,Neutral,Yes,"Physical attack, 50 Neutral damage to one foe. Absorb 10% SP." 92 | Spirit Drain,3,Magic,40,Neutral,Yes,"Magic attack, 40 Neutral damage to one foe. Absorb 10% SP." 93 | Character Reversal,10,Magic,30,Neutral,Yes,"Magic attack, 30 Neutral damage to one foe. Inflicts Bug status effect." 94 | Heal,4,Support,0,Neutral,Yes,Restores a little HP for one party member. 95 | X-Heal,8,Support,0,Neutral,Yes,Restores HP for one party member. 96 | Final Heal,16,Support,0,Neutral,Yes,Restores a lot of HP for one party member. 97 | Aura,10,Support,0,Neutral,Yes,Restores a little HP for all party members. 98 | X-Aura,25,Support,0,Neutral,Yes,Restores HP for all party members. 99 | Final Aura,40,Support,0,Neutral,Yes,Restores a lot of HP for all party members. 100 | Revive,30,Support,0,Neutral,Yes,Revive one fallen party member with 50% HP. 101 | Perfect Revival,60,Support,0,Neutral,Yes,Revive all fallen party members with full HP. 102 | Anti-Poison,4,Support,0,Neutral,Yes,Recover Poison from one party member and restore some HP. 103 | Anti-Panic,4,Support,0,Neutral,Yes,Recover Panic from one party member and restore some HP. 104 | Anti-Paralysis,4,Support,0,Neutral,Yes,Recover Paralyze from one party member and restore some HP. 105 | Anti-Sleep,4,Support,0,Neutral,Yes,Recover Sleep from one party member and restore some HP. 106 | Anti-Stun,4,Support,0,Neutral,Yes,Recover Stun from one party member and restore some HP. 107 | Anti-Dot,4,Support,0,Neutral,Yes,Recover Dot from one party member and restore some HP. 108 | Anti-Bug,4,Support,0,Neutral,Yes,Recover Bug from one party member and restore some HP. 109 | Restore,8,Support,0,Neutral,Yes,Remove all status effects from one party member and restore some HP. 110 | Dispel,8,Support,0,Neutral,Yes,Remove basic debuffs from one party member and restore some HP. 111 | Attack Charge,6,Support,0,Neutral,Yes,Increases ATK of one member by 10%. 112 | Attack Charge Field,20,Support,0,Neutral,Yes,Increases ATK of all battle members by 10%. 113 | Guard Charge,6,Support,0,Neutral,Yes,Increases DEF of one member by 10%. 114 | Guard Charge Field,20,Support,0,Neutral,Yes,Increases DEF of all battle members by 10%. 115 | Mental Charge,6,Support,0,Neutral,Yes,Increases INT of one member by 10%. 116 | Mental Charge Field,20,Support,0,Neutral,Yes,Increases INT of all battle members by 10%. 117 | Speed Charge,6,Support,0,Neutral,Yes,Increases SPD of one member by 10%. 118 | Speed Charge Field,20,Support,0,Neutral,Yes,Increases SPD of all battle members by 10%. 119 | Hit Charge,6,Support,0,Neutral,Yes,Increases ACC of one battle member by 10%. 120 | Agility Charge,6,Support,0,Neutral,Yes,Increases EVA of one battle member by 10%. 121 | Critical Charge,6,Support,0,Neutral,Yes,Increases CRIT of one battle member by 10%. 122 | Attack Break,6,Support,0,Neutral,Yes,Reduces ATK of one enemy by 10%. 123 | Attack Break Field,20,Support,0,Neutral,Yes,Reduces ATK of all enemies by 10%. 124 | Guard Break,6,Support,0,Neutral,Yes,Reduces DEF of one enemy by 10%. 125 | Guard Break Field,20,Support,0,Neutral,Yes,Reduces DEF of all enemies by 10%. 126 | Mental Break,6,Support,0,Neutral,Yes,Reduces INT of one enemy by 10%. 127 | Mental Break Field,20,Support,0,Neutral,Yes,Reduces INT of all enemies by 10%. 128 | Speed Break,6,Support,0,Neutral,Yes,Reduces SPD of one enemy by 10%. 129 | Speed Break Field,20,Support,0,Neutral,Yes,Reduces SPD of all enemies by 10%. 130 | Acceleration Boost,6,Support,0,Neutral,Yes,Doubles damage output in the next turn. 131 | Cross-Counter,6,Support,0,Neutral,Yes,Counterattacks the enemy when you receive a physical attack. 132 | Mirror Reflection,6,Support,0,Neutral,Yes,Counterattacks the enemy when you receive a magic attack. 133 | Status Barrier,16,Support,0,Neutral,Yes,Make one member immune to all status effects. 134 | Safety Guard,32,Support,0,Neutral,Yes,Make one member endure all attacks that could kill you once. 135 | Chain Plus,4,Support,0,Neutral,Yes,Increase COMBO for one member by 50%. 136 | Chain Max,8,Support,0,Neutral,Yes,Increase COMBO for one member by 100%. 137 | Chain Minus,4,Support,0,Neutral,Yes,Reduce COMBO for one enemy by 50%. 138 | Chain Loss,8,Support,0,Neutral,Yes,Reduce COMBO for one enemy by 100%. 139 | Escape Dash,0,Support,0,Neutral,Yes,Flee from a battle. 140 | Bubbles,2,Magic,30,Water,No,"Magic attack, 30 Water damage to one foe. 90% accuracy." 141 | Pepper Breath,5,Physical,70,Fire,No,"Physical attack, 70 Fire damage to one foe." 142 | Spitfire Blast,5,Physical,35,Fire,No,"Physical attack, 35 Fire damage to all foes. 10% chance of increasing ATK by 10%." 143 | Diamond Shell,5,Physical,60,Earth,No,"Physical attack, 60 Earth damage to one foe. 10% chance of increasing DEF by 10%." 144 | Summon,5,Fixed,0,Neutral,No,Fixed damage of 100 to one foe. 30% chance of increasing INT by 10%. 145 | Thunder Cloud,5,Magic,30,Electric,No,"2 magic attacks, 30 Electric damage to one foe." 146 | Lullaby Bubble,5,Magic,55,Water,No,"Magic attack, 55 Water damage to one foe. 10% chance of putting target to sleep." 147 | Double Backhand,5,Physical,20,Neutral,No,"2 physical attacks, 20 Neutral damage to all foes." 148 | Electric Stun Blast,5,Physical,65,Electric,No,"Physical attack, 65 Electric damage to one foe. 15% chance of paralyzing target." 149 | Blue Blaster,5,Physical,65,Fire,No,"Physical attack, 65 Fire damage to one foe. 10% chance of reducing target's DEF by 10%." 150 | Little Horn,5,Physical,70,Neutral,No,"Physical attack, 70 Neutral damage to one foe. 10% chance of reducing target's DEF by 10%." 151 | Rock Breaker,5,Physical,70,Earth,No,"Physical attack, 70 Earth damage to one foe." 152 | Blinding Ray,5,Magic,65,Light,No,"Magic attack, 65 Light damage to one foe." 153 | Crazy Giggle,5,Physical,75,Dark,No,"Physical attack, 75 Dark damage to one foe." 154 | Rock Fist,5,Physical,65,Earth,No,"Physical attack, 65 Earth damage to one foe. 10% chance of increasing DEF by 10%." 155 | Goblin Strike,5,Physical,65,Fire,No,"Physical attack, 65 Fire damage to one foe. 10% chance of stunning target." 156 | Marching Fishes,5,Physical,15,Water,No,"1-3 physical attacks, 15 Water damage to all foes." 157 | Black Pearl Blast,5,Magic,25,Water,No,"Magic attack, 25 Water damage to all foes." 158 | Shiny Ring,5,Physical,70,Dark,No,"Physical attack, 70 Dark damage to one foe. Alwatys hits." 159 | Terrier Tornado,5,Magic,20,Wind,No,"Magic attack, 20 Wind damage to all foes." 160 | Super Shocker,5,Magic,60,Electric,No,"Magic attack, 60 Electric damage to one foe." 161 | Plastic Blaze,5,Physical,60,Fire,No,"Physical attack, 60 Fire damage to one foe. 10% chance of reducing target's INT by 10%." 162 | Metal Cannon,5,Physical,70,Neutral,No,"Physical attack, 70 Neutral damage to one foe. 30% chance of increasing DEF by 10%." 163 | Cog Crusher,5,Physical,70,Dark,No,"Physical attack, 70 Dark damage to one foe. Always hits." 164 | Air Shot,5,Magic,50,Wind,No,"Magic attack, 50 Wind damage to one foe. 10% chance of increasing SPD by 10%." 165 | Fifth Rush,5,Physical,20,Earth,No,"5 physical attacks, 20 Earth damage to one foe. 80% accuracy." 166 | Poison Ivy,5,Physical,65,Plant,No,"Physical attack, 65 Plant damage to one foe. 10% chance of poisoning target." 167 | Demi Darts,5,Physical,20,Dark,No,"Physical attack, 20 Dark damage to all foes, absorbs 5% into HP." 168 | Spiral Twister,5,Magic,55,Fire,No,"Magic attack, 55 Fire damage to one foe. 10% chance of increasing INT by 10%." 169 | Ninja Blade,5,Physical,35,Wind,No,"Physical attack, 35 Wind damage to all foes." 170 | Veemon Headbutt,5,Physical,75,Neutral,No,"Physical attack, 75 Neutral damage to one foe." 171 | Puppy Howl,10,Magic,0,Light,No,"INT-penetrating attack, Light damage to one foe. 10% chance of paralyzing target." 172 | Electric Shock,5,Magic,55,Electric,No,"Magic attack, 55 Electric damage to one foe. 10% chance of paralyzing target." 173 | Feather Slash,10,Physical,0,Wind,No,"DEF-penetrating attack, Wind damage to one foe." 174 | Seed Blast,5,Physical,15,Plant,No,"2 physical attacks, 15 Plant damage to all foes." 175 | Grand Cross,30,Physical,0,Light,No,"INT-penetrating attack, Light damage to all foes." 176 | Diamond Storm,5,Magic,25,Plant,No,"Magic attack, 25 Plant damage to all foes." 177 | Blazing Ice,5,Magic,60,Water,No,"Magic attack, 60 Water damage to one foe." 178 | Sticky Net,5,Physical,65,Plant,No,"Physical attack, 65 Plant damage to one foe. 30% chance of reducing target's SPD by 10%." 179 | Frozen Claw,20,Physical,0,Water,No,"DEF-penetrating attack, Water damage to one foe." 180 | Glide Horn,10,Physical,85,Wind,No,"Physical attack, 85 Wind damage to one foe. 15% chance of stunning target." 181 | Tail Hammer,10,Physical,85,Earth,No,"Physical attack, 85 Earth damage to one foe. 15% chance of stunning target." 182 | Harpoon Torpedo,10,Physical,90,Fire,No,"Physical attack, 90 Fire damage to one foe. Always hits." 183 | Thunder Cloud II,10,Magic,75,Electric,No,"Magic attack, 75 Electric damage to one foe. 10% chance of paralyzing target." 184 | Branch Drain,10,Physical,75,Plant,No,"Physical attack, 75 Plant damage to one foe, absorbs 20% into HP." 185 | Vee Laser,10,Physical,95,Light,No,"Physical attack, 95 Light damage to one foe." 186 | Heaven's Knuckle,10,Physical,80,Light,No,"Physical attack, 80 Light damage to one foe. 10% chance of increasing ATK & INT by 10%." 187 | Pummel Whack,10,Physical,90,Dark,No,"Physical attack, 90 Dark damage to one foe." 188 | D-Grenade,10,Physical,40,Fire,No,"Physical attack, 40 Fire damage to all foes. Always hits." 189 | Spiral Blow,10,Physical,90,Wind,No,"Physical attack, 90 Wind damage to one foe." 190 | Electro Shocker,10,Magic,80,Electric,No,"Magic attack, 80 Electric damage to one foe." 191 | Mature Poop,10,Physical,75,Earth,No,"Physical attack, 75 Earth damage to one foe. 30% chance of reducing target's INT by 10%." 192 | Dumdum Uppercut,10,Physical,90,Neutral,No,"Physical attack, 90 Neutral damage to one foe. 10% chance of stunning target." 193 | Fox Fire,10,Physical,85,Fire,No,"Physical attack, 85 Fire damage to one foe. 10% chance of increasing SPD by 10%." 194 | Freeze Fang,10,Physical,85,Water,No,"Physical attack, 85 Water damage to one foe. 10% chance of increasing SPD by 10%." 195 | Will-o'-Wisp,10,Magic,30,Fire,No,"Magic attack, 30 Fire damage to all foes." 196 | Exhaust Flame,10,Physical,85,Fire,No,"Physical attack, 85 Fire damage to one foe. 10% chance of increasing ATK by 10%." 197 | Data Crusher,10,Physical,90,Dark,No,"Physical attack, 90 Dark damage to one foe. 5% chance of instantly killing target." 198 | Mega Flame,10,Physical,95,Fire,No,"Physical attack, 95 Fire damage to one foe." 199 | Bit Fire,10,Physical,30,Fire,No,"3 physical attacks, 30 Fire damage to one foe." 200 | Chrono Breaker,10,Fixed,0,Neutral,No,Fixed damage of 150 to one foe. 30% chance of reducing target's SPD by 10%. 201 | Scissor Claw,20,Physical,0,Neutral,No,"DEF-penetrating attack, Neutral damage to one foe." 202 | Symphony Crusher,20,Magic,0,Neutral,No,"INT-penetrating attack, Neutral damage to one foe." 203 | Hyper Smell,10,Physical,70,Earth,No,"Physical attack, 70 Earth damage to one foe. 15% chance of confusing or paralyzing." 204 | Golden Rush,10,Physical,10,Light,No,"2 physical attacks, 10 Light damage to all foes. 1% chance of instantly killing target." 205 | Hyper Heat,10,Physical,85,Fire,No,"Physical attack, 85 Fire damage to one foe. 10% chance of reducing target's DEF by 10%." 206 | Sunshine Beam,10,Magic,80,Light,No,"Magic attack, 80 Light damage to one foe." 207 | Ice Blast,10,Magic,75,Water,No,"Magic attack, 75 Water damage to one foe. 10% chance of reducing target's SPD by 10%." 208 | Mega Burst,10,Physical,45,Fire,No,"Physical attack, 45 Fire damage to all foes." 209 | Poop,10,Physical,75,Earth,No,"Physical attack, 75 Earth damage to one foe. 30% chance of reducing target's SPD by 10%." 210 | Meteor Shower,10,Physical,40,Neutral,No,"Physical attack, 40 Neutral damage to all foes. 90% accuracy. Tends to critical more often." 211 | Spiking Strike,20,Physical,0,Plant,No,"DEF-penetrating attack, Plant damage to one foe. Tends to critical more often." 212 | Crystal Cloud,10,Magic,30,Water,No,"Magic attack, 30 Water damage to all foes." 213 | Hyper Cannon,10,Physical,200,Fire,No,"Physical attack, 200 Fire damage to one foe. Cannot move from recoil for one turn." 214 | Fire Breath,10,Physical,90,Fire,No,"Physical attack, 90 Fire damage to one foe. Tends to critical more often." 215 | Lightning Paw,10,Fixed,0,Neutral,No,Fixed damage of 150 to one foe. 60% chance of confusing target. 216 | Death Claw,10,Fixed,0,Neutral,No,Fixed damage of 200 to one foe. Absorbs 20% of the damage as HP. 217 | Needle Spray,10,Physical,40,Plant,No,"Physical attack, 40 Plant damage to all foes. 5% chance of paralyzing target." 218 | Power Metal,10,Physical,90,Neutral,No,"Physical attack, 90 Neutral damage to one foe. 30% chance of increasing attack by 10%." 219 | Poop Dunk,10,Physical,80,Earth,No,"Physical attack, 80 Earth damage to one foe. 30% chance of reducing target's DEF by 10%." 220 | Poop Toss,10,Physical,75,Earth,No,"Physical attack, 75 Earth damage to one foe. 30% chance of reducing target's ATK by 10%." 221 | Meteor Wing,10,Magic,25,Fire,No,"Magic attack, 25 Fire damage to all foes. 10% chance of increasing SPD by 10%." 222 | Death Charm,10,Direct,0,Neutral,No,Reduce 10% HP from one enemy. 223 | V-Nova Blast,10,Physical,105,Fire,No,"Physical attack, 105 Fire damage to one foe. After use, receive 5% HP damage from recoil." 224 | Rare Metal Poop,10,Physical,80,Earth,No,"Physical attack, 80 Earth damage to one foe. Causes Knockback." 225 | Super Stinky Jet,10,Magic,20,Earth,No,"Magic attack, 20 Earth damage to all foes. 30% chance of reducing target's SPD by 10%." 226 | Kunai Wing,10,Physical,30,Wind,No,"3 physical attacks, 30 Wind damage to one foe." 227 | Burning Fist,10,Physical,80,Fire,No,"Physical attack, 80 Fire damage to one foe. 30% chance of increasing ATK by 10%." 228 | Sub-zero Ice Punch,10,Physical,80,Water,No,"Physical attack, 80 Water damage to one foe. 10% chance of stunning target." 229 | Fist of the Beast King,10,Physical,95,Earth,No,"Physical attack, 95 Earth damage to one foe." 230 | Razor Wind,10,Physical,30,Neutral,No,"2-4 physical attacks, 30 Neutral damage to one foe." 231 | Turbo Stinger,10,Physical,25,Electric,No,"4 physical attacks, 25 Electric damage to one foe." 232 | Horn Buster,30,Magic,0,Electric,No,"INT-penetrating attack, double Electric damage to one foe." 233 | Bunny Blades,15,Physical,55,Wind,No,"2 physical attacks, 55 Wind damage to one foe." 234 | Spiral Sword,15,Physical,110,Electric,No,"Physical attack, 110 Electric damage to one foe. Tends to critical more often." 235 | Galactic Flare,15,Magic,55,Neutral,No,"Magic attack, 55 Neutral damage to all foes." 236 | Spider Shooter,15,Physical,30,Fire,No,"4 physical attacks, 30 Fire damage to one foe. 5% chance of reducing target's DEF by 10%." 237 | Night Raid,15,Magic,65,Dark,No,"Magic attack, 65 Dark damage to all foes, absorbs 15% into HP." 238 | Dragon Impulse,15,Physical,115,Wind,No,"Physical attack, 115 Wind damage to one foe." 239 | Love Serenade,30,Magic,0,Dark,No,"INT-penetrating attack, Dark damage to all foes. 15% chance of paralyzing target." 240 | Celestial Arrow,15,Magic,100,Light,No,"Magic attack, 100 Light damage to one foe. Always hits." 241 | Double Scissor Claw,30,Physical,0,Neutral,No,"DEF-penetrating attack, double Neutral damage to one foe." 242 | Shadow Wing,15,Magic,65,Fire,No,"Magic attack, 65 Fire damage to all foes." 243 | Genocidal Gears,15,Physical,60,Fire,No,"Physical attack, 60 Fire damage to all foes." 244 | Nitro Stinger,30,Physical,0,Electric,No,"DEF-penetrating attack, double Electric damage to one foe." 245 | The King of Fists,15,Physical,55,Wind,No,"1-3 physical attacks, 55 Wind damage to one foe. 15% chance of stunning target." 246 | Desolation Claw,15,Physical,115,Neutral,No,"Physical attack, 115 Neutral damage to one foe. 10% chance of instantly killing target." 247 | Disaster Blaster,15,Magic,65,Light,No,"Magic attack, 65 Light damage to all foes." 248 | Cherry Bomb,15,Physical,65,Plant,No,"Physical attack, 65 Plant damage to all foes." 249 | Top Gun,15,Magic,110,Wind,No,"Magic attack, 110 Wind damage to one foe." 250 | Superstar Uppercut,15,Physical,110,Light,No,"Physical attack, 110 Light damage to one foe." 251 | Oblivion Bird,15,Physical,110,Fire,No,"Physical attack, 110 Fire damage to one foe. 30% chance of reducing target's DEF by 10%." 252 | Vulcan's Hammer,15,Physical,115,Electric,No,"Physical attack, 115 Electric damage to one foe." 253 | Talisman of Light,15,Magic,105,Dark,No,"Magic attack, 105 Dark damage to one foe." 254 | Wind Cutter Sword,15,Physical,40,Wind,No,"3 physical attacks, 40 Wind damage to one foe." 255 | Nightmare Syndrome,15,Magic,0,Neutral,No,Reduce 15% HP from one enemy. 20% chance of putting target to sleep. 256 | Heavy Metal Fire,15,Physical,110,Fire,No,"Physical attack, 110 Fire damage to one foe. 30% chance of increasing DEF by 10%." 257 | Musical Fist,30,Magic,0,Neutral,No,"INT-penetrating attack, Neutral damage to all with 10% chance of reducing ATK/INT by 10%." 258 | Metal Meteor,15,Physical,115,Earth,No,"Physical attack, 115 Earth damage to one foe." 259 | Berserk Sword,15,Direct,0,Neutral,No,Inflict Death on one enemy. 30% accuracy. 260 | Digital Bomb,15,Magic,80,Fire,No,"Magic attack, 80 Fire damage to one foe. 5% chance of reducing base stats by 10%." 261 | Death Parade Blaster,15,Physical,40,Light,No,"2 physical attacks, 40 Light damage to all foes." 262 | Fist of Ice,15,Physical,110,Water,No,"Physical attack, 110 Water damage to one foe. 15% chance of stunning target." 263 | Trick or Treat,15,Physical,100,Neutral,No,"Physical attack, 100 Neutral damage to one foe. Decrease target's INT by 10%." 264 | Pit Bomb,15,Magic,105,Fire,No,"Magic attack, 105 Fire damage to one foe." 265 | Dark Pupil,15,Physical,110,Dark,No,"Physical attack, 110 Dark damage to one foe. 20% chance of poisoning target." 266 | Cold Flame,15,Physical,100,Fire,No,"Physical attack, 100 Fire damage to one foe. 10% chance of increasing INT by 10%." 267 | Unidentified Flying Kiss,15,Magic,95,Dark,No,"Magic attack, 95 Dark damage to one foe. 15% chance of dotting target." 268 | Tidal Wave,15,Magic,65,Water,No,"Magic attack, 65 Water damage to all foes." 269 | Heaven's Gate,15,Magic,100,Light,No,"Magic attack, 100 Light damage to one foe. 10% chance of instantly killing target." 270 | Winning Knuckle,15,Physical,115,Neutral,No,"Physical attack, 115 Neutral damage to one foe. 20% chance of stunning target." 271 | Smile Bomber,15,Physical,110,Fire,No,"Physical attack, 110 Fire damage to one foe. Always hits." 272 | Lightning Javelin,15,Magic,105,Electric,No,"Magic attack, 105 Electric damage to one foe." 273 | Genocide Attack,15,Physical,110,Fire,No,"Physical attack, 110 Fire damage to one foe. Tends to critical more often." 274 | Atomic Blaster,15,Physical,250,Electric,No,"Physical attack, 250 Electric damage to one foe. Cannot move from recoil for one turn." 275 | Giga Destroyer,15,Physical,115,Fire,No,"Physical attack, 115 Fire damage to one foe." 276 | Revenge Flame,15,Direct,0,Neutral,No,Counterattack the enemy when you receive a physical or magic attack. 277 | Nuclear Laser,30,Physical,0,Electric,No,"DEF-penetrating attack, Electric damage to one foe. 30% chance of increasing DEF by 10%." 278 | Energy Bomb,15,Magic,100,Electric,No,"Magic attack, 100 Electric damage to one foe. Always hits." 279 | Hearts Attack,30,Magic,0,Neutral,No,"INT-penetrating attack, Neutral damage to one foe. 20% chance of confusing target." 280 | Savage Emperor,15,Magic,105,Light,No,"Magic attack, 105 Light damage to one foe." 281 | Trident Revolver,15,Physical,40,Fire,No,"3 physical attacks, 40 Fire damage to one foe." 282 | Lila Shower,15,Magic,60,Plant,No,"Magic attack, 60 Plant damage to all foes. 20% chance of poisoning target." 283 | Golden Triangle I,15,Magic,90,Electric,No,"Magic attack, 90 Electric damage to one foe. 5% chance of increasing base stats by 10%." 284 | Flower Cannon,15,Magic,105,Plant,No,"Magic attack, 105 Plant damage to one foe." 285 | Dead or Alive,25,Magic,110,Neutral,No,"Magic attack, 110 Neutral damage to one foe. 10% to inflict a status effect, 5% chance of instantly killing target." 286 | Darkness Wave,15,Magic,35,Dark,No,"2 magic attacks, 35 Dark damage to all foes." 287 | Wolf Claw,15,Physical,120,Neutral,No,"Physical attack, 120 Neutral damage to one foe." 288 | Full Moon Kick,15,Physical,110,Earth,No,"Physical attack, 110 Earth damage to one foe. 30% chance of increasing SPD by 10%." 289 | Pandora Dialogue,15,Magic,0,Neutral,No,Reduces HP of all foes by 20%. Receive damage equal to 10% of HP from recoil. 290 | Blade of the Dragon King,25,Physical,30,Light,No,"3-6 physical attacks, 30 Light damage to one foe." 291 | The Ray of Victory,25,Physical,100,Light,No,"Physical attack, 100 Light damage to all. Always hits. 10% chance increasing SPD by 10%." 292 | Brain Rupture,20,Magic,115,Electric,No,"Magic attack, 115 Electric damage to one foe. 20% chance of confusing target." 293 | Megadeath,20,Magic,95,Dark,No,"Magic attack, 95 Dark damage to all foes." 294 | Positron Laser,20,Physical,150,Light,No,"Physical attack, 150 Light damage to one foe." 295 | Arctic Blizzard,20,Physical,125,Water,No,"Physical attack, 125 Water damage to one foe. 25% chance of stunning target." 296 | Venom Infusion,20,Physical,135,Dark,No,"Physical attack, 135 Dark damage to one foe. 30% chance of poisoning target." 297 | Terra Force,20,Physical,90,Fire,No,"Physical attack, 90 Fire damage to all foes. 30% chance of increasing ATK by 20%." 298 | Pendragon's Glory,25,Physical,135,Wind,No,"Physical attack, 135 Wind damage to one foe." 299 | Eden's Javelin,20,Magic,120,Light,No,"Magic attack, 120 Light damage to one foe. 30% chance of increasing INT by 20%." 300 | Will-O'-Wisp Slash,20,Physical,65,Fire,No,"2 physical attacks, 65 Fire damage to one foe." 301 | Demonic Disaster,25,Physical,140,Dark,No,"Physical attack, 140 Dark damage to one foe." 302 | Quake!Blast!Fire!Father!,25,Physical,35,Fire,No,"4 physical attacks, 35 Fire damage to one foe." 303 | Taizoukai Mandala,20,Magic,70,Dark,No,"Magic attack, 70 Dark damage to all foes. Cancel target's positive effects." 304 | Dimension Scissor,40,Physical,0,Plant,No,"DEF-penetrating attack, double Plant damage to one foe. Tends to critical more often." 305 | Destruction Crush,20,Magic,80,Earth,No,"Magic attack, 80 Earth damage to all foes." 306 | Waltz's End,25,Physical,30,Neutral,No,"3 physical attacks, 30 Neutral damage to all foes." 307 | Heaven's Judgment,20,Magic,90,Light,No,"Magic attack, 90 Light damage to all foes. Tends to critical more often." 308 | Howling Crusher,20,Physical,65,Earth,No,"2 physical attacks, 65 Earth damage to one foe." 309 | Amethyst Mandala,20,Magic,70,Light,No,"Magic attack, 70 Light damage to all foes. Cancel target's positive effects." 310 | Judgement of the Blade,25,Physical,30,Neutral,No,"5 physical attacks, 30 Neutral damage to one foe." 311 | GeoGrey Sword,20,Physical,130,Fire,No,"Physical attack, 130 Fire damage to one foe. Increases ATK by 10%." 312 | Justice Kick,20,Physical,130,Neutral,No,"Physical attack, 130 Neutral damage to one foe. 1% chance of increasing ATK by 50%." 313 | Bifrost,25,Magic,120,Light,No,"Magic attack, 120 Light damage to one foe. Increases SPD by 10%." 314 | Strike of the Seven Stars,20,Magic,15,Light,No,"7 magic attacks, 15 Light damage to all foes." 315 | Burst Shot,20,Physical,50,Fire,No,"2 physical attacks, 50 Fire damage to all foes." 316 | Mach Stinger V,20,Physical,20,Electric,No,"6 physical attacks, 20 Electric damage to one foe. Tends to critical more often." 317 | Soul Core Attack,40,Physical,0,Earth,No,"DEF-penetrating attack, double Earth damage to one foe." 318 | Good Night Moon,20,Magic,125,Light,No,"Magic attack, 125 Light damage to one foe. Puts target to sleep." 319 | Catastrophe Cannon,20,Physical,80,Fire,No,"3 physical attacks, 80 Fire damage to a foe. Cannot move from recoil for one turn." 320 | Flame Inferno,25,Magic,90,Fire,No,"Magic attack, 90 Fire damage to all foes." 321 | Lightning Joust,25,Physical,140,Light,No,"Physical attack, 140 Light damage to one foe. 30% chance of increasing DEF by 10%." 322 | Wyvern's Breath,25,Physical,110,Wind,No,"Physical attack, 110 Wind damage to all foes. Receive recoil damage equal to 20% of HP." 323 | Extinction Wave,25,Magic,80,Light,No,"Magic attack, 80 Light damage to all foes. Always hits." 324 | Vulcan Crusher,30,Physical,145,Earth,No,"Physical attack, 145 Earth damage to one foe. 35% chance of stunning target. 95% accuracy." 325 | Atomic Ray,20,Physical,125,Electric,No,"Physical attack, 125 Electric damage to one foe. 20% chance of stunning target." 326 | Pandemonium Lost,25,Magic,80,Dark,No,"Magic attack, 80 Dark damage to all foes, absorbs 20% into HP." 327 | Flashy Boss Punch,20,Physical,130,Light,No,"Physical attack, 130 Light damage to one foe. 50% chance of stunning target." 328 | Trump Sword,20,Magic,35,Neutral,No,"4 magic attacks, 35 Neutral damage to one foe." 329 | Puppet Pummel,20,Physical,125,Earth,No,"Physical attack, 125 Earth damage to one foe. 25% chance of stunning target." 330 | Platinum Junk,20,Physical,30,Earth,No,"4 physical attacks, 30 Earth damage to one foe. 30% chance of reducing target's ATK by 10%." 331 | Dark Terra Force,20,Physical,100,Dark,No,"Physical attack, 100 Dark damage to all foes. 30% chance of increasing DEF by 20%." 332 | Smile Warhead,20,Physical,130,Neutral,No,"Physical attack, 130 Neutral damage to one foe. 50% chance to cause knockback." 333 | Sorrow Blue,40,Magic,0,Water,No,"INT-penetrating attack, Water damage to all foes. 25% chance of putting target to sleep." 334 | Giga Blaster,20,Magic,120,Electric,No,"Magic attack, 120 Electric damage to one foe." 335 | Double Impact,25,Physical,20,Dark,No,"8 physical attacks, 20 Dark damage to one foe. 90% accuracy." 336 | Eternal Nightmare,50,Magic,0,Dark,No,"INT-penetrating attack, Dark damage to all foes. 50% chance of putting target to sleep." 337 | Starlight Explosion,20,Magic,80,Fire,No,"Magic attack, 80 Fire damage to all foes." 338 | Fire Tornado,20,Magic,80,Light,No,"Magic attack, 80 Light damage to all foes." 339 | Tomahawk Stinger,20,Physical,130,Neutral,No,"Physical attack, 130 Neutral damage to one foe. 15% chance of confusing target." 340 | Chaos Degradation,25,Direct,0,Neutral,No,Reduces HP of all foes by 25%. 341 | Ocean Love,20,Support,0,Neutral,No,Restore HP to all battle members and recover all status effects. 342 | Strike Roll,20,Physical,140,Neutral,No,"Physical attack, 140 Neutral damage to one foe. Tends to critical more often." 343 | Full Moon Blaster,20,Physical,135,Light,No,"Physical attack, 135 Light damage to one foe. Always hits." 344 | Infinity Cannon,20,Physical,115,Electric,No,"Physical attack, 115 Electric damage to all foes. 80% accuracy." 345 | Banana Slip,20,Magic,115,Dark,No,"Magic attack, 115 Dark damage to one foe. 80% chance of stunning target." 346 | Ice Wolf Claw,20,Physical,45,Water,No,"2 physical attacks, 45 Water damage to all foes." 347 | River of Power,20,Magic,120,Water,No,"Magic attack, 120 Water damage to one foe." 348 | Terrors Cluster,20,Physical,125,Electric,No,"Physical attack, 125 Electric damage to one foe. 25% chance of paralyzing target." 349 | Biting Crush,25,Physical,145,Neutral,No,"Physical attack, 145 Neutral damage to one foe. 15% chance of instantly killing target." 350 | Phantom Pain,50,Magic,0,Dark,No,"INT-penetrating attack, triple Dark damage to one foe. 35% chance of poisoning target." 351 | Celestial Blade,20,Magic,80,Electric,No,"Magic attack, 80 Electric damage to all foes." 352 | Spiral Masquerade,25,Physical,30,Dark,No,"4 physical attacks, 30 Dark damage to one foe. 30% chance of increasing SPD by 20%." 353 | Thorn Whip,20,Physical,120,Plant,No,"Physical attack, 120 Plant damage to one foe, absorbs 50% into HP. 15% chance of paralyzing target." 354 | Seven's Fantasia,20,Magic,75,Light,No,"Magic attack, 75 Light damage to all foes. 20% chance of confusing target." 355 | Lightning Spear,40,Magic,0,Electric,No,"INT-penetrating attack, double Electric damage to one foe. Tends to critical more often." 356 | Corona Destroyer,50,Physical,0,Dark,No,"DEF-penetrating attack, double Dark damage to one foe. Absorbs 20% of the damage as HP." 357 | Dark Roar,15,Physical,130,Dark,No,"Physical attack, 130 Dark damage to one foe. 90% accuracy, tends to critical more often." 358 | Fenrir Sword,15,Physical,130,Water,No,"Physical attack, 130 Water damage to one foe. 15% chance of instantly killing target." 359 | Final Shining Burst,20,Physical,200,Fire,No,"Physical attack, 200 Fire damage to all foes. Decreases ATK by 10%." 360 | Full Moon Meteor Impact,20,Physical,120,Light,No,"Physical attack, 120 Light damage to one foe. 30% chance of stunning and tends to critical." 361 | Mourning Dance,20,Physical,20,Dark,No,"8 physical attacks, 20 Dark damage to one foe. Damage tends to fluctuate." 362 | Aguichant L\E8vres,30,Magic,0,Light,No,INT-penetrating Light attack on one foe and absorbs 50% of the damage as HP. 363 | Omni Sword,30,Physical,150,Neutral,No,"Physical attack, 150 Neutral damage to one foe. 10% chance of dotting target." 364 | Transcendent Sword,30,Physical,115,Fire,No,"Physical attack, 115 Fire damage to all foes." 365 | Gift of Darkness,60,Physical,0,Dark,No,"DEF-penetrating attack, triple Dark damage to one foe." 366 | Divine Atonement,30,Magic,105,Light,No,"Magic attack, 105 Light damage to all foes." 367 | Bantyo Blade,20,Physical,150,Neutral,No,"Physical attack, 150 Neutral damage to one foe. Damage tends to fluctuate." 368 | Flaming Fist,10,Physical,50,Fire,No,"Physical attack, 50 Fire damage to all foes." 369 | S-Gold Solar Storm,25,Magic,75,Light,No,"Magic attack, 75 Light damage to all foes. Increases DEF by 10%." 370 | Golden Triangle,20,Magic,110,Light,No,"Magic attack, 110 Light damage to one foe. Increases base stats by 10%." 371 | Soul Digitalization,25,Magic,95,Neutral,No,"Magic attack, 95 Neutral damage to all foes. 5% chance of instantly killing target." 372 | Victory Sword,25,Physical,65,Wind,No,"2 physical attacks, 65 Wind damage to one foe." 373 | Great Tornado,40,Physical,0,Fire,No,"DEF-penetrating attack, double Fire damage to one foe." 374 | Dragonic Impact,50,Physical,100,Fire,No,"Physical attack, 100 Fire damage to all foes. Also knocks back targets." 375 | Judecca Prison,25,Magic,115,Dark,No,"Magic attack, 115 Dark damage to one foe. Always hits and undoes any stat reductions." 376 | Table Flip,25,Physical,100,Earth,No,"Physical attack, 100 Earth damage to all foes. 70% accuracy. Tends to critical more often." 377 | Breath of the Gods,25,Support,0,Neutral,No,Nullifies any damage received until next turn. 378 | Weltgeist,25,Support,0,Neutral,No,"Nullify all received damage until the next turn, and counterattacks when receiving physical or magic attacks." 379 | Odin's Breath,25,Physical,105,Water,No,"Physical attack, 105 Water damage to all foes. 10% chance of putting target to sleep." 380 | Shield of the Just,25,Magic,115,Light,No,"Magic attack, 115 Light damage to one foe. Always hits. Cancels negative effects on itself." 381 | Dragon's Roar,25,Physical,55,Fire,No,"2 physical attacks, 55 Fire damage to a foe and absorbs 50% of the damage as HP." 382 | Black Aura Blast,25,Magic,110,Dark,No,"Magic attack, 110 Dark damage to one foe. Decrease target's DEF by 10%" 383 | Black Tornado,40,Physical,0,Dark,No,"DEF-penetrating attack, double Dark damage to one foe." 384 | Garuru Tomahawk,20,Physical,140,Neutral,No,"Physical attack, 140 Neutral damage to one foe. Always hits." 385 | Fist of Athena,50,Physical,0,Fire,No,"DEF-penetrating attack, triple Fire damage to one foe. 30% chance of stunning target." 386 | Supreme Cannon,30,Magic,130,Water,No,"Magic attack, 130 Water damage to one foe." 387 | Dark Prominence,30,Magic,0,Dark,No,INT-penetrating Dark attack to one foe. 50% chance of crystallizing target. 388 | Plasma Shoot,25,Physical,35,Fire,No,"3 physical attacks, 35 Fire damage to all foes." 389 | -------------------------------------------------------------------------------- /dataframe_sql/data/DigiDB_supportlist.csv: -------------------------------------------------------------------------------- 1 | Name,Description 2 | Adroit Wisdom,Increases INT by 15%. 3 | All-Rounder,"Increases ATK, DEF, INT and SPD by 5%." 4 | Analyze,Increases scan values by 10%. 5 | Animal Colosseum,Increases damage from Earth skills by 15%. 6 | Aus Generics,Increases SPD and EVA by 25% when HP drops below 25%. 7 | Backwater Camp,"Increases damage given by 20%, but also increases damage received by 20%." 8 | Battle Sense,Increases ATK by 50% when HP drops below 10%. 9 | Blaster,Increases ATK by 10% and amount of HP received from absorption effects by 30%. 10 | Bull's-Eye,Increases ACU by 15%. 11 | Caledfwlch Dive,"Increases ACU and EVA by 5%, and CRT by 10%." 12 | Chaos Expert,Increases ATK and INT by 10%. 13 | Crimson Formation,Increases damage from Electric and Wind skills by 10%. 14 | D-Brigade,Increases ACU and CRT by 10%. 15 | Deep Savers,Increases damage from Water skills by 15%. 16 | Deep Sea Slumber,10% chance of putting target to sleep when attacking. 17 | Destiny,Restores 3% of Max HP and SP every turn. 18 | Destroyer,10% chance of instantly killing target when attacking. 19 | Dragon Mode,Increases DEF and INT by 10%. 20 | Dragon's Roar,Increases damage from Fire skills by 15%. 21 | Dragon's Wrath,Increases ATK by 15%. 22 | Envy,Increases damage done to targets by 15% if they are Mega or above. 23 | Evil Heart,Increases amount of SP received from absorption effects by 30%. 24 | Fairy Protection,Increases given stat boost effects by 5%. 25 | Feint,Increases EVA by 7%. 26 | Feral Pulse,Increases SPD by 15%. 27 | Fight or Flight,Increases ATK by 20% when HP drops below 50%. 28 | Fighter Mode,Increases ATK and SPD by 10%. 29 | Flower Guard,Prevents poison. 30 | Freyr,Increases damage from Wind and Light skills by 10%. 31 | Full Functionality,Prevents sleep. 32 | Furious Howl,30% chance of instantly killing target when attacking if lower than Ultimate. 33 | Gehenna,Reduces damage received from magic attacks by 10% and converts it to HP. 34 | Gluttony,Reduces HP by 5% of Max HP and increases ATK by 5% every turn. 35 | Greed,Increases amount of HP and SP received from absorption effects by 20%. 36 | Haymaker,Increases CRT by 15%. 37 | Hermitic Loner,Increases damage to Royal Knights by 20%. 38 | High Resolution,Prevents dotting. 39 | Holy Knight,"Increases SPD by 10%, and damage from Fire and Light skills by 10%." 40 | Holy Ring,Increases HP recovery effects by 20%. 41 | Holy Salvation,Reduces damage received from species with bad affinity by 15%. 42 | Immobility,Prevents stunning. 43 | Innocent Pupil,Increase accuracy and evasion by 1%. 44 | Ironclad Defense,Increases DEF by 15%. 45 | Ironclad Fortification,Reduces damage received by 10%. 46 | Justice Genome,Increases damage from Light skills by 15%. 47 | Justice Union,Increases probability of combos occurring and continuing by 10%. 48 | Leopard Mode,"Increases EVA and CRT by 5%, and SPD by 10%." 49 | Lust,Reduces damage received from physical attacks by 10% and converts it to SP. 50 | Master's Disposition,"If HP is over 50% of Max HP, a fatal attack will instead leave you with 1 HP." 51 | Meditation,Restores 5% of Max HP every turn. 52 | Menace,10% chance of stunning target when attacking. 53 | Metal Empire,Increases damage from Electric skills by 15%. 54 | Millionaire,Increases YEN earned in battle. 55 | Miracle,Has a 10% chance of reducing damage received by 30%. 56 | Mirage Burst,"Increases physical damage received by 25%, but also increases INT by 20%." 57 | Moon-Kissed Blade,Increases damage from Water and Light skills by 10%. 58 | Muscle Monkey Suit,Reduces physical damage received by 15%. 59 | Mysterious Scale,Decreases received stat reduction effects by 5%. 60 | Mystic Protection,Cuts the rate of abnormal statuses received by 50%. 61 | Nature Spirits,Increases damage from Plant skills by 15%. 62 | Nightmare Soldiers,Increases damage from Dark skills by 15%. 63 | Numbing Waves,Prevents paralysis. 64 | Obsidian Knight,"Increases DEF by 10%, and damage from Water and Dark skills by 10%." 65 | Ocean Love,Restores 5% of Max SP every turn. 66 | Parallel World Tactician,Increases Light and Dark skill damage by 10% and increases HP recovery effects by 10%. 67 | Phoenix Feathers,Prevents instant death. 68 | Platinum Bonus,Increases EXP earned in battle. 69 | Poison Thorns,10% chance of poisoning target when attacking. 70 | Pride,Increases damage from all attribute skills by 5%. 71 | Primal Trooper,Increases damage from Neutral skills by 15%. 72 | Royal Commando,10% chance of paralyzing target when attacking. 73 | Scavenge,Increases foe drop rate for items. 74 | Shining Burst,"Increases Dark damage received by 25%, but also increases ATK by 25%." 75 | Sloth,"Prevents Sleep, and has a 30% chance of putting target to sleep when attacking." 76 | Strange Dance,10% chance of confusing target when attacking. 77 | Strategist,Reduces SP consumed by skills by 20%. 78 | Supreme Focus,Prevents confusion. 79 | Swiftness,Makes sure you always move first in battle. 80 | Tifaret,"Restores 5% of max HP every turn, and increases HP received from absorption effects by 20%." 81 | To Fight Another Day,Makes it easier to escape from battle. 82 | Trickster,10% chance of dotting target when attacking. 83 | Unmatched Cruelty,Increases damage from attributes with good affinity by 15%. 84 | Unstable Singularity,"Increases damage given by 30%, but also increases damage received by 30%." 85 | Wind Guardians,Increases damage from Wind skills by 15%. 86 | Wrath,Raises ATK and INT by 25% when HP drops below 25%. 87 | Wyvern,Increases damage from Fire and Wind skills by 10%. 88 | -------------------------------------------------------------------------------- /dataframe_sql/data/avocado.csv: -------------------------------------------------------------------------------- 1 | avocado_id,Date,AveragePrice,Total Volume,4046,4225,4770,Total Bags,Small Bags,Large Bags,XLarge Bags,type,year,region 2 | 0,0,2015-12-27,1.33,64236.62,1036.74,54454.85,48.16,8696.87,8603.62,93.25,0.0,conventional,2015,Albany 3 | 1,1,2015-12-20,1.35,54876.98,674.28,44638.81,58.33,9505.56,9408.07,97.49,0.0,conventional,2015,Albany 4 | 2,2,2015-12-13,0.93,118220.22,794.7,109149.67,130.5,8145.35,8042.21,103.14,0.0,conventional,2015,Albany 5 | 3,3,2015-12-06,1.08,78992.15,1132.0,71976.41,72.58,5811.16,5677.4,133.76,0.0,conventional,2015,Albany 6 | 4,4,2015-11-29,1.28,51039.6,941.48,43838.39,75.78,6183.95,5986.26,197.69,0.0,conventional,2015,Albany 7 | 5,5,2015-11-22,1.26,55979.78,1184.27,48067.99,43.61,6683.91,6556.47,127.44,0.0,conventional,2015,Albany 8 | 6,6,2015-11-15,0.99,83453.76,1368.92,73672.72,93.26,8318.86,8196.81,122.05,0.0,conventional,2015,Albany 9 | 7,7,2015-11-08,0.98,109428.33,703.75,101815.36,80.0,6829.22,6266.85,562.37,0.0,conventional,2015,Albany 10 | 8,8,2015-11-01,1.02,99811.42,1022.15,87315.57,85.34,11388.36,11104.53,283.83,0.0,conventional,2015,Albany 11 | 9,9,2015-10-25,1.07,74338.76,842.4,64757.44,113.0,8625.92,8061.47,564.45,0.0,conventional,2015,Albany 12 | 10,10,2015-10-18,1.12,84843.44,924.86,75595.85,117.07,8205.66,7877.86,327.8,0.0,conventional,2015,Albany 13 | 11,11,2015-10-11,1.28,64489.17,1582.03,52677.92,105.32,10123.9,9866.27,257.63,0.0,conventional,2015,Albany 14 | 12,12,2015-10-04,1.31,61007.1,2268.32,49880.67,101.36,8756.75,8379.98,376.77,0.0,conventional,2015,Albany 15 | 13,13,2015-09-27,0.99,106803.39,1204.88,99409.21,154.84,6034.46,5888.87,145.59,0.0,conventional,2015,Albany 16 | 14,14,2015-09-20,1.33,69759.01,1028.03,59313.12,150.5,9267.36,8489.1,778.26,0.0,conventional,2015,Albany 17 | 15,15,2015-09-13,1.28,76111.27,985.73,65696.86,142.0,9286.68,8665.19,621.49,0.0,conventional,2015,Albany 18 | 16,16,2015-09-06,1.11,99172.96,879.45,90062.62,240.79,7990.1,7762.87,227.23,0.0,conventional,2015,Albany 19 | 17,17,2015-08-30,1.07,105693.84,689.01,94362.67,335.43,10306.73,10218.93,87.8,0.0,conventional,2015,Albany 20 | 18,18,2015-08-23,1.34,79992.09,733.16,67933.79,444.78,10880.36,10745.79,134.57,0.0,conventional,2015,Albany 21 | 19,19,2015-08-16,1.33,80043.78,539.65,68666.01,394.9,10443.22,10297.68,145.54,0.0,conventional,2015,Albany 22 | 20,20,2015-08-09,1.12,111140.93,584.63,100961.46,368.95,9225.89,9116.34,109.55,0.0,conventional,2015,Albany 23 | 21,21,2015-08-02,1.45,75133.1,509.94,62035.06,741.08,11847.02,11768.52,78.5,0.0,conventional,2015,Albany 24 | 22,22,2015-07-26,1.11,106757.1,648.75,91949.05,966.61,13192.69,13061.53,131.16,0.0,conventional,2015,Albany 25 | 23,23,2015-07-19,1.26,96617.0,1042.1,82049.4,2238.02,11287.48,11103.49,183.99,0.0,conventional,2015,Albany 26 | 24,24,2015-07-12,1.05,124055.31,672.25,94693.52,4257.64,24431.9,24290.08,108.49,33.33,conventional,2015,Albany 27 | 25,25,2015-07-05,1.35,109252.12,869.45,72600.55,5883.16,29898.96,29663.19,235.77,0.0,conventional,2015,Albany 28 | 26,26,2015-06-28,1.37,89534.81,664.23,57545.79,4662.71,26662.08,26311.76,350.32,0.0,conventional,2015,Albany 29 | 27,27,2015-06-21,1.27,104849.39,804.01,76688.55,5481.18,21875.65,21662.0,213.65,0.0,conventional,2015,Albany 30 | 28,28,2015-06-14,1.32,89631.3,850.58,55400.94,4377.19,29002.59,28343.14,659.45,0.0,conventional,2015,Albany 31 | 29,29,2015-06-07,1.07,122743.06,656.71,99220.82,90.32,22775.21,22314.99,460.22,0.0,conventional,2015,Albany 32 | 30,30,2015-05-31,1.23,95123.62,922.37,70469.69,50.55,23681.01,23222.49,458.52,0.0,conventional,2015,Albany 33 | 31,31,2015-05-24,1.19,101470.91,680.27,71376.81,58.7,29355.13,28761.81,593.32,0.0,conventional,2015,Albany 34 | 32,32,2015-05-17,1.43,109857.47,1150.55,81955.16,94.32,26657.44,26285.43,372.01,0.0,conventional,2015,Albany 35 | 33,33,2015-05-10,1.26,120427.91,1420.43,102000.52,185.66,16821.3,16535.55,285.75,0.0,conventional,2015,Albany 36 | 34,34,2015-05-03,1.2,59197.67,919.87,45490.05,217.24,12570.51,12201.95,368.56,0.0,conventional,2015,Albany 37 | 35,35,2015-04-26,1.22,49585.46,875.65,35841.75,89.62,12778.44,12076.83,701.61,0.0,conventional,2015,Albany 38 | 36,36,2015-04-19,1.19,49064.73,774.15,33941.51,47.15,14301.92,13602.97,698.95,0.0,conventional,2015,Albany 39 | 37,37,2015-04-12,1.13,48364.29,864.27,30374.15,21.5,17104.37,16438.49,665.88,0.0,conventional,2015,Albany 40 | 38,38,2015-04-05,1.16,47362.13,961.77,35577.66,93.76,10728.94,9869.16,755.61,104.17,conventional,2015,Albany 41 | 39,39,2015-03-29,1.02,67799.08,1402.28,58623.22,89.5,7684.08,7208.49,475.59,0.0,conventional,2015,Albany 42 | 40,40,2015-03-22,1.12,46346.85,2141.83,34313.56,141.8,9749.66,9252.6,497.06,0.0,conventional,2015,Albany 43 | 41,41,2015-03-15,1.11,43045.79,2128.26,30447.17,99.67,10370.69,9989.59,381.1,0.0,conventional,2015,Albany 44 | 42,42,2015-03-08,1.07,40507.36,795.68,30370.64,159.05,9181.99,8827.55,354.44,0.0,conventional,2015,Albany 45 | 43,43,2015-03-01,0.99,55595.74,629.46,45633.34,181.49,9151.45,8986.06,165.39,0.0,conventional,2015,Albany 46 | 44,44,2015-02-22,1.07,45675.05,1088.38,35056.13,151.0,9379.54,9000.16,379.38,0.0,conventional,2015,Albany 47 | 45,45,2015-02-15,1.06,41567.62,986.66,30045.51,222.42,10313.03,9979.87,333.16,0.0,conventional,2015,Albany 48 | 46,46,2015-02-08,0.99,51253.97,1357.37,39111.81,163.25,10621.54,10113.1,508.44,0.0,conventional,2015,Albany 49 | 47,47,2015-02-01,0.99,70873.6,1353.9,60017.2,179.32,9323.18,9170.82,152.36,0.0,conventional,2015,Albany 50 | 48,48,2015-01-25,1.06,45147.5,941.38,33196.16,164.14,10845.82,10103.35,742.47,0.0,conventional,2015,Albany 51 | 49,49,2015-01-18,1.17,44511.28,914.14,31540.32,135.77,11921.05,11651.09,269.96,0.0,conventional,2015,Albany 52 | -------------------------------------------------------------------------------- /dataframe_sql/data/forestfires.csv: -------------------------------------------------------------------------------- 1 | X,Y,month,day,FFMC,DMC,DC,ISI,temp,RH,wind,rain,area 2 | 7,5,mar,fri,86.2,26.2,94.3,5.1,8.2,51,6.7,0,0 3 | 7,4,oct,tue,90.6,35.4,669.1,6.7,18,33,0.9,0,0 4 | 7,4,oct,sat,90.6,43.7,686.9,6.7,14.6,33,1.3,0,0 5 | 8,6,mar,fri,91.7,33.3,77.5,9,8.3,97,4,0.2,0 6 | 8,6,mar,sun,89.3,51.3,102.2,9.6,11.4,99,1.8,0,0 7 | 8,6,aug,sun,92.3,85.3,488,14.7,22.2,29,5.4,0,0 8 | 8,6,aug,mon,92.3,88.9,495.6,8.5,24.1,27,3.1,0,0 9 | 8,6,aug,mon,91.5,145.4,608.2,10.7,8,86,2.2,0,0 10 | 8,6,sep,tue,91,129.5,692.6,7,13.1,63,5.4,0,0 11 | 7,5,sep,sat,92.5,88,698.6,7.1,22.8,40,4,0,0 12 | 7,5,sep,sat,92.5,88,698.6,7.1,17.8,51,7.2,0,0 13 | 7,5,sep,sat,92.8,73.2,713,22.6,19.3,38,4,0,0 14 | 6,5,aug,fri,63.5,70.8,665.3,0.8,17,72,6.7,0,0 15 | 6,5,sep,mon,90.9,126.5,686.5,7,21.3,42,2.2,0,0 16 | 6,5,sep,wed,92.9,133.3,699.6,9.2,26.4,21,4.5,0,0 17 | 6,5,sep,fri,93.3,141.2,713.9,13.9,22.9,44,5.4,0,0 18 | 5,5,mar,sat,91.7,35.8,80.8,7.8,15.1,27,5.4,0,0 19 | 8,5,oct,mon,84.9,32.8,664.2,3,16.7,47,4.9,0,0 20 | 6,4,mar,wed,89.2,27.9,70.8,6.3,15.9,35,4,0,0 21 | 6,4,apr,sat,86.3,27.4,97.1,5.1,9.3,44,4.5,0,0 22 | 6,4,sep,tue,91,129.5,692.6,7,18.3,40,2.7,0,0 23 | 5,4,sep,mon,91.8,78.5,724.3,9.2,19.1,38,2.7,0,0 24 | 7,4,jun,sun,94.3,96.3,200,56.1,21,44,4.5,0,0 25 | 7,4,aug,sat,90.2,110.9,537.4,6.2,19.5,43,5.8,0,0 26 | 7,4,aug,sat,93.5,139.4,594.2,20.3,23.7,32,5.8,0,0 27 | 7,4,aug,sun,91.4,142.4,601.4,10.6,16.3,60,5.4,0,0 28 | 7,4,sep,fri,92.4,117.9,668,12.2,19,34,5.8,0,0 29 | 7,4,sep,mon,90.9,126.5,686.5,7,19.4,48,1.3,0,0 30 | 6,3,sep,sat,93.4,145.4,721.4,8.1,30.2,24,2.7,0,0 31 | 6,3,sep,sun,93.5,149.3,728.6,8.1,22.8,39,3.6,0,0 32 | 6,3,sep,fri,94.3,85.1,692.3,15.9,25.4,24,3.6,0,0 33 | 6,3,sep,mon,88.6,91.8,709.9,7.1,11.2,78,7.6,0,0 34 | 6,3,sep,fri,88.6,69.7,706.8,5.8,20.6,37,1.8,0,0 35 | 6,3,sep,sun,91.7,75.6,718.3,7.8,17.7,39,3.6,0,0 36 | 6,3,sep,mon,91.8,78.5,724.3,9.2,21.2,32,2.7,0,0 37 | 6,3,sep,tue,90.3,80.7,730.2,6.3,18.2,62,4.5,0,0 38 | 6,3,oct,tue,90.6,35.4,669.1,6.7,21.7,24,4.5,0,0 39 | 7,4,oct,fri,90,41.5,682.6,8.7,11.3,60,5.4,0,0 40 | 7,3,oct,sat,90.6,43.7,686.9,6.7,17.8,27,4,0,0 41 | 4,4,mar,tue,88.1,25.7,67.6,3.8,14.1,43,2.7,0,0 42 | 4,4,jul,tue,79.5,60.6,366.7,1.5,23.3,37,3.1,0,0 43 | 4,4,aug,sat,90.2,96.9,624.2,8.9,18.4,42,6.7,0,0 44 | 4,4,aug,tue,94.8,108.3,647.1,17,16.6,54,5.4,0,0 45 | 4,4,sep,sat,92.5,88,698.6,7.1,19.6,48,2.7,0,0 46 | 4,4,sep,wed,90.1,82.9,735.7,6.2,12.9,74,4.9,0,0 47 | 5,6,sep,wed,94.3,85.1,692.3,15.9,25.9,24,4,0,0 48 | 5,6,sep,mon,90.9,126.5,686.5,7,14.7,70,3.6,0,0 49 | 6,6,jul,mon,94.2,62.3,442.9,11,23,36,3.1,0,0 50 | 4,4,mar,mon,87.2,23.9,64.7,4.1,11.8,35,1.8,0,0 51 | 4,4,mar,mon,87.6,52.2,103.8,5,11,46,5.8,0,0 52 | 4,4,sep,thu,92.9,137,706.4,9.2,20.8,17,1.3,0,0 53 | 4,3,aug,sun,90.2,99.6,631.2,6.3,21.5,34,2.2,0,0 54 | 4,3,aug,wed,92.1,111.2,654.1,9.6,20.4,42,4.9,0,0 55 | 4,3,aug,wed,92.1,111.2,654.1,9.6,20.4,42,4.9,0,0 56 | 4,3,aug,thu,91.7,114.3,661.3,6.3,17.6,45,3.6,0,0 57 | 4,3,sep,thu,92.9,137,706.4,9.2,27.7,24,2.2,0,0 58 | 4,3,sep,tue,90.3,80.7,730.2,6.3,17.8,63,4.9,0,0 59 | 4,3,oct,sun,92.6,46.5,691.8,8.8,13.8,50,2.7,0,0 60 | 2,2,feb,mon,84,9.3,34,2.1,13.9,40,5.4,0,0 61 | 2,2,feb,fri,86.6,13.2,43,5.3,12.3,51,0.9,0,0 62 | 2,2,mar,sun,89.3,51.3,102.2,9.6,11.5,39,5.8,0,0 63 | 2,2,mar,sun,89.3,51.3,102.2,9.6,5.5,59,6.3,0,0 64 | 2,2,aug,thu,93,75.3,466.6,7.7,18.8,35,4.9,0,0 65 | 2,2,aug,sun,90.2,99.6,631.2,6.3,20.8,33,2.7,0,0 66 | 2,2,aug,mon,91.1,103.2,638.8,5.8,23.1,31,3.1,0,0 67 | 2,2,aug,thu,91.7,114.3,661.3,6.3,18.6,44,4.5,0,0 68 | 2,2,sep,fri,92.4,117.9,668,12.2,23,37,4.5,0,0 69 | 2,2,sep,fri,92.4,117.9,668,12.2,19.6,33,5.4,0,0 70 | 2,2,sep,fri,92.4,117.9,668,12.2,19.6,33,6.3,0,0 71 | 4,5,mar,fri,91.7,33.3,77.5,9,17.2,26,4.5,0,0 72 | 4,5,mar,fri,91.2,48.3,97.8,12.5,15.8,27,7.6,0,0 73 | 4,5,sep,fri,94.3,85.1,692.3,15.9,17.7,37,3.6,0,0 74 | 5,4,mar,fri,91.7,33.3,77.5,9,15.6,25,6.3,0,0 75 | 5,4,aug,tue,88.8,147.3,614.5,9,17.3,43,4.5,0,0 76 | 5,4,sep,fri,93.3,141.2,713.9,13.9,27.6,30,1.3,0,0 77 | 9,9,feb,thu,84.2,6.8,26.6,7.7,6.7,79,3.1,0,0 78 | 9,9,feb,fri,86.6,13.2,43,5.3,15.7,43,3.1,0,0 79 | 1,3,mar,mon,87.6,52.2,103.8,5,8.3,72,3.1,0,0 80 | 1,2,aug,fri,90.1,108,529.8,12.5,14.7,66,2.7,0,0 81 | 1,2,aug,tue,91,121.2,561.6,7,21.6,19,6.7,0,0 82 | 1,2,aug,sun,91.4,142.4,601.4,10.6,19.5,39,6.3,0,0 83 | 1,2,aug,sun,90.2,99.6,631.2,6.3,17.9,44,2.2,0,0 84 | 1,2,aug,tue,94.8,108.3,647.1,17,18.6,51,4.5,0,0 85 | 1,2,aug,wed,92.1,111.2,654.1,9.6,16.6,47,0.9,0,0 86 | 1,2,aug,thu,91.7,114.3,661.3,6.3,20.2,45,3.6,0,0 87 | 1,2,sep,thu,92.9,137,706.4,9.2,21.5,15,0.9,0,0 88 | 1,2,sep,thu,92.9,137,706.4,9.2,25.4,27,2.2,0,0 89 | 1,2,sep,thu,92.9,137,706.4,9.2,22.4,34,2.2,0,0 90 | 1,2,sep,sun,93.5,149.3,728.6,8.1,25.3,36,3.6,0,0 91 | 6,5,mar,sat,91.7,35.8,80.8,7.8,17.4,25,4.9,0,0 92 | 6,5,aug,sat,90.2,96.9,624.2,8.9,14.7,59,5.8,0,0 93 | 8,6,mar,fri,91.7,35.8,80.8,7.8,17.4,24,5.4,0,0 94 | 8,6,aug,sun,92.3,85.3,488,14.7,20.8,32,6.3,0,0 95 | 8,6,aug,sun,91.4,142.4,601.4,10.6,18.2,43,4.9,0,0 96 | 8,6,aug,mon,91.1,103.2,638.8,5.8,23.4,22,2.7,0,0 97 | 4,4,sep,sun,89.7,90,704.4,4.8,17.8,64,1.3,0,0 98 | 3,4,feb,sat,83.9,8,30.2,2.6,12.7,48,1.8,0,0 99 | 3,4,mar,sat,69,2.4,15.5,0.7,17.4,24,5.4,0,0 100 | 3,4,aug,sun,91.4,142.4,601.4,10.6,11.6,87,4.5,0,0 101 | 3,4,aug,sun,91.4,142.4,601.4,10.6,19.8,39,5.4,0,0 102 | 3,4,aug,sun,91.4,142.4,601.4,10.6,19.8,39,5.4,0,0 103 | 3,4,aug,tue,88.8,147.3,614.5,9,14.4,66,5.4,0,0 104 | 2,4,aug,tue,94.8,108.3,647.1,17,20.1,40,4,0,0 105 | 2,4,sep,sat,92.5,121.1,674.4,8.6,24.1,29,4.5,0,0 106 | 2,4,jan,sat,82.1,3.7,9.3,2.9,5.3,78,3.1,0,0 107 | 4,5,mar,fri,85.9,19.5,57.3,2.8,12.7,52,6.3,0,0 108 | 4,5,mar,thu,91.4,30.7,74.3,7.5,18.2,29,3.1,0,0 109 | 4,5,aug,sun,90.2,99.6,631.2,6.3,21.4,33,3.1,0,0 110 | 4,5,sep,sat,92.5,88,698.6,7.1,20.3,45,3.1,0,0 111 | 4,5,sep,mon,88.6,91.8,709.9,7.1,17.4,56,5.4,0,0 112 | 4,4,mar,fri,85.9,19.5,57.3,2.8,13.7,43,5.8,0,0 113 | 3,4,mar,fri,91.7,33.3,77.5,9,18.8,18,4.5,0,0 114 | 3,4,sep,sun,89.7,90,704.4,4.8,22.8,39,3.6,0,0 115 | 3,4,sep,mon,91.8,78.5,724.3,9.2,18.9,35,2.7,0,0 116 | 3,4,mar,tue,88.1,25.7,67.6,3.8,15.8,27,7.6,0,0 117 | 3,5,mar,tue,88.1,25.7,67.6,3.8,15.5,27,6.3,0,0 118 | 3,4,mar,sat,91.7,35.8,80.8,7.8,11.6,30,6.3,0,0 119 | 3,4,mar,sat,91.7,35.8,80.8,7.8,15.2,27,4.9,0,0 120 | 3,4,mar,mon,90.1,39.7,86.6,6.2,10.6,30,4,0,0 121 | 3,4,aug,thu,93,75.3,466.6,7.7,19.6,36,3.1,0,0 122 | 3,4,aug,mon,91.5,145.4,608.2,10.7,10.3,74,2.2,0,0 123 | 3,4,aug,mon,91.5,145.4,608.2,10.7,17.1,43,5.4,0,0 124 | 3,4,sep,sun,92.4,124.1,680.7,8.5,22.5,42,5.4,0,0 125 | 3,4,sep,tue,84.4,73.4,671.9,3.2,17.9,45,3.1,0,0 126 | 3,4,sep,fri,94.3,85.1,692.3,15.9,19.8,50,5.4,0,0 127 | 3,4,oct,sun,92.6,46.5,691.8,8.8,20.6,24,5.4,0,0 128 | 3,5,mar,mon,87.6,52.2,103.8,5,9,49,2.2,0,0 129 | 3,5,sep,fri,93.5,149.3,728.6,8.1,17.2,43,3.1,0,0 130 | 3,5,oct,wed,91.4,37.9,673.8,5.2,15.9,46,3.6,0,0 131 | 2,5,oct,sun,92.6,46.5,691.8,8.8,15.4,35,0.9,0,0 132 | 4,6,feb,sat,68.2,21.5,87.2,0.8,15.4,40,2.7,0,0 133 | 4,6,mar,mon,87.2,23.9,64.7,4.1,14,39,3.1,0,0 134 | 4,6,mar,sun,89.3,51.3,102.2,9.6,10.6,46,4.9,0,0 135 | 4,6,sep,thu,93.7,80.9,685.2,17.9,17.6,42,3.1,0,0 136 | 3,5,mar,tue,88.1,25.7,67.6,3.8,14.9,38,2.7,0,0 137 | 3,5,aug,sat,93.5,139.4,594.2,20.3,17.6,52,5.8,0,0 138 | 3,6,sep,sun,92.4,124.1,680.7,8.5,17.2,58,1.3,0,0 139 | 3,6,sep,mon,90.9,126.5,686.5,7,15.6,66,3.1,0,0 140 | 9,9,jul,tue,85.8,48.3,313.4,3.9,18,42,2.7,0,0.36 141 | 1,4,sep,tue,91,129.5,692.6,7,21.7,38,2.2,0,0.43 142 | 2,5,sep,mon,90.9,126.5,686.5,7,21.9,39,1.8,0,0.47 143 | 1,2,aug,wed,95.5,99.9,513.3,13.2,23.3,31,4.5,0,0.55 144 | 8,6,aug,fri,90.1,108,529.8,12.5,21.2,51,8.9,0,0.61 145 | 1,2,jul,sat,90,51.3,296.3,8.7,16.6,53,5.4,0,0.71 146 | 2,5,aug,wed,95.5,99.9,513.3,13.2,23.8,32,5.4,0,0.77 147 | 6,5,aug,thu,95.2,131.7,578.8,10.4,27.4,22,4,0,0.9 148 | 5,4,mar,mon,90.1,39.7,86.6,6.2,13.2,40,5.4,0,0.95 149 | 8,3,sep,tue,84.4,73.4,671.9,3.2,24.2,28,3.6,0,0.96 150 | 2,2,aug,tue,94.8,108.3,647.1,17,17.4,43,6.7,0,1.07 151 | 8,6,sep,thu,93.7,80.9,685.2,17.9,23.7,25,4.5,0,1.12 152 | 6,5,jun,fri,92.5,56.4,433.3,7.1,23.2,39,5.4,0,1.19 153 | 9,9,jul,sun,90.1,68.6,355.2,7.2,24.8,29,2.2,0,1.36 154 | 3,4,jul,sat,90.1,51.2,424.1,6.2,24.6,43,1.8,0,1.43 155 | 5,4,sep,fri,94.3,85.1,692.3,15.9,20.1,47,4.9,0,1.46 156 | 1,5,sep,sat,93.4,145.4,721.4,8.1,29.6,27,2.7,0,1.46 157 | 7,4,aug,sun,94.8,108.3,647.1,17,16.4,47,1.3,0,1.56 158 | 2,4,sep,sat,93.4,145.4,721.4,8.1,28.6,27,2.2,0,1.61 159 | 2,2,aug,wed,92.1,111.2,654.1,9.6,18.4,45,3.6,0,1.63 160 | 2,4,aug,wed,92.1,111.2,654.1,9.6,20.5,35,4,0,1.64 161 | 7,4,sep,fri,92.4,117.9,668,12.2,19,34,5.8,0,1.69 162 | 7,4,mar,mon,90.1,39.7,86.6,6.2,16.1,29,3.1,0,1.75 163 | 6,4,aug,thu,95.2,131.7,578.8,10.4,20.3,41,4,0,1.9 164 | 6,3,mar,sat,90.6,50.1,100.4,7.8,15.2,31,8.5,0,1.94 165 | 8,6,sep,sat,92.5,121.1,674.4,8.6,17.8,56,1.8,0,1.95 166 | 8,5,sep,sun,89.7,90,704.4,4.8,17.8,67,2.2,0,2.01 167 | 6,5,mar,thu,84.9,18.2,55,3,5.3,70,4.5,0,2.14 168 | 6,5,aug,wed,92.1,111.2,654.1,9.6,16.6,47,0.9,0,2.29 169 | 6,5,aug,wed,96,127.1,570.5,16.5,23.4,33,4.5,0,2.51 170 | 6,5,mar,fri,91.2,48.3,97.8,12.5,14.6,26,9.4,0,2.53 171 | 6,5,mar,fri,91.2,48.3,97.8,12.5,14.6,26,9.4,0,2.53 172 | 8,6,aug,thu,95.2,131.7,578.8,10.4,20.7,45,2.2,0,2.55 173 | 5,4,sep,wed,92.9,133.3,699.6,9.2,21.9,35,1.8,0,2.57 174 | 8,6,aug,wed,85.6,90.4,609.6,6.6,17.4,50,4,0,2.69 175 | 7,4,aug,sun,91.4,142.4,601.4,10.6,20.1,39,5.4,0,2.74 176 | 4,4,sep,mon,90.9,126.5,686.5,7,17.7,39,2.2,0,3.07 177 | 1,4,aug,sat,90.2,96.9,624.2,8.9,14.2,53,1.8,0,3.5 178 | 1,4,aug,sat,90.2,96.9,624.2,8.9,20.3,39,4.9,0,4.53 179 | 6,5,apr,thu,81.5,9.1,55.2,2.7,5.8,54,5.8,0,4.61 180 | 2,5,aug,sun,90.2,99.6,631.2,6.3,19.2,44,2.7,0,4.69 181 | 2,5,sep,wed,90.1,82.9,735.7,6.2,18.3,45,2.2,0,4.88 182 | 8,6,aug,tue,88.8,147.3,614.5,9,14.4,66,5.4,0,5.23 183 | 1,3,sep,sun,92.4,124.1,680.7,8.5,23.9,32,6.7,0,5.33 184 | 8,6,oct,mon,84.9,32.8,664.2,3,19.1,32,4,0,5.44 185 | 5,4,feb,sun,86.8,15.6,48.3,3.9,12.4,53,2.2,0,6.38 186 | 7,4,oct,mon,91.7,48.5,696.1,11.1,16.8,45,4.5,0,6.83 187 | 8,6,aug,fri,93.9,135.7,586.7,15.1,20.8,34,4.9,0,6.96 188 | 2,5,sep,tue,91,129.5,692.6,7,17.6,46,3.1,0,7.04 189 | 8,6,mar,sun,89.3,51.3,102.2,9.6,11.5,39,5.8,0,7.19 190 | 1,5,sep,mon,90.9,126.5,686.5,7,21,42,2.2,0,7.3 191 | 6,4,mar,sat,90.8,41.9,89.4,7.9,13.3,42,0.9,0,7.4 192 | 7,4,mar,sun,90.7,44,92.4,5.5,11.5,60,4,0,8.24 193 | 6,5,mar,fri,91.2,48.3,97.8,12.5,11.7,33,4,0,8.31 194 | 2,5,aug,thu,95.2,131.7,578.8,10.4,24.2,28,2.7,0,8.68 195 | 2,2,aug,tue,94.8,108.3,647.1,17,24.6,22,4.5,0,8.71 196 | 4,5,sep,wed,92.9,133.3,699.6,9.2,24.3,25,4,0,9.41 197 | 2,2,aug,tue,94.8,108.3,647.1,17,24.6,22,4.5,0,10.01 198 | 2,5,aug,fri,93.9,135.7,586.7,15.1,23.5,36,5.4,0,10.02 199 | 6,5,apr,thu,81.5,9.1,55.2,2.7,5.8,54,5.8,0,10.93 200 | 4,5,sep,thu,92.9,137,706.4,9.2,21.5,15,0.9,0,11.06 201 | 3,4,sep,tue,91,129.5,692.6,7,13.9,59,6.3,0,11.24 202 | 2,4,sep,mon,63.5,70.8,665.3,0.8,22.6,38,3.6,0,11.32 203 | 1,5,sep,tue,91,129.5,692.6,7,21.6,33,2.2,0,11.53 204 | 6,5,mar,sun,90.1,37.6,83.7,7.2,12.4,54,3.6,0,12.1 205 | 7,4,feb,sun,83.9,8.7,32.1,2.1,8.8,68,2.2,0,13.05 206 | 8,6,oct,wed,91.4,37.9,673.8,5.2,20.2,37,2.7,0,13.7 207 | 5,6,mar,sat,90.6,50.1,100.4,7.8,15.1,64,4,0,13.99 208 | 4,5,sep,thu,92.9,137,706.4,9.2,22.1,34,1.8,0,14.57 209 | 2,2,aug,sat,93.5,139.4,594.2,20.3,22.9,31,7.2,0,15.45 210 | 7,5,sep,tue,91,129.5,692.6,7,20.7,37,2.2,0,17.2 211 | 6,5,sep,fri,92.4,117.9,668,12.2,19.6,33,6.3,0,19.23 212 | 8,3,sep,thu,93.7,80.9,685.2,17.9,23.2,26,4.9,0,23.41 213 | 4,4,oct,sat,90.6,43.7,686.9,6.7,18.4,25,3.1,0,24.23 214 | 7,4,aug,sat,93.5,139.4,594.2,20.3,5.1,96,5.8,0,26 215 | 7,4,sep,fri,94.3,85.1,692.3,15.9,20.1,47,4.9,0,26.13 216 | 7,3,mar,mon,87.6,52.2,103.8,5,11,46,5.8,0,27.35 217 | 4,4,mar,sat,91.7,35.8,80.8,7.8,17,27,4.9,0,28.66 218 | 4,4,mar,sat,91.7,35.8,80.8,7.8,17,27,4.9,0,28.66 219 | 4,4,sep,sun,92.4,124.1,680.7,8.5,16.9,60,1.3,0,29.48 220 | 1,3,sep,mon,88.6,91.8,709.9,7.1,12.4,73,6.3,0,30.32 221 | 4,5,sep,wed,92.9,133.3,699.6,9.2,19.4,19,1.3,0,31.72 222 | 6,5,mar,mon,90.1,39.7,86.6,6.2,15.2,27,3.1,0,31.86 223 | 8,6,aug,sun,90.2,99.6,631.2,6.3,16.2,59,3.1,0,32.07 224 | 3,4,sep,fri,93.3,141.2,713.9,13.9,18.6,49,3.6,0,35.88 225 | 4,3,mar,mon,87.6,52.2,103.8,5,11,46,5.8,0,36.85 226 | 2,2,jul,fri,88.3,150.3,309.9,6.8,13.4,79,3.6,0,37.02 227 | 7,4,sep,wed,90.1,82.9,735.7,6.2,15.4,57,4.5,0,37.71 228 | 4,4,sep,sun,93.5,149.3,728.6,8.1,22.9,39,4.9,0,48.55 229 | 7,5,oct,mon,91.7,48.5,696.1,11.1,16.1,44,4,0,49.37 230 | 8,6,aug,sat,92.2,81.8,480.8,11.9,20.1,34,4.5,0,58.3 231 | 4,6,sep,sun,93.5,149.3,728.6,8.1,28.3,26,3.1,0,64.1 232 | 8,6,aug,sat,92.2,81.8,480.8,11.9,16.4,43,4,0,71.3 233 | 4,4,sep,wed,92.9,133.3,699.6,9.2,26.4,21,4.5,0,88.49 234 | 1,5,sep,sun,93.5,149.3,728.6,8.1,27.8,27,3.1,0,95.18 235 | 6,4,sep,tue,91,129.5,692.6,7,18.7,43,2.7,0,103.39 236 | 9,4,sep,tue,84.4,73.4,671.9,3.2,24.3,36,3.1,0,105.66 237 | 4,5,sep,sat,92.5,121.1,674.4,8.6,17.7,25,3.1,0,154.88 238 | 8,6,aug,sun,91.4,142.4,601.4,10.6,19.6,41,5.8,0,196.48 239 | 2,2,sep,sat,92.5,121.1,674.4,8.6,18.2,46,1.8,0,200.94 240 | 1,2,sep,tue,91,129.5,692.6,7,18.8,40,2.2,0,212.88 241 | 6,5,sep,sat,92.5,121.1,674.4,8.6,25.1,27,4,0,1090.84 242 | 7,5,apr,sun,81.9,3,7.9,3.5,13.4,75,1.8,0,0 243 | 6,3,apr,wed,88,17.2,43.5,3.8,15.2,51,2.7,0,0 244 | 4,4,apr,fri,83,23.3,85.3,2.3,16.7,20,3.1,0,0 245 | 2,4,aug,sun,94.2,122.3,589.9,12.9,15.4,66,4,0,10.13 246 | 7,4,aug,sun,91.8,175.1,700.7,13.8,21.9,73,7.6,1,0 247 | 2,4,aug,sun,91.8,175.1,700.7,13.8,22.4,54,7.6,0,2.87 248 | 3,4,aug,sun,91.8,175.1,700.7,13.8,26.8,38,6.3,0,0.76 249 | 5,4,aug,sun,91.8,175.1,700.7,13.8,25.7,39,5.4,0,0.09 250 | 2,4,aug,wed,92.2,91.6,503.6,9.6,20.7,70,2.2,0,0.75 251 | 8,6,aug,wed,93.1,157.3,666.7,13.5,28.7,28,2.7,0,0 252 | 3,4,aug,wed,93.1,157.3,666.7,13.5,21.7,40,0.4,0,2.47 253 | 8,5,aug,wed,93.1,157.3,666.7,13.5,26.8,25,3.1,0,0.68 254 | 8,5,aug,wed,93.1,157.3,666.7,13.5,24,36,3.1,0,0.24 255 | 6,5,aug,wed,93.1,157.3,666.7,13.5,22.1,37,3.6,0,0.21 256 | 7,4,aug,thu,91.9,109.2,565.5,8,21.4,38,2.7,0,1.52 257 | 6,3,aug,thu,91.6,138.1,621.7,6.3,18.9,41,3.1,0,10.34 258 | 2,5,aug,thu,87.5,77,694.8,5,22.3,46,4,0,0 259 | 8,6,aug,sat,94.2,117.2,581.1,11,23.9,41,2.2,0,8.02 260 | 4,3,aug,sat,94.2,117.2,581.1,11,21.4,44,2.7,0,0.68 261 | 3,4,aug,sat,91.8,170.9,692.3,13.7,20.6,59,0.9,0,0 262 | 7,4,aug,sat,91.8,170.9,692.3,13.7,23.7,40,1.8,0,1.38 263 | 2,4,aug,mon,93.6,97.9,542,14.4,28.3,32,4,0,8.85 264 | 3,4,aug,fri,91.6,112.4,573,8.9,11.2,84,7.6,0,3.3 265 | 2,4,aug,fri,91.6,112.4,573,8.9,21.4,42,3.1,0,4.25 266 | 6,3,aug,fri,91.1,141.1,629.1,7.1,19.3,39,3.6,0,1.56 267 | 4,4,aug,fri,94.3,167.6,684.4,13,21.8,53,3.1,0,6.54 268 | 4,4,aug,tue,93.7,102.2,550.3,14.6,22.1,54,7.6,0,0.79 269 | 6,5,aug,tue,94.3,131.7,607.1,22.7,19.4,55,4,0,0.17 270 | 2,2,aug,tue,92.1,152.6,658.2,14.3,23.7,24,3.1,0,0 271 | 3,4,aug,tue,92.1,152.6,658.2,14.3,21,32,3.1,0,0 272 | 4,4,aug,tue,92.1,152.6,658.2,14.3,19.1,53,2.7,0,4.4 273 | 2,2,aug,tue,92.1,152.6,658.2,14.3,21.8,56,3.1,0,0.52 274 | 8,6,aug,tue,92.1,152.6,658.2,14.3,20.1,58,4.5,0,9.27 275 | 2,5,aug,tue,92.1,152.6,658.2,14.3,20.2,47,4,0,3.09 276 | 4,6,dec,sun,84.4,27.2,353.5,6.8,4.8,57,8.5,0,8.98 277 | 8,6,dec,wed,84,27.8,354.6,5.3,5.1,61,8,0,11.19 278 | 4,6,dec,thu,84.6,26.4,352,2,5.1,61,4.9,0,5.38 279 | 4,4,dec,mon,85.4,25.4,349.7,2.6,4.6,21,8.5,0,17.85 280 | 3,4,dec,mon,85.4,25.4,349.7,2.6,4.6,21,8.5,0,10.73 281 | 4,4,dec,mon,85.4,25.4,349.7,2.6,4.6,21,8.5,0,22.03 282 | 4,4,dec,mon,85.4,25.4,349.7,2.6,4.6,21,8.5,0,9.77 283 | 4,6,dec,fri,84.7,26.7,352.6,4.1,2.2,59,4.9,0,9.27 284 | 6,5,dec,tue,85.4,25.4,349.7,2.6,5.1,24,8.5,0,24.77 285 | 6,3,feb,sun,84.9,27.5,353.5,3.4,4.2,51,4,0,0 286 | 3,4,feb,wed,86.9,6.6,18.7,3.2,8.8,35,3.1,0,1.1 287 | 5,4,feb,fri,85.2,4.9,15.8,6.3,7.5,46,8,0,24.24 288 | 2,5,jul,sun,93.9,169.7,411.8,12.3,23.4,40,6.3,0,0 289 | 7,6,jul,wed,91.2,183.1,437.7,12.5,12.6,90,7.6,0.2,0 290 | 7,4,jul,sat,91.6,104.2,474.9,9,22.1,49,2.7,0,0 291 | 7,4,jul,sat,91.6,104.2,474.9,9,24.2,32,1.8,0,0 292 | 7,4,jul,sat,91.6,104.2,474.9,9,24.3,30,1.8,0,0 293 | 2,5,jul,sat,91.6,104.2,474.9,9,18.7,53,1.8,0,0 294 | 9,4,jul,sat,91.6,104.2,474.9,9,25.3,39,0.9,0,8 295 | 4,5,jul,fri,91.6,100.2,466.3,6.3,22.9,40,1.3,0,2.64 296 | 7,6,jul,tue,93.1,180.4,430.8,11,26.9,28,5.4,0,86.45 297 | 8,6,jul,tue,92.3,88.8,440.9,8.5,17.1,67,3.6,0,6.57 298 | 7,5,jun,sun,93.1,180.4,430.8,11,22.2,48,1.3,0,0 299 | 6,4,jun,sun,90.4,89.5,290.8,6.4,14.3,46,1.8,0,0.9 300 | 8,6,jun,sun,90.4,89.5,290.8,6.4,15.4,45,2.2,0,0 301 | 8,6,jun,wed,91.2,147.8,377.2,12.7,19.6,43,4.9,0,0 302 | 6,5,jun,sat,53.4,71,233.8,0.4,10.6,90,2.7,0,0 303 | 6,5,jun,mon,90.4,93.3,298.1,7.5,20.7,25,4.9,0,0 304 | 6,5,jun,mon,90.4,93.3,298.1,7.5,19.1,39,5.4,0,3.52 305 | 3,6,jun,fri,91.1,94.1,232.1,7.1,19.2,38,4.5,0,0 306 | 3,6,jun,fri,91.1,94.1,232.1,7.1,19.2,38,4.5,0,0 307 | 6,5,may,sat,85.1,28,113.8,3.5,11.3,94,4.9,0,0 308 | 1,4,sep,sun,89.6,84.1,714.3,5.7,19,52,2.2,0,0 309 | 7,4,sep,sun,89.6,84.1,714.3,5.7,17.1,53,5.4,0,0.41 310 | 3,4,sep,sun,89.6,84.1,714.3,5.7,23.8,35,3.6,0,5.18 311 | 2,4,sep,sun,92.4,105.8,758.1,9.9,16,45,1.8,0,0 312 | 2,4,sep,sun,92.4,105.8,758.1,9.9,24.9,27,2.2,0,0 313 | 7,4,sep,sun,92.4,105.8,758.1,9.9,25.3,27,2.7,0,0 314 | 6,3,sep,sun,92.4,105.8,758.1,9.9,24.8,28,1.8,0,14.29 315 | 2,4,sep,sun,50.4,46.2,706.6,0.4,12.2,78,6.3,0,0 316 | 6,5,sep,wed,92.6,115.4,777.1,8.8,24.3,27,4.9,0,0 317 | 4,4,sep,wed,92.6,115.4,777.1,8.8,19.7,41,1.8,0,1.58 318 | 3,4,sep,wed,91.2,134.7,817.5,7.2,18.5,30,2.7,0,0 319 | 4,5,sep,thu,92.4,96.2,739.4,8.6,18.6,24,5.8,0,0 320 | 4,4,sep,thu,92.4,96.2,739.4,8.6,19.2,24,4.9,0,3.78 321 | 6,5,sep,thu,92.8,119,783.5,7.5,21.6,27,2.2,0,0 322 | 5,4,sep,thu,92.8,119,783.5,7.5,21.6,28,6.3,0,4.41 323 | 6,3,sep,thu,92.8,119,783.5,7.5,18.9,34,7.2,0,34.36 324 | 1,4,sep,thu,92.8,119,783.5,7.5,16.8,28,4,0,7.21 325 | 6,5,sep,thu,92.8,119,783.5,7.5,16.8,28,4,0,1.01 326 | 3,5,sep,thu,90.7,136.9,822.8,6.8,12.9,39,2.7,0,2.18 327 | 6,5,sep,thu,88.1,53.3,726.9,5.4,13.7,56,1.8,0,4.42 328 | 1,4,sep,sat,92.2,102.3,751.5,8.4,24.2,27,3.1,0,0 329 | 5,4,sep,sat,92.2,102.3,751.5,8.4,24.1,27,3.1,0,0 330 | 6,5,sep,sat,92.2,102.3,751.5,8.4,21.2,32,2.2,0,0 331 | 6,5,sep,sat,92.2,102.3,751.5,8.4,19.7,35,1.8,0,0 332 | 4,3,sep,sat,92.2,102.3,751.5,8.4,23.5,27,4,0,3.33 333 | 3,3,sep,sat,92.2,102.3,751.5,8.4,24.2,27,3.1,0,6.58 334 | 7,4,sep,sat,91.2,124.4,795.3,8.5,21.5,28,4.5,0,15.64 335 | 4,4,sep,sat,91.2,124.4,795.3,8.5,17.1,41,2.2,0,11.22 336 | 1,4,sep,mon,92.1,87.7,721.1,9.5,18.1,54,3.1,0,2.13 337 | 2,3,sep,mon,91.6,108.4,764,6.2,18,51,5.4,0,0 338 | 4,3,sep,mon,91.6,108.4,764,6.2,9.8,86,1.8,0,0 339 | 7,4,sep,mon,91.6,108.4,764,6.2,19.3,44,2.2,0,0 340 | 6,3,sep,mon,91.6,108.4,764,6.2,23,34,2.2,0,56.04 341 | 8,6,sep,mon,91.6,108.4,764,6.2,22.7,35,2.2,0,7.48 342 | 2,4,sep,mon,91.6,108.4,764,6.2,20.4,41,1.8,0,1.47 343 | 2,5,sep,mon,91.6,108.4,764,6.2,19.3,44,2.2,0,3.93 344 | 8,6,sep,mon,91.9,111.7,770.3,6.5,15.7,51,2.2,0,0 345 | 6,3,sep,mon,91.5,130.1,807.1,7.5,20.6,37,1.8,0,0 346 | 8,6,sep,mon,91.5,130.1,807.1,7.5,15.9,51,4.5,0,2.18 347 | 6,3,sep,mon,91.5,130.1,807.1,7.5,12.2,66,4.9,0,6.1 348 | 2,2,sep,mon,91.5,130.1,807.1,7.5,16.8,43,3.1,0,5.83 349 | 1,4,sep,mon,91.5,130.1,807.1,7.5,21.3,35,2.2,0,28.19 350 | 5,4,sep,fri,92.1,99,745.3,9.6,10.1,75,3.6,0,0 351 | 3,4,sep,fri,92.1,99,745.3,9.6,17.4,57,4.5,0,0 352 | 5,4,sep,fri,92.1,99,745.3,9.6,12.8,64,3.6,0,1.64 353 | 5,4,sep,fri,92.1,99,745.3,9.6,10.1,75,3.6,0,3.71 354 | 4,4,sep,fri,92.1,99,745.3,9.6,15.4,53,6.3,0,7.31 355 | 7,4,sep,fri,92.1,99,745.3,9.6,20.6,43,3.6,0,2.03 356 | 7,4,sep,fri,92.1,99,745.3,9.6,19.8,47,2.7,0,1.72 357 | 7,4,sep,fri,92.1,99,745.3,9.6,18.7,50,2.2,0,5.97 358 | 4,4,sep,fri,92.1,99,745.3,9.6,20.8,35,4.9,0,13.06 359 | 4,4,sep,fri,92.1,99,745.3,9.6,20.8,35,4.9,0,1.26 360 | 6,3,sep,fri,92.5,122,789.7,10.2,15.9,55,3.6,0,0 361 | 6,3,sep,fri,92.5,122,789.7,10.2,19.7,39,2.7,0,0 362 | 1,4,sep,fri,92.5,122,789.7,10.2,21.1,39,2.2,0,8.12 363 | 6,5,sep,fri,92.5,122,789.7,10.2,18.4,42,2.2,0,1.09 364 | 4,3,sep,fri,92.5,122,789.7,10.2,17.3,45,4,0,3.94 365 | 7,4,sep,fri,88.2,55.2,732.3,11.6,15.2,64,3.1,0,0.52 366 | 4,3,sep,tue,91.9,111.7,770.3,6.5,15.9,53,2.2,0,2.93 367 | 6,5,sep,tue,91.9,111.7,770.3,6.5,21.1,35,2.7,0,5.65 368 | 6,5,sep,tue,91.9,111.7,770.3,6.5,19.6,45,3.1,0,20.03 369 | 4,5,sep,tue,91.1,132.3,812.1,12.5,15.9,38,5.4,0,1.75 370 | 4,5,sep,tue,91.1,132.3,812.1,12.5,16.4,27,3.6,0,0 371 | 6,5,sep,sat,91.2,94.3,744.4,8.4,16.8,47,4.9,0,12.64 372 | 4,5,sep,sun,91,276.3,825.1,7.1,13.8,77,7.6,0,0 373 | 7,4,sep,sun,91,276.3,825.1,7.1,13.8,77,7.6,0,11.06 374 | 3,4,jul,wed,91.9,133.6,520.5,8,14.2,58,4,0,0 375 | 4,5,aug,sun,92,203.2,664.5,8.1,10.4,75,0.9,0,0 376 | 5,4,aug,thu,94.8,222.4,698.6,13.9,20.3,42,2.7,0,0 377 | 6,5,sep,fri,90.3,290,855.3,7.4,10.3,78,4,0,18.3 378 | 6,5,sep,sat,91.2,94.3,744.4,8.4,15.4,57,4.9,0,39.35 379 | 8,6,aug,mon,92.1,207,672.6,8.2,21.1,54,2.2,0,0 380 | 2,2,aug,sat,93.7,231.1,715.1,8.4,21.9,42,2.2,0,174.63 381 | 6,5,mar,thu,90.9,18.9,30.6,8,8.7,51,5.8,0,0 382 | 4,5,jan,sun,18.7,1.1,171.4,0,5.2,100,0.9,0,0 383 | 5,4,jul,wed,93.7,101.3,458.8,11.9,19.3,39,7.2,0,7.73 384 | 8,6,aug,thu,90.7,194.1,643,6.8,16.2,63,2.7,0,16.33 385 | 8,6,aug,wed,95.2,217.7,690,18,28.2,29,1.8,0,5.86 386 | 9,6,aug,thu,91.6,248.4,753.8,6.3,20.5,58,2.7,0,42.87 387 | 8,4,aug,sat,91.6,273.8,819.1,7.7,21.3,44,4.5,0,12.18 388 | 2,4,aug,sun,91.6,181.3,613,7.6,20.9,50,2.2,0,16 389 | 3,4,sep,sun,90.5,96.7,750.5,11.4,20.6,55,5.4,0,24.59 390 | 5,5,mar,thu,90.9,18.9,30.6,8,11.6,48,5.4,0,0 391 | 6,4,aug,fri,94.8,227,706.7,12,23.3,34,3.1,0,28.74 392 | 7,4,aug,fri,94.8,227,706.7,12,23.3,34,3.1,0,0 393 | 7,4,feb,mon,84.7,9.5,58.3,4.1,7.5,71,6.3,0,9.96 394 | 8,6,sep,fri,91.1,91.3,738.1,7.2,20.7,46,2.7,0,30.18 395 | 1,3,sep,sun,91,276.3,825.1,7.1,21.9,43,4,0,70.76 396 | 2,4,mar,tue,93.4,15,25.6,11.4,15.2,19,7.6,0,0 397 | 6,5,feb,mon,84.1,4.6,46.7,2.2,5.3,68,1.8,0,0 398 | 4,5,feb,sun,85,9,56.9,3.5,10.1,62,1.8,0,51.78 399 | 4,3,sep,sun,90.5,96.7,750.5,11.4,20.4,55,4.9,0,3.64 400 | 5,6,aug,sun,91.6,181.3,613,7.6,24.3,33,3.6,0,3.63 401 | 1,2,aug,sat,93.7,231.1,715.1,8.4,25.9,32,3.1,0,0 402 | 9,5,jun,wed,93.3,49.5,297.7,14,28,34,4.5,0,0 403 | 9,5,jun,wed,93.3,49.5,297.7,14,28,34,4.5,0,8.16 404 | 3,4,sep,thu,91.1,88.2,731.7,8.3,22.8,46,4,0,4.95 405 | 9,9,aug,fri,94.8,227,706.7,12,25,36,4,0,0 406 | 8,6,aug,thu,90.7,194.1,643,6.8,21.3,41,3.6,0,0 407 | 2,4,sep,wed,87.9,84.8,725.1,3.7,21.8,34,2.2,0,6.04 408 | 2,2,aug,tue,94.6,212.1,680.9,9.5,27.9,27,2.2,0,0 409 | 6,5,sep,sat,87.1,291.3,860.6,4,17,67,4.9,0,3.95 410 | 4,5,feb,sat,84.7,8.2,55,2.9,14.2,46,4,0,0 411 | 4,3,sep,fri,90.3,290,855.3,7.4,19.9,44,3.1,0,7.8 412 | 1,4,jul,tue,92.3,96.2,450.2,12.1,23.4,31,5.4,0,0 413 | 6,3,feb,fri,84.1,7.3,52.8,2.7,14.7,42,2.7,0,0 414 | 7,4,feb,fri,84.6,3.2,43.6,3.3,8.2,53,9.4,0,4.62 415 | 9,4,jul,mon,92.3,92.1,442.1,9.8,22.8,27,4.5,0,1.63 416 | 7,5,aug,sat,93.7,231.1,715.1,8.4,26.4,33,3.6,0,0 417 | 5,4,aug,sun,93.6,235.1,723.1,10.1,24.1,50,4,0,0 418 | 8,6,aug,thu,94.8,222.4,698.6,13.9,27.5,27,4.9,0,746.28 419 | 6,3,jul,tue,92.7,164.1,575.8,8.9,26.3,39,3.1,0,7.02 420 | 6,5,mar,wed,93.4,17.3,28.3,9.9,13.8,24,5.8,0,0 421 | 2,4,aug,sun,92,203.2,664.5,8.1,24.9,42,5.4,0,2.44 422 | 2,5,aug,sun,91.6,181.3,613,7.6,24.8,36,4,0,3.05 423 | 8,8,aug,wed,91.7,191.4,635.9,7.8,26.2,36,4.5,0,185.76 424 | 2,4,aug,wed,95.2,217.7,690,18,30.8,19,4.5,0,0 425 | 8,6,jul,sun,88.9,263.1,795.9,5.2,29.3,27,3.6,0,6.3 426 | 1,3,sep,sat,91.2,94.3,744.4,8.4,22.3,48,4,0,0.72 427 | 8,6,aug,sat,93.7,231.1,715.1,8.4,26.9,31,3.6,0,4.96 428 | 2,2,aug,thu,91.6,248.4,753.8,6.3,20.4,56,2.2,0,0 429 | 8,6,aug,thu,91.6,248.4,753.8,6.3,20.4,56,2.2,0,0 430 | 2,4,aug,mon,92.1,207,672.6,8.2,27.9,33,2.2,0,2.35 431 | 1,3,aug,thu,94.8,222.4,698.6,13.9,26.2,34,5.8,0,0 432 | 3,4,aug,sun,91.6,181.3,613,7.6,24.6,44,4,0,3.2 433 | 7,4,sep,thu,89.7,287.2,849.3,6.8,19.4,45,3.6,0,0 434 | 1,3,aug,sat,92.1,178,605.3,9.6,23.3,40,4,0,6.36 435 | 8,6,aug,thu,94.8,222.4,698.6,13.9,23.9,38,6.7,0,0 436 | 2,4,aug,sun,93.6,235.1,723.1,10.1,20.9,66,4.9,0,15.34 437 | 1,4,aug,fri,90.6,269.8,811.2,5.5,22.2,45,3.6,0,0 438 | 2,5,jul,sat,90.8,84.7,376.6,5.6,23.8,51,1.8,0,0 439 | 8,6,aug,mon,92.1,207,672.6,8.2,26.8,35,1.3,0,0.54 440 | 8,6,aug,sat,89.4,253.6,768.4,9.7,14.2,73,2.7,0,0 441 | 2,5,aug,sat,93.7,231.1,715.1,8.4,23.6,53,4,0,6.43 442 | 1,3,sep,fri,91.1,91.3,738.1,7.2,19.1,46,2.2,0,0.33 443 | 5,4,sep,fri,90.3,290,855.3,7.4,16.2,58,3.6,0,0 444 | 8,6,aug,mon,92.1,207,672.6,8.2,25.5,29,1.8,0,1.23 445 | 6,5,apr,mon,87.9,24.9,41.6,3.7,10.9,64,3.1,0,3.35 446 | 1,2,jul,fri,90.7,80.9,368.3,16.8,14.8,78,8,0,0 447 | 2,5,sep,fri,90.3,290,855.3,7.4,16.2,58,3.6,0,9.96 448 | 5,5,aug,sun,94,47.9,100.7,10.7,17.3,80,4.5,0,0 449 | 6,5,aug,sun,92,203.2,664.5,8.1,19.1,70,2.2,0,0 450 | 3,4,mar,wed,93.4,17.3,28.3,9.9,8.9,35,8,0,0 451 | 7,4,sep,wed,89.7,284.9,844,10.1,10.5,77,4,0,0 452 | 7,4,aug,sun,91.6,181.3,613,7.6,19.3,61,4.9,0,0 453 | 4,5,aug,wed,95.2,217.7,690,18,23.4,49,5.4,0,6.43 454 | 1,4,aug,fri,90.5,196.8,649.9,16.3,11.8,88,4.9,0,9.71 455 | 7,4,aug,mon,91.5,238.2,730.6,7.5,17.7,65,4,0,0 456 | 4,5,aug,thu,89.4,266.2,803.3,5.6,17.4,54,3.1,0,0 457 | 3,4,aug,thu,91.6,248.4,753.8,6.3,16.8,56,3.1,0,0 458 | 3,4,jul,mon,94.6,160,567.2,16.7,17.9,48,2.7,0,0 459 | 2,4,aug,thu,91.6,248.4,753.8,6.3,16.6,59,2.7,0,0 460 | 1,4,aug,wed,91.7,191.4,635.9,7.8,19.9,50,4,0,82.75 461 | 8,6,aug,sat,93.7,231.1,715.1,8.4,18.9,64,4.9,0,3.32 462 | 7,4,aug,sat,91.6,273.8,819.1,7.7,15.5,72,8,0,1.94 463 | 2,5,aug,sat,93.7,231.1,715.1,8.4,18.9,64,4.9,0,0 464 | 8,6,aug,sat,93.7,231.1,715.1,8.4,18.9,64,4.9,0,0 465 | 1,4,sep,sun,91,276.3,825.1,7.1,14.5,76,7.6,0,3.71 466 | 6,5,feb,tue,75.1,4.4,16.2,1.9,4.6,82,6.3,0,5.39 467 | 6,4,feb,tue,75.1,4.4,16.2,1.9,5.1,77,5.4,0,2.14 468 | 2,2,feb,sat,79.5,3.6,15.3,1.8,4.6,59,0.9,0,6.84 469 | 6,5,mar,mon,87.2,15.1,36.9,7.1,10.2,45,5.8,0,3.18 470 | 3,4,mar,wed,90.2,18.5,41.1,7.3,11.2,41,5.4,0,5.55 471 | 6,5,mar,thu,91.3,20.6,43.5,8.5,13.3,27,3.6,0,6.61 472 | 6,3,apr,sun,91,14.6,25.6,12.3,13.7,33,9.4,0,61.13 473 | 5,4,apr,sun,91,14.6,25.6,12.3,17.6,27,5.8,0,0 474 | 4,3,may,fri,89.6,25.4,73.7,5.7,18,40,4,0,38.48 475 | 8,3,jun,mon,88.2,96.2,229,4.7,14.3,79,4,0,1.94 476 | 9,4,jun,sat,90.5,61.1,252.6,9.4,24.5,50,3.1,0,70.32 477 | 4,3,jun,thu,93,103.8,316.7,10.8,26.4,35,2.7,0,10.08 478 | 2,5,jun,thu,93.7,121.7,350.2,18,22.7,40,9.4,0,3.19 479 | 4,3,jul,thu,93.5,85.3,395,9.9,27.2,28,1.3,0,1.76 480 | 4,3,jul,sun,93.7,101.3,423.4,14.7,26.1,45,4,0,7.36 481 | 7,4,jul,sun,93.7,101.3,423.4,14.7,18.2,82,4.5,0,2.21 482 | 7,4,jul,mon,89.2,103.9,431.6,6.4,22.6,57,4.9,0,278.53 483 | 9,9,jul,thu,93.2,114.4,560,9.5,30.2,25,4.5,0,2.75 484 | 4,3,jul,thu,93.2,114.4,560,9.5,30.2,22,4.9,0,0 485 | 3,4,aug,sun,94.9,130.3,587.1,14.1,23.4,40,5.8,0,1.29 486 | 8,6,aug,sun,94.9,130.3,587.1,14.1,31,27,5.4,0,0 487 | 2,5,aug,sun,94.9,130.3,587.1,14.1,33.1,25,4,0,26.43 488 | 2,4,aug,mon,95,135.5,596.3,21.3,30.6,28,3.6,0,2.07 489 | 5,4,aug,tue,95.1,141.3,605.8,17.7,24.1,43,6.3,0,2 490 | 5,4,aug,tue,95.1,141.3,605.8,17.7,26.4,34,3.6,0,16.4 491 | 4,4,aug,tue,95.1,141.3,605.8,17.7,19.4,71,7.6,0,46.7 492 | 4,4,aug,wed,95.1,141.3,605.8,17.7,20.6,58,1.3,0,0 493 | 4,4,aug,wed,95.1,141.3,605.8,17.7,28.7,33,4,0,0 494 | 4,4,aug,thu,95.8,152,624.1,13.8,32.4,21,4.5,0,0 495 | 1,3,aug,fri,95.9,158,633.6,11.3,32.4,27,2.2,0,0 496 | 1,3,aug,fri,95.9,158,633.6,11.3,27.5,29,4.5,0,43.32 497 | 6,6,aug,sat,96,164,643,14,30.8,30,4.9,0,8.59 498 | 6,6,aug,mon,96.2,175.5,661.8,16.8,23.9,42,2.2,0,0 499 | 4,5,aug,mon,96.2,175.5,661.8,16.8,32.6,26,3.1,0,2.77 500 | 3,4,aug,tue,96.1,181.1,671.2,14.3,32.3,27,2.2,0,14.68 501 | 6,5,aug,tue,96.1,181.1,671.2,14.3,33.3,26,2.7,0,40.54 502 | 7,5,aug,tue,96.1,181.1,671.2,14.3,27.3,63,4.9,6.4,10.82 503 | 8,6,aug,tue,96.1,181.1,671.2,14.3,21.6,65,4.9,0.8,0 504 | 7,5,aug,tue,96.1,181.1,671.2,14.3,21.6,65,4.9,0.8,0 505 | 4,4,aug,tue,96.1,181.1,671.2,14.3,20.7,69,4.9,0.4,0 506 | 2,4,aug,wed,94.5,139.4,689.1,20,29.2,30,4.9,0,1.95 507 | 4,3,aug,wed,94.5,139.4,689.1,20,28.9,29,4.9,0,49.59 508 | 1,2,aug,thu,91,163.2,744.4,10.1,26.7,35,1.8,0,5.8 509 | 1,2,aug,fri,91,166.9,752.6,7.1,18.5,73,8.5,0,0 510 | 2,4,aug,fri,91,166.9,752.6,7.1,25.9,41,3.6,0,0 511 | 1,2,aug,fri,91,166.9,752.6,7.1,25.9,41,3.6,0,0 512 | 5,4,aug,fri,91,166.9,752.6,7.1,21.1,71,7.6,1.4,2.17 513 | 6,5,aug,fri,91,166.9,752.6,7.1,18.2,62,5.4,0,0.43 514 | 8,6,aug,sun,81.6,56.7,665.6,1.9,27.8,35,2.7,0,0 515 | 4,3,aug,sun,81.6,56.7,665.6,1.9,27.8,32,2.7,0,6.44 516 | 2,4,aug,sun,81.6,56.7,665.6,1.9,21.9,71,5.8,0,54.29 517 | 7,4,aug,sun,81.6,56.7,665.6,1.9,21.2,70,6.7,0,11.16 518 | 1,4,aug,sat,94.4,146,614.7,11.3,25.6,42,4,0,0 519 | 6,3,nov,tue,79.5,3,106.7,1.1,11.8,31,4.5,0,0 520 | -------------------------------------------------------------------------------- /dataframe_sql/sql_select_query.py: -------------------------------------------------------------------------------- 1 | """ 2 | Convert dataframe_sql statement to run on pandas dataframes 3 | """ 4 | import ibis 5 | from pandas import DataFrame 6 | from sql_to_ibis import ( 7 | query as ibis_query, 8 | register_temp_table as ibis_register, 9 | remove_temp_table as ibis_remove, 10 | ) 11 | 12 | IBIS_PANDAS_CLIENT = ibis.pandas.PandasClient({}) 13 | 14 | 15 | def register_temp_table(frame: DataFrame, table_name: str): 16 | """ 17 | Registers related metadata from a :class: ~`pandas.DataFrame` for use with SQL 18 | 19 | Parameters 20 | ---------- 21 | frame : :class: ~`pandas.DataFrame` 22 | :class: ~`pandas.DataFrame` object to register 23 | table_name : str 24 | String that will be used to represent the :class: ~`pandas.DataFrame` in SQL 25 | 26 | See Also 27 | -------- 28 | remove_temp_table : Removes all registered metadata related to a table name 29 | query : Query a registered :class: ~`pandas.DataFrame` using an SQL interface 30 | 31 | Examples 32 | -------- 33 | >>> df = pd.read_csv("a_csv_file.csv") 34 | >>> register_temp_table(df, "my_table_name") 35 | """ 36 | ibis_register( 37 | ibis.pandas.from_dataframe(frame, name=table_name, client=IBIS_PANDAS_CLIENT), 38 | table_name, 39 | ) 40 | 41 | 42 | def remove_temp_table(table_name: str): 43 | """ 44 | Removes all registered metadata related to a table name 45 | 46 | Parameters 47 | ---------- 48 | table_name : str 49 | Name of the table to be removed 50 | 51 | See Also 52 | -------- 53 | register_temp_table : Registers related metadata from a :class: ~`pandas.DataFrame` 54 | for use with SQL 55 | query : Query a registered :class: ~`pandas.DataFrame` using an SQL interface 56 | 57 | Examples 58 | -------- 59 | >>> remove_temp_table("my_table_name") 60 | """ 61 | ibis_remove(table_name) 62 | 63 | 64 | def query(sql: str) -> DataFrame: 65 | """ 66 | Query a registered :class: ~`pandas.DataFrame` using an SQL interface 67 | 68 | Query a registered :class: ~`pandas.DataFrame` using the following interface based 69 | on the following general syntax: 70 | SELECT 71 | col_name | expr [, col_name | expr] ... 72 | [FROM table_reference [, table_reference | join_expr]] 73 | [WHERE where_condition] 74 | [GROUP BY {col_name | expr }, ... ] 75 | [HAVING where_condition] 76 | [ORDER BY {col_name | expr | position} 77 | [ASC | DESC], ... ] 78 | [LIMIT {[offset,] row_count | row_count OFFSET offset}] 79 | [ (UNION ( [DISTINCT] | ALL ) | INTERSECT ( [DISTINCT] | ALL ) | 80 | EXCEPT ( [DISTINCT] | ALL ) ] 81 | select_expr 82 | 83 | 84 | Parameters 85 | ---------- 86 | sql : str 87 | SQL string querying the :class: ~`pandas.DataFrame` 88 | 89 | Returns 90 | ------- 91 | :class: ~`pandas.DataFrame` 92 | The :class: ~`pandas.DataFrame` resulting from the SQL query provided 93 | 94 | 95 | """ 96 | return ibis_query(sql).execute() 97 | -------------------------------------------------------------------------------- /dataframe_sql/tests/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zbrookle/dataframe_sql/816d00e4e5cbbf1be8bde42699d14e184a292c96/dataframe_sql/tests/__init__.py -------------------------------------------------------------------------------- /dataframe_sql/tests/markers.py: -------------------------------------------------------------------------------- 1 | from ibis.common.exceptions import OperationNotDefinedError 2 | import pytest 3 | 4 | ibis_not_implemented = pytest.mark.xfail( 5 | raises=(OperationNotDefinedError, NotImplementedError, ValueError), 6 | reason="Not implemented in ibis", 7 | ) 8 | 9 | ibis_next_bug_fix = pytest.mark.xfail(reason="Bug fixed in next ibis release") 10 | -------------------------------------------------------------------------------- /dataframe_sql/tests/performance_tests.py: -------------------------------------------------------------------------------- 1 | import inspect 2 | import re 3 | import time 4 | from types import FunctionType 5 | from typing import List 6 | 7 | from dataframe_sql.tests.pandas_sql_functionality_test import * # noqa 8 | 9 | DONT_TEST = [ 10 | test_add_remove_temp_table, # noqa 11 | test_for_valid_query, # noqa 12 | test_for_non_existent_table, # noqa 13 | ] 14 | INDENT_REGEX = re.compile(r"(\t|\s{4})(?P.*)") 15 | 16 | 17 | def get_pandas_tests(): 18 | global_dict = globals() 19 | test_list = [] 20 | for global_key in global_dict: 21 | global_var = global_dict[global_key] 22 | if ( 23 | isinstance(global_var, FunctionType) 24 | and "test" in global_var.__name__ 25 | and global_var not in DONT_TEST 26 | ): 27 | test_list.append(global_var) 28 | 29 | return test_list 30 | 31 | 32 | def get_function_code(function_object: FunctionType) -> List[str]: 33 | """ 34 | Return the function code only for the function (not def name or docstring) 35 | :param function_object: 36 | :return: 37 | """ 38 | doc_string = function_object.__doc__ 39 | function_code = inspect.getsource(function_object) 40 | remove_doc_string = function_code.replace(f'"""{doc_string}"""', "") 41 | remove_function_name = remove_doc_string.split("\n")[1:] 42 | return remove_function_name 43 | 44 | 45 | def fix_code_indent(function_code: List[str]): 46 | """ 47 | Return code indented back one to account for the def indent 48 | :param function_code: 49 | :return: 50 | """ 51 | for i, code_line in enumerate(function_code): 52 | match = INDENT_REGEX.match(code_line) 53 | if match: 54 | function_code[i] = match.group("code") 55 | 56 | 57 | def remove_assertion(function_code: List[str]): 58 | """ 59 | Remove assertion lines 60 | :param function_code: 61 | :return: 62 | """ 63 | for i, code_line in enumerate(function_code): 64 | if code_line == "tm.assert_frame_equal(pandas_frame, my_frame)": 65 | function_code[i] = "" 66 | 67 | 68 | def find_end_paren(function_code: str, start: int): 69 | """ 70 | Find the end location given a starting parenthesis location 71 | :param function_code: 72 | :param start: 73 | :return: 74 | """ 75 | parentheses = [] 76 | for i, character in enumerate(function_code[start:]): 77 | if character == "(": 78 | parentheses.append(character) 79 | elif character == ")": 80 | parentheses.pop() 81 | if not parentheses: 82 | return i + start 83 | 84 | 85 | def split_into_pandas_and_dataframe_sql(function_code: str): 86 | """ 87 | Returns the code split into the half using dataframe_sql and the half using 88 | the direct pandas api 89 | :param function_code: 90 | :return: 91 | """ 92 | data_frame_sql_code_init = "my_frame = query" 93 | dataframe_sql_code_start = function_code.find(data_frame_sql_code_init) 94 | text_offset = len(data_frame_sql_code_init) 95 | dataframe_sql_code_call_first_paren = dataframe_sql_code_start + text_offset 96 | end_paren = find_end_paren(function_code, dataframe_sql_code_call_first_paren) + 1 97 | 98 | dataframe_sql_code = function_code[dataframe_sql_code_start:end_paren] 99 | pandas_code = function_code[end_paren:] 100 | return dataframe_sql_code, pandas_code 101 | 102 | 103 | def timeit(function: FunctionType): 104 | """ 105 | Wrapper for measuring time based performance 106 | :param function: 107 | :return: 108 | """ 109 | 110 | def timed(*args, **kw): 111 | ts = time.time() 112 | result = function(*args, **kw) # noqa 113 | te = time.time() 114 | 115 | total_time = te - ts 116 | print(f"func: {function.__name__} took {total_time}") 117 | return total_time 118 | 119 | return timed 120 | 121 | 122 | def test_performance(dataframe_sql_code: str, pandas_code: str): 123 | @timeit 124 | def dataframe_sql_time(): 125 | exec(dataframe_sql_code) # noqa 126 | 127 | @timeit 128 | def pandas_code_time(): 129 | exec(pandas_code) # noqa 130 | 131 | time_diff = dataframe_sql_time() - pandas_code_time() 132 | print(f"Time difference was {time_diff}\n") 133 | 134 | 135 | if __name__ == "__main__": 136 | register_env_tables() # noqa 137 | 138 | tests = get_pandas_tests() 139 | for test in tests[3:]: 140 | print(f"######### {test.__name__} #########") 141 | code = get_function_code(test) 142 | fix_code_indent(code) 143 | remove_assertion(code) 144 | code = list(filter(lambda x: x, code)) 145 | code_string = "\n".join(code) 146 | 147 | code = split_into_pandas_and_dataframe_sql(code_string) 148 | try: 149 | test_performance(*code) 150 | except Exception as err: 151 | print("Code Failed") 152 | print("#####################") 153 | print("#### Your Code ####") 154 | print(code[0]) 155 | print("#### Pandas Code ####") 156 | print(code[1]) 157 | print("#####################") 158 | raise err 159 | 160 | remove_env_tables() # noqa 161 | -------------------------------------------------------------------------------- /dataframe_sql/tests/utils.py: -------------------------------------------------------------------------------- 1 | """ 2 | Shared functions among the tests like setting up test environment 3 | """ 4 | from pathlib import Path 5 | 6 | from pandas import DataFrame, read_csv 7 | import pytest 8 | 9 | from dataframe_sql import register_temp_table, remove_temp_table 10 | 11 | DATA_PATH = Path(__file__).parent.parent / "data" 12 | 13 | 14 | # Import the data for testing 15 | FOREST_FIRES = read_csv(DATA_PATH / "forestfires.csv") 16 | DIGIMON_MON_LIST = read_csv(DATA_PATH / "DigiDB_digimonlist.csv") 17 | DIGIMON_MOVE_LIST = read_csv(DATA_PATH / "DigiDB_movelist.csv") 18 | DIGIMON_SUPPORT_LIST = read_csv(DATA_PATH / "DigiDB_supportlist.csv") 19 | AVOCADO = read_csv(DATA_PATH / "avocado.csv") 20 | 21 | # Name change is for name interference 22 | DIGIMON_MON_LIST["mon_attribute"] = DIGIMON_MON_LIST["Attribute"] 23 | DIGIMON_MOVE_LIST["move_attribute"] = DIGIMON_MOVE_LIST["Attribute"] 24 | 25 | 26 | def register_env_tables(): 27 | """ 28 | Returns all globals but in lower case 29 | :return: 30 | """ 31 | for variable_name in globals(): 32 | variable = globals()[variable_name] 33 | if isinstance(variable, DataFrame): 34 | register_temp_table(frame=variable, table_name=variable_name) 35 | 36 | 37 | def remove_env_tables(): 38 | """ 39 | Remove all env tables 40 | :return: 41 | """ 42 | for variable_name in globals(): 43 | variable = globals()[variable_name] 44 | if isinstance(variable, DataFrame): 45 | remove_temp_table(table_name=variable_name) 46 | 47 | 48 | def fix_naming_inconsistencies(pandas_frame: DataFrame) -> DataFrame: 49 | pandas_frame = pandas_frame.rename( 50 | columns={"Type_y": "DIGIMON_MOVE_LIST.Type", "Type_x": "DIGIMON_MON_LIST.Type"} 51 | ) 52 | if "Attribute_x" in pandas_frame.columns: 53 | pandas_frame = pandas_frame.rename( 54 | columns={ 55 | "Attribute_y": "DIGIMON_MOVE_LIST.Attribute", 56 | "Attribute_x": "DIGIMON_MON_LIST.Attribute", 57 | } 58 | ) 59 | if "Attribute" in pandas_frame.columns: 60 | pandas_frame["DIGIMON_MOVE_LIST.Attribute"] = pandas_frame["Attribute"] 61 | pandas_frame = pandas_frame.rename( 62 | columns={"Attribute": "DIGIMON_MON_LIST.Attribute"} 63 | ) 64 | pandas_frame = pandas_frame[ 65 | [ 66 | "Number", 67 | "Digimon", 68 | "Stage", 69 | "DIGIMON_MON_LIST.Type", 70 | "DIGIMON_MON_LIST.Attribute", 71 | "Memory", 72 | "Equip Slots", 73 | "Lv 50 HP", 74 | "Lv50 SP", 75 | "Lv50 Atk", 76 | "Lv50 Def", 77 | "Lv50 Int", 78 | "Lv50 Spd", 79 | "mon_attribute", 80 | "Move", 81 | "SP Cost", 82 | "DIGIMON_MOVE_LIST.Type", 83 | "Power", 84 | "DIGIMON_MOVE_LIST.Attribute", 85 | "Inheritable", 86 | "Description", 87 | "move_attribute", 88 | ] 89 | ] 90 | return pandas_frame 91 | 92 | 93 | join_params = pytest.mark.parametrize( 94 | ("sql_join", "pandas_join"), 95 | [ 96 | ("", "inner"), 97 | ("inner", "inner"), 98 | ("full outer", "outer"), 99 | ("full", "outer"), 100 | ("left outer", "left"), 101 | ("left", "left"), 102 | ("right outer", "right"), 103 | ("right", "right"), 104 | ], 105 | ) 106 | -------------------------------------------------------------------------------- /environment.yml: -------------------------------------------------------------------------------- 1 | name: dataframe_sql 2 | channels: 3 | - conda-forge 4 | dependencies: 5 | # required 6 | - pandas>=1.0.1 7 | 8 | # code checks 9 | - black=19.10b0 10 | - flake8 11 | - flake8-comprehensions>=3.1.0 # used by flake8, linting of unnecessary comprehensions 12 | - isort # check that imports are in the right order 13 | - mypy=0.761 14 | - pycodestyle # used by flake8 15 | 16 | # testing 17 | - freezegun 18 | - pytest>=5.0.1 19 | - pytest-xdist>=1.21 20 | 21 | - pip 22 | - pip: 23 | - black 24 | - sql-to-ibis==0.4.0 25 | 26 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | sql-to-ibis==0.4.0 2 | -------------------------------------------------------------------------------- /scripts/validate_docstrings.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """ 3 | Analyze docstrings to detect errors. 4 | 5 | If no argument is provided, it does a quick check of docstrings and returns 6 | a csv with all API functions and results of basic checks. 7 | 8 | If a function or method is provided in the form "pandas.function", 9 | "pandas.module.class.method", etc. a list of all errors in the docstring for 10 | the specified function or method. 11 | 12 | Usage:: 13 | $ ./validate_docstrings.py 14 | $ ./validate_docstrings.py pandas.DataFrame.head 15 | """ 16 | import argparse 17 | import ast 18 | import collections 19 | import doctest 20 | import functools 21 | import glob 22 | import importlib 23 | import inspect 24 | import json 25 | import os 26 | import pydoc 27 | import re 28 | import sys 29 | import tempfile 30 | import textwrap 31 | 32 | import flake8.main.application 33 | 34 | try: 35 | from io import StringIO 36 | except ImportError: 37 | from cStringIO import StringIO 38 | 39 | # Template backend makes matplotlib to not plot anything. This is useful 40 | # to avoid that plot windows are open from the doctests while running the 41 | # script. Setting here before matplotlib is loaded. 42 | # We don't warn for the number of open plots, as none is actually being opened 43 | os.environ["MPLBACKEND"] = "Template" 44 | import matplotlib # noqa: E402 isort:skip 45 | 46 | matplotlib.rc("figure", max_open_warning=10000) 47 | 48 | import numpy # noqa: E402 isort:skip 49 | 50 | BASE_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 51 | 52 | sys.path.insert(0, os.path.join(BASE_PATH)) 53 | import pandas # noqa: E402 isort:skip 54 | 55 | sys.path.insert(1, os.path.join(BASE_PATH, "doc", "sphinxext")) 56 | from numpydoc.docscrape import NumpyDocString # noqa: E402 isort:skip 57 | from pandas.io.formats.printing import pprint_thing # noqa: E402 isort:skip 58 | 59 | 60 | PRIVATE_CLASSES = ["NDFrame", "IndexOpsMixin"] 61 | DIRECTIVES = ["versionadded", "versionchanged", "deprecated"] 62 | DIRECTIVE_PATTERN = re.compile(rf"^\s*\.\. ({'|'.join(DIRECTIVES)})(?!::)", re.I | re.M) 63 | ALLOWED_SECTIONS = [ 64 | "Parameters", 65 | "Attributes", 66 | "Methods", 67 | "Returns", 68 | "Yields", 69 | "Other Parameters", 70 | "Raises", 71 | "Warns", 72 | "See Also", 73 | "Notes", 74 | "References", 75 | "Examples", 76 | ] 77 | ERROR_MSGS = { 78 | "GL01": "Docstring text (summary) should start in the line immediately " 79 | "after the opening quotes (not in the same line, or leaving a " 80 | "blank line in between)", 81 | "GL02": "Closing quotes should be placed in the line after the last text " 82 | "in the docstring (do not close the quotes in the same line as " 83 | "the text, or leave a blank line between the last text and the " 84 | "quotes)", 85 | "GL03": "Double line break found; please use only one blank line to " 86 | "separate sections or paragraphs, and do not leave blank lines " 87 | "at the end of docstrings", 88 | "GL04": "Private classes ({mentioned_private_classes}) should not be " 89 | "mentioned in public docstrings", 90 | "GL05": 'Tabs found at the start of line "{line_with_tabs}", please use ' 91 | "whitespace only", 92 | "GL06": 'Found unknown section "{section}". Allowed sections are: ' 93 | "{allowed_sections}", 94 | "GL07": "Sections are in the wrong order. Correct order is: {correct_sections}", 95 | "GL08": "The object does not have a docstring", 96 | "GL09": "Deprecation warning should precede extended summary", 97 | "GL10": "reST directives {directives} must be followed by two colons", 98 | "SS01": "No summary found (a short summary in a single line should be " 99 | "present at the beginning of the docstring)", 100 | "SS02": "Summary does not start with a capital letter", 101 | "SS03": "Summary does not end with a period", 102 | "SS04": "Summary contains heading whitespaces", 103 | "SS05": "Summary must start with infinitive verb, not third person " 104 | '(e.g. use "Generate" instead of "Generates")', 105 | "SS06": "Summary should fit in a single line", 106 | "ES01": "No extended summary found", 107 | "PR01": "Parameters {missing_params} not documented", 108 | "PR02": "Unknown parameters {unknown_params}", 109 | "PR03": "Wrong parameters order. Actual: {actual_params}. " 110 | "Documented: {documented_params}", 111 | "PR04": 'Parameter "{param_name}" has no type', 112 | "PR05": 'Parameter "{param_name}" type should not finish with "."', 113 | "PR06": 'Parameter "{param_name}" type should use "{right_type}" instead ' 114 | 'of "{wrong_type}"', 115 | "PR07": 'Parameter "{param_name}" has no description', 116 | "PR08": 'Parameter "{param_name}" description should start with a ' 117 | "capital letter", 118 | "PR09": 'Parameter "{param_name}" description should finish with "."', 119 | "PR10": 'Parameter "{param_name}" requires a space before the colon ' 120 | "separating the parameter name and type", 121 | "RT01": "No Returns section found", 122 | "RT02": "The first line of the Returns section should contain only the " 123 | "type, unless multiple values are being returned", 124 | "RT03": "Return value has no description", 125 | "RT04": "Return value description should start with a capital letter", 126 | "RT05": 'Return value description should finish with "."', 127 | "YD01": "No Yields section found", 128 | "SA01": "See Also section not found", 129 | "SA02": "Missing period at end of description for See Also " 130 | '"{reference_name}" reference', 131 | "SA03": "Description should be capitalized for See Also " 132 | '"{reference_name}" reference', 133 | "SA04": 'Missing description for See Also "{reference_name}" reference', 134 | "SA05": "{reference_name} in `See Also` section does not need `pandas` " 135 | "prefix, use {right_reference} instead.", 136 | "EX01": "No examples section found", 137 | "EX02": "Examples do not pass tests:\n{doctest_log}", 138 | "EX03": "flake8 error: {error_code} {error_message}{times_happening}", 139 | "EX04": "Do not import {imported_library}, as it is imported " 140 | "automatically for the examples (numpy as np, pandas as pd)", 141 | } 142 | 143 | 144 | def error(code, **kwargs): 145 | """ 146 | Return a tuple with the error code and the message with variables replaced. 147 | 148 | This is syntactic sugar so instead of: 149 | - `('EX02', ERROR_MSGS['EX02'].format(doctest_log=log))` 150 | 151 | We can simply use: 152 | - `error('EX02', doctest_log=log)` 153 | 154 | Parameters 155 | ---------- 156 | code : str 157 | Error code. 158 | **kwargs 159 | Values for the variables in the error messages 160 | 161 | Returns 162 | ------- 163 | code : str 164 | Error code. 165 | message : str 166 | Error message with variables replaced. 167 | """ 168 | return (code, ERROR_MSGS[code].format(**kwargs)) 169 | 170 | 171 | def get_api_items(api_doc_fd): 172 | """ 173 | Yield information about all public API items. 174 | 175 | Parse api.rst file from the documentation, and extract all the functions, 176 | methods, classes, attributes... This should include all pandas public API. 177 | 178 | Parameters 179 | ---------- 180 | api_doc_fd : file descriptor 181 | A file descriptor of the API documentation page, containing the table 182 | of contents with all the public API. 183 | 184 | Yields 185 | ------ 186 | name : str 187 | The name of the object (e.g. 'pandas.Series.str.upper). 188 | func : function 189 | The object itself. In most cases this will be a function or method, 190 | but it can also be classes, properties, cython objects... 191 | section : str 192 | The name of the section in the API page where the object item is 193 | located. 194 | subsection : str 195 | The name of the subsection in the API page where the object item is 196 | located. 197 | """ 198 | current_module = "pandas" 199 | previous_line = current_section = current_subsection = "" 200 | position = None 201 | for line in api_doc_fd: 202 | line = line.strip() 203 | if len(line) == len(previous_line): 204 | if set(line) == set("-"): 205 | current_section = previous_line 206 | continue 207 | if set(line) == set("~"): 208 | current_subsection = previous_line 209 | continue 210 | 211 | if line.startswith(".. currentmodule::"): 212 | current_module = line.replace(".. currentmodule::", "").strip() 213 | continue 214 | 215 | if line == ".. autosummary::": 216 | position = "autosummary" 217 | continue 218 | 219 | if position == "autosummary": 220 | if line == "": 221 | position = "items" 222 | continue 223 | 224 | if position == "items": 225 | if line == "": 226 | position = None 227 | continue 228 | item = line.strip() 229 | func = importlib.import_module(current_module) 230 | for part in item.split("."): 231 | func = getattr(func, part) 232 | 233 | yield ( 234 | ".".join([current_module, item]), 235 | func, 236 | current_section, 237 | current_subsection, 238 | ) 239 | 240 | previous_line = line 241 | 242 | 243 | class Docstring: 244 | def __init__(self, name): 245 | self.name = name 246 | obj = self._load_obj(name) 247 | self.obj = obj 248 | self.code_obj = self._to_original_callable(obj) 249 | self.raw_doc = obj.__doc__ or "" 250 | self.clean_doc = pydoc.getdoc(obj) 251 | self.doc = NumpyDocString(self.clean_doc) 252 | 253 | def __len__(self) -> int: 254 | return len(self.raw_doc) 255 | 256 | @staticmethod 257 | def _load_obj(name): 258 | """ 259 | Import Python object from its name as string. 260 | 261 | Parameters 262 | ---------- 263 | name : str 264 | Object name to import (e.g. pandas.Series.str.upper) 265 | 266 | Returns 267 | ------- 268 | object 269 | Python object that can be a class, method, function... 270 | 271 | Examples 272 | -------- 273 | >>> Docstring._load_obj('pandas.Series') 274 | 275 | """ 276 | for maxsplit in range(1, name.count(".") + 1): 277 | # TODO when py3 only replace by: module, *func_parts = ... 278 | func_name_split = name.rsplit(".", maxsplit) 279 | module = func_name_split[0] 280 | func_parts = func_name_split[1:] 281 | try: 282 | obj = importlib.import_module(module) 283 | except ImportError: 284 | pass 285 | else: 286 | continue 287 | 288 | if "obj" not in locals(): 289 | raise ImportError("No module can be imported " 'from "{}"'.format(name)) 290 | 291 | for part in func_parts: 292 | obj = getattr(obj, part) 293 | return obj 294 | 295 | @staticmethod 296 | def _to_original_callable(obj): 297 | """ 298 | Find the Python object that contains the source code of the object. 299 | 300 | This is useful to find the place in the source code (file and line 301 | number) where a docstring is defined. It does not currently work for 302 | all cases, but it should help find some (properties...). 303 | """ 304 | while True: 305 | if inspect.isfunction(obj) or inspect.isclass(obj): 306 | f = inspect.getfile(obj) 307 | if f.startswith("<") and f.endswith(">"): 308 | return None 309 | return obj 310 | if inspect.ismethod(obj): 311 | obj = obj.__func__ 312 | elif isinstance(obj, functools.partial): 313 | obj = obj.func 314 | elif isinstance(obj, property): 315 | obj = obj.fget 316 | else: 317 | return None 318 | 319 | @property 320 | def type(self): 321 | return type(self.obj).__name__ 322 | 323 | @property 324 | def is_function_or_method(self): 325 | # TODO(py27): remove ismethod 326 | return inspect.isfunction(self.obj) or inspect.ismethod(self.obj) 327 | 328 | @property 329 | def source_file_name(self): 330 | """ 331 | File name where the object is implemented (e.g. pandas/core/frame.py). 332 | """ 333 | try: 334 | fname = inspect.getsourcefile(self.code_obj) 335 | except TypeError: 336 | # In some cases the object is something complex like a cython 337 | # object that can't be easily introspected. An it's better to 338 | # return the source code file of the object as None, than crash 339 | pass 340 | else: 341 | if fname: 342 | fname = os.path.relpath(fname, BASE_PATH) 343 | return fname 344 | 345 | @property 346 | def source_file_def_line(self): 347 | """ 348 | Number of line where the object is defined in its file. 349 | """ 350 | try: 351 | return inspect.getsourcelines(self.code_obj)[-1] 352 | except (OSError, TypeError): 353 | # In some cases the object is something complex like a cython 354 | # object that can't be easily introspected. An it's better to 355 | # return the line number as None, than crash 356 | pass 357 | 358 | @property 359 | def github_url(self): 360 | url = "https://github.com/pandas-dev/pandas/blob/master/" 361 | url += "{}#L{}".format(self.source_file_name, self.source_file_def_line) 362 | return url 363 | 364 | @property 365 | def start_blank_lines(self): 366 | i = None 367 | if self.raw_doc: 368 | for i, row in enumerate(self.raw_doc.split("\n")): 369 | if row.strip(): 370 | break 371 | return i 372 | 373 | @property 374 | def end_blank_lines(self): 375 | i = None 376 | if self.raw_doc: 377 | for i, row in enumerate(reversed(self.raw_doc.split("\n"))): 378 | if row.strip(): 379 | break 380 | return i 381 | 382 | @property 383 | def double_blank_lines(self): 384 | prev = True 385 | for row in self.raw_doc.split("\n"): 386 | if not prev and not row.strip(): 387 | return True 388 | prev = row.strip() 389 | return False 390 | 391 | @property 392 | def section_titles(self): 393 | sections = [] 394 | self.doc._doc.reset() 395 | while not self.doc._doc.eof(): 396 | content = self.doc._read_to_next_section() 397 | if ( 398 | len(content) > 1 399 | and len(content[0]) == len(content[1]) 400 | and set(content[1]) == {"-"} 401 | ): 402 | sections.append(content[0]) 403 | return sections 404 | 405 | @property 406 | def summary(self): 407 | return " ".join(self.doc["Summary"]) 408 | 409 | @property 410 | def num_summary_lines(self): 411 | return len(self.doc["Summary"]) 412 | 413 | @property 414 | def extended_summary(self): 415 | if not self.doc["Extended Summary"] and len(self.doc["Summary"]) > 1: 416 | return " ".join(self.doc["Summary"]) 417 | return " ".join(self.doc["Extended Summary"]) 418 | 419 | @property 420 | def needs_summary(self): 421 | return not (bool(self.summary) and bool(self.extended_summary)) 422 | 423 | @property 424 | def doc_parameters(self): 425 | parameters = collections.OrderedDict() 426 | for names, type_, desc in self.doc["Parameters"]: 427 | for name in names.split(", "): 428 | parameters[name] = (type_, "".join(desc)) 429 | return parameters 430 | 431 | @property 432 | def signature_parameters(self): 433 | def add_stars(param_name: str, info: inspect.Parameter): 434 | """ 435 | Add stars to *args and **kwargs parameters 436 | """ 437 | if info.kind == inspect.Parameter.VAR_POSITIONAL: 438 | return f"*{param_name}" 439 | elif info.kind == inspect.Parameter.VAR_KEYWORD: 440 | return f"**{param_name}" 441 | else: 442 | return param_name 443 | 444 | if inspect.isclass(self.obj): 445 | if hasattr(self.obj, "_accessors") and ( 446 | self.name.split(".")[-1] in self.obj._accessors 447 | ): 448 | # accessor classes have a signature but don't want to show this 449 | return tuple() 450 | try: 451 | sig = inspect.signature(self.obj) 452 | except (TypeError, ValueError): 453 | # Some objects, mainly in C extensions do not support introspection 454 | # of the signature 455 | return tuple() 456 | 457 | params = tuple( 458 | add_stars(parameter, sig.parameters[parameter]) 459 | for parameter in sig.parameters 460 | ) 461 | if params and params[0] in ("self", "cls"): 462 | return params[1:] 463 | return params 464 | 465 | @property 466 | def parameter_mismatches(self): 467 | errs = [] 468 | signature_params = self.signature_parameters 469 | doc_params = tuple(self.doc_parameters) 470 | missing = set(signature_params) - set(doc_params) 471 | if missing: 472 | errs.append(error("PR01", missing_params=pprint_thing(missing))) 473 | extra = set(doc_params) - set(signature_params) 474 | if extra: 475 | errs.append(error("PR02", unknown_params=pprint_thing(extra))) 476 | if ( 477 | not missing 478 | and not extra 479 | and signature_params != doc_params 480 | and not (not signature_params and not doc_params) 481 | ): 482 | errs.append( 483 | error( 484 | "PR03", actual_params=signature_params, documented_params=doc_params 485 | ) 486 | ) 487 | 488 | return errs 489 | 490 | @property 491 | def correct_parameters(self): 492 | return not bool(self.parameter_mismatches) 493 | 494 | @property 495 | def directives_without_two_colons(self): 496 | return DIRECTIVE_PATTERN.findall(self.raw_doc) 497 | 498 | def parameter_type(self, param): 499 | return self.doc_parameters[param][0] 500 | 501 | def parameter_desc(self, param): 502 | desc = self.doc_parameters[param][1] 503 | # Find and strip out any sphinx directives 504 | for directive in DIRECTIVES: 505 | full_directive = ".. {}".format(directive) 506 | if full_directive in desc: 507 | # Only retain any description before the directive 508 | desc = desc[: desc.index(full_directive)] 509 | return desc 510 | 511 | @property 512 | def see_also(self): 513 | result = collections.OrderedDict() 514 | for funcs, desc in self.doc["See Also"]: 515 | for func, _ in funcs: 516 | result[func] = "".join(desc) 517 | 518 | return result 519 | 520 | @property 521 | def examples(self): 522 | return self.doc["Examples"] 523 | 524 | @property 525 | def returns(self): 526 | return self.doc["Returns"] 527 | 528 | @property 529 | def yields(self): 530 | return self.doc["Yields"] 531 | 532 | @property 533 | def method_source(self): 534 | try: 535 | source = inspect.getsource(self.obj) 536 | except TypeError: 537 | return "" 538 | return textwrap.dedent(source) 539 | 540 | @property 541 | def method_returns_something(self): 542 | """ 543 | Check if the docstrings method can return something. 544 | 545 | Bare returns, returns valued None and returns from nested functions are 546 | disconsidered. 547 | 548 | Returns 549 | ------- 550 | bool 551 | Whether the docstrings method can return something. 552 | """ 553 | 554 | def get_returns_not_on_nested_functions(node): 555 | returns = [node] if isinstance(node, ast.Return) else [] 556 | for child in ast.iter_child_nodes(node): 557 | # Ignore nested functions and its subtrees. 558 | if not isinstance(child, ast.FunctionDef): 559 | child_returns = get_returns_not_on_nested_functions(child) 560 | returns.extend(child_returns) 561 | return returns 562 | 563 | tree = ast.parse(self.method_source).body 564 | if tree: 565 | returns = get_returns_not_on_nested_functions(tree[0]) 566 | return_values = [r.value for r in returns] 567 | # Replace NameConstant nodes valued None for None. 568 | for i, v in enumerate(return_values): 569 | if isinstance(v, ast.NameConstant) and v.value is None: 570 | return_values[i] = None 571 | return any(return_values) 572 | else: 573 | return False 574 | 575 | @property 576 | def first_line_ends_in_dot(self): 577 | if self.doc: 578 | return self.doc.split("\n")[0][-1] == "." 579 | 580 | @property 581 | def deprecated(self): 582 | return ".. deprecated:: " in (self.summary + self.extended_summary) 583 | 584 | @property 585 | def mentioned_private_classes(self): 586 | return [klass for klass in PRIVATE_CLASSES if klass in self.raw_doc] 587 | 588 | @property 589 | def examples_errors(self): 590 | flags = doctest.NORMALIZE_WHITESPACE | doctest.IGNORE_EXCEPTION_DETAIL 591 | finder = doctest.DocTestFinder() 592 | runner = doctest.DocTestRunner(optionflags=flags) 593 | context = {"np": numpy, "pd": pandas} 594 | error_msgs = "" 595 | for test in finder.find(self.raw_doc, self.name, globs=context): 596 | f = StringIO() 597 | runner.run(test, out=f.write) 598 | error_msgs += f.getvalue() 599 | return error_msgs 600 | 601 | @property 602 | def examples_source_code(self): 603 | lines = doctest.DocTestParser().get_examples(self.raw_doc) 604 | return [line.source for line in lines] 605 | 606 | def validate_pep8(self): 607 | if not self.examples: 608 | return 609 | 610 | # F401 is needed to not generate flake8 errors in examples 611 | # that do not user numpy or pandas 612 | content = "".join( 613 | ( 614 | "import numpy as np # noqa: F401\n", 615 | "import pandas as pd # noqa: F401\n", 616 | *self.examples_source_code, 617 | ) 618 | ) 619 | 620 | application = flake8.main.application.Application() 621 | application.initialize(["--quiet"]) 622 | 623 | with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8") as file: 624 | file.write(content) 625 | file.flush() 626 | application.run_checks([file.name]) 627 | 628 | # We need this to avoid flake8 printing the names of the files to 629 | # the standard output 630 | application.formatter.write = lambda line, source: None 631 | application.report() 632 | 633 | yield from application.guide.stats.statistics_for("") 634 | 635 | 636 | def get_validation_data(doc): 637 | """ 638 | Validate the docstring. 639 | 640 | Parameters 641 | ---------- 642 | doc : Docstring 643 | A Docstring object with the given function name. 644 | 645 | Returns 646 | ------- 647 | tuple 648 | errors : list of tuple 649 | Errors occurred during validation. 650 | warnings : list of tuple 651 | Warnings occurred during validation. 652 | examples_errs : str 653 | Examples usage displayed along the error, otherwise empty string. 654 | 655 | Notes 656 | ----- 657 | The errors codes are defined as: 658 | - First two characters: Section where the error happens: 659 | * GL: Global (no section, like section ordering errors) 660 | * SS: Short summary 661 | * ES: Extended summary 662 | * PR: Parameters 663 | * RT: Returns 664 | * YD: Yields 665 | * RS: Raises 666 | * WN: Warns 667 | * SA: See Also 668 | * NT: Notes 669 | * RF: References 670 | * EX: Examples 671 | - Last two characters: Numeric error code inside the section 672 | 673 | For example, EX02 is the second codified error in the Examples section 674 | (which in this case is assigned to examples that do not pass the tests). 675 | 676 | The error codes, their corresponding error messages, and the details on how 677 | they are validated, are not documented more than in the source code of this 678 | function. 679 | """ 680 | 681 | errs = [] 682 | wrns = [] 683 | if not doc.raw_doc: 684 | errs.append(error("GL08")) 685 | return errs, wrns, "" 686 | 687 | if doc.start_blank_lines != 1: 688 | errs.append(error("GL01")) 689 | if doc.end_blank_lines != 1: 690 | errs.append(error("GL02")) 691 | if doc.double_blank_lines: 692 | errs.append(error("GL03")) 693 | mentioned_errs = doc.mentioned_private_classes 694 | if mentioned_errs: 695 | errs.append(error("GL04", mentioned_private_classes=", ".join(mentioned_errs))) 696 | for line in doc.raw_doc.splitlines(): 697 | if re.match("^ *\t", line): 698 | errs.append(error("GL05", line_with_tabs=line.lstrip())) 699 | 700 | unexpected_sections = [ 701 | section for section in doc.section_titles if section not in ALLOWED_SECTIONS 702 | ] 703 | for section in unexpected_sections: 704 | errs.append( 705 | error("GL06", section=section, allowed_sections=", ".join(ALLOWED_SECTIONS)) 706 | ) 707 | 708 | correct_order = [ 709 | section for section in ALLOWED_SECTIONS if section in doc.section_titles 710 | ] 711 | if correct_order != doc.section_titles: 712 | errs.append(error("GL07", correct_sections=", ".join(correct_order))) 713 | 714 | if doc.deprecated and not doc.extended_summary.startswith(".. deprecated:: "): 715 | errs.append(error("GL09")) 716 | 717 | directives_without_two_colons = doc.directives_without_two_colons 718 | if directives_without_two_colons: 719 | errs.append(error("GL10", directives=directives_without_two_colons)) 720 | 721 | if not doc.summary: 722 | errs.append(error("SS01")) 723 | else: 724 | if not doc.summary[0].isupper(): 725 | errs.append(error("SS02")) 726 | if doc.summary[-1] != ".": 727 | errs.append(error("SS03")) 728 | if doc.summary != doc.summary.lstrip(): 729 | errs.append(error("SS04")) 730 | elif doc.is_function_or_method and doc.summary.split(" ")[0][-1] == "s": 731 | errs.append(error("SS05")) 732 | if doc.num_summary_lines > 1: 733 | errs.append(error("SS06")) 734 | 735 | if not doc.extended_summary: 736 | wrns.append(("ES01", "No extended summary found")) 737 | 738 | # PR01: Parameters not documented 739 | # PR02: Unknown parameters 740 | # PR03: Wrong parameters order 741 | errs += doc.parameter_mismatches 742 | 743 | for param in doc.doc_parameters: 744 | if not param.startswith("*"): # Check can ignore var / kwargs 745 | if not doc.parameter_type(param): 746 | if ":" in param: 747 | errs.append(error("PR10", param_name=param.split(":")[0])) 748 | else: 749 | errs.append(error("PR04", param_name=param)) 750 | else: 751 | if doc.parameter_type(param)[-1] == ".": 752 | errs.append(error("PR05", param_name=param)) 753 | common_type_errors = [ 754 | ("integer", "int"), 755 | ("boolean", "bool"), 756 | ("string", "str"), 757 | ] 758 | for wrong_type, right_type in common_type_errors: 759 | if wrong_type in doc.parameter_type(param): 760 | errs.append( 761 | error( 762 | "PR06", 763 | param_name=param, 764 | right_type=right_type, 765 | wrong_type=wrong_type, 766 | ) 767 | ) 768 | if not doc.parameter_desc(param): 769 | errs.append(error("PR07", param_name=param)) 770 | else: 771 | if not doc.parameter_desc(param)[0].isupper(): 772 | errs.append(error("PR08", param_name=param)) 773 | if doc.parameter_desc(param)[-1] != ".": 774 | errs.append(error("PR09", param_name=param)) 775 | 776 | if doc.is_function_or_method: 777 | if not doc.returns: 778 | if doc.method_returns_something: 779 | errs.append(error("RT01")) 780 | else: 781 | if len(doc.returns) == 1 and doc.returns[0].name: 782 | errs.append(error("RT02")) 783 | for name_or_type, type_, desc in doc.returns: 784 | if not desc: 785 | errs.append(error("RT03")) 786 | else: 787 | desc = " ".join(desc) 788 | if not desc[0].isupper(): 789 | errs.append(error("RT04")) 790 | if not desc.endswith("."): 791 | errs.append(error("RT05")) 792 | 793 | if not doc.yields and "yield" in doc.method_source: 794 | errs.append(error("YD01")) 795 | 796 | if not doc.see_also: 797 | wrns.append(error("SA01")) 798 | else: 799 | for rel_name, rel_desc in doc.see_also.items(): 800 | if rel_desc: 801 | if not rel_desc.endswith("."): 802 | errs.append(error("SA02", reference_name=rel_name)) 803 | if not rel_desc[0].isupper(): 804 | errs.append(error("SA03", reference_name=rel_name)) 805 | else: 806 | errs.append(error("SA04", reference_name=rel_name)) 807 | if rel_name.startswith("pandas."): 808 | errs.append( 809 | error( 810 | "SA05", 811 | reference_name=rel_name, 812 | right_reference=rel_name[len("pandas.") :], 813 | ) 814 | ) 815 | 816 | examples_errs = "" 817 | if not doc.examples: 818 | wrns.append(error("EX01")) 819 | else: 820 | examples_errs = doc.examples_errors 821 | if examples_errs: 822 | errs.append(error("EX02", doctest_log=examples_errs)) 823 | for err in doc.validate_pep8(): 824 | errs.append( 825 | error( 826 | "EX03", 827 | error_code=err.error_code, 828 | error_message=err.message, 829 | times_happening=" ({} times)".format(err.count) 830 | if err.count > 1 831 | else "", 832 | ) 833 | ) 834 | examples_source_code = "".join(doc.examples_source_code) 835 | for wrong_import in ("numpy", "pandas"): 836 | if "import {}".format(wrong_import) in examples_source_code: 837 | errs.append(error("EX04", imported_library=wrong_import)) 838 | return errs, wrns, examples_errs 839 | 840 | 841 | def validate_one(func_name): 842 | """ 843 | Validate the docstring for the given func_name 844 | 845 | Parameters 846 | ---------- 847 | func_name : function 848 | Function whose docstring will be evaluated (e.g. pandas.read_csv). 849 | 850 | Returns 851 | ------- 852 | dict 853 | A dictionary containing all the information obtained from validating 854 | the docstring. 855 | """ 856 | doc = Docstring(func_name) 857 | errs, wrns, examples_errs = get_validation_data(doc) 858 | return { 859 | "type": doc.type, 860 | "docstring": doc.clean_doc, 861 | "deprecated": doc.deprecated, 862 | "file": doc.source_file_name, 863 | "file_line": doc.source_file_def_line, 864 | "github_link": doc.github_url, 865 | "errors": errs, 866 | "warnings": wrns, 867 | "examples_errors": examples_errs, 868 | } 869 | 870 | 871 | def validate_all(prefix, ignore_deprecated=False): 872 | """ 873 | Execute the validation of all docstrings, and return a dict with the 874 | results. 875 | 876 | Parameters 877 | ---------- 878 | prefix : str or None 879 | If provided, only the docstrings that start with this pattern will be 880 | validated. If None, all docstrings will be validated. 881 | ignore_deprecated: bool, default False 882 | If True, deprecated objects are ignored when validating docstrings. 883 | 884 | Returns 885 | ------- 886 | dict 887 | A dictionary with an item for every function/method... containing 888 | all the validation information. 889 | """ 890 | result = {} 891 | seen = {} 892 | 893 | # functions from the API docs 894 | api_doc_fnames = os.path.join(BASE_PATH, "doc", "source", "reference", "*.rst") 895 | api_items = [] 896 | for api_doc_fname in glob.glob(api_doc_fnames): 897 | with open(api_doc_fname) as f: 898 | api_items += list(get_api_items(f)) 899 | for func_name, func_obj, section, subsection in api_items: 900 | if prefix and not func_name.startswith(prefix): 901 | continue 902 | doc_info = validate_one(func_name) 903 | if ignore_deprecated and doc_info["deprecated"]: 904 | continue 905 | result[func_name] = doc_info 906 | 907 | shared_code_key = doc_info["file"], doc_info["file_line"] 908 | shared_code = seen.get(shared_code_key, "") 909 | result[func_name].update( 910 | { 911 | "in_api": True, 912 | "section": section, 913 | "subsection": subsection, 914 | "shared_code_with": shared_code, 915 | } 916 | ) 917 | 918 | seen[shared_code_key] = func_name 919 | 920 | # functions from introspecting Series and DataFrame 921 | api_item_names = set(list(zip(*api_items))[0]) 922 | for class_ in (pandas.Series, pandas.DataFrame): 923 | for member in inspect.getmembers(class_): 924 | func_name = "pandas.{}.{}".format(class_.__name__, member[0]) 925 | if not member[0].startswith("_") and func_name not in api_item_names: 926 | if prefix and not func_name.startswith(prefix): 927 | continue 928 | doc_info = validate_one(func_name) 929 | if ignore_deprecated and doc_info["deprecated"]: 930 | continue 931 | result[func_name] = doc_info 932 | result[func_name]["in_api"] = False 933 | 934 | return result 935 | 936 | 937 | def main(func_name, prefix, errors, output_format, ignore_deprecated): 938 | def header(title, width=80, char="#"): 939 | full_line = char * width 940 | side_len = (width - len(title) - 2) // 2 941 | adj = "" if len(title) % 2 == 0 else " " 942 | title_line = "{side} {title}{adj} {side}".format( 943 | side=char * side_len, title=title, adj=adj 944 | ) 945 | 946 | return "\n{full_line}\n{title_line}\n{full_line}\n\n".format( 947 | full_line=full_line, title_line=title_line 948 | ) 949 | 950 | exit_status = 0 951 | if func_name is None: 952 | result = validate_all(prefix, ignore_deprecated) 953 | 954 | if output_format == "json": 955 | output = json.dumps(result) 956 | else: 957 | if output_format == "default": 958 | output_format = "{text}\n" 959 | elif output_format == "azure": 960 | output_format = ( 961 | "##vso[task.logissue type=error;" 962 | "sourcepath={path};" 963 | "linenumber={row};" 964 | "code={code};" 965 | "]{text}\n" 966 | ) 967 | else: 968 | raise ValueError(f'Unknown output_format "{output_format}"') 969 | 970 | output = "" 971 | for name, res in result.items(): 972 | for err_code, err_desc in res["errors"]: 973 | # The script would be faster if instead of filtering the 974 | # errors after validating them, it didn't validate them 975 | # initially. But that would complicate the code too much 976 | if errors and err_code not in errors: 977 | continue 978 | exit_status += 1 979 | output += output_format.format( 980 | path=res["file"], 981 | row=res["file_line"], 982 | code=err_code, 983 | text=f"{name}: {err_desc}", 984 | ) 985 | 986 | sys.stdout.write(output) 987 | 988 | else: 989 | result = validate_one(func_name) 990 | sys.stderr.write(header("Docstring ({})".format(func_name))) 991 | sys.stderr.write("{}\n".format(result["docstring"])) 992 | sys.stderr.write(header("Validation")) 993 | if result["errors"]: 994 | sys.stderr.write("{} Errors found:\n".format(len(result["errors"]))) 995 | for err_code, err_desc in result["errors"]: 996 | # Failing examples are printed at the end 997 | if err_code == "EX02": 998 | sys.stderr.write("\tExamples do not pass tests\n") 999 | continue 1000 | sys.stderr.write("\t{}\n".format(err_desc)) 1001 | if result["warnings"]: 1002 | sys.stderr.write("{} Warnings found:\n".format(len(result["warnings"]))) 1003 | for wrn_code, wrn_desc in result["warnings"]: 1004 | sys.stderr.write("\t{}\n".format(wrn_desc)) 1005 | 1006 | if not result["errors"]: 1007 | sys.stderr.write('Docstring for "{}" correct. :)\n'.format(func_name)) 1008 | 1009 | if result["examples_errors"]: 1010 | sys.stderr.write(header("Doctests")) 1011 | sys.stderr.write(result["examples_errors"]) 1012 | 1013 | return exit_status 1014 | 1015 | 1016 | if __name__ == "__main__": 1017 | format_opts = "default", "json", "azure" 1018 | func_help = ( 1019 | "function or method to validate (e.g. pandas.DataFrame.head) " 1020 | "if not provided, all docstrings are validated and returned " 1021 | "as JSON" 1022 | ) 1023 | argparser = argparse.ArgumentParser(description="validate pandas docstrings") 1024 | argparser.add_argument("function", nargs="?", default=None, help=func_help) 1025 | argparser.add_argument( 1026 | "--format", 1027 | default="default", 1028 | choices=format_opts, 1029 | help="format of the output when validating " 1030 | "multiple docstrings (ignored when validating one)." 1031 | "It can be {}".format(str(format_opts)[1:-1]), 1032 | ) 1033 | argparser.add_argument( 1034 | "--prefix", 1035 | default=None, 1036 | help="pattern for the " 1037 | "docstring names, in order to decide which ones " 1038 | 'will be validated. A prefix "pandas.Series.str.' 1039 | "will make the script validate all the docstrings" 1040 | "of methods starting by this pattern. It is " 1041 | "ignored if parameter function is provided", 1042 | ) 1043 | argparser.add_argument( 1044 | "--errors", 1045 | default=None, 1046 | help="comma separated " 1047 | "list of error codes to validate. By default it " 1048 | "validates all errors (ignored when validating " 1049 | "a single docstring)", 1050 | ) 1051 | argparser.add_argument( 1052 | "--ignore_deprecated", 1053 | default=False, 1054 | action="store_true", 1055 | help="if this flag is set, " 1056 | "deprecated objects are ignored when validating " 1057 | "all docstrings", 1058 | ) 1059 | 1060 | args = argparser.parse_args() 1061 | sys.exit( 1062 | main( 1063 | args.function, 1064 | args.prefix, 1065 | args.errors.split(",") if args.errors else None, 1066 | args.format, 1067 | args.ignore_deprecated, 1068 | ) 1069 | ) 1070 | -------------------------------------------------------------------------------- /setup.cfg: -------------------------------------------------------------------------------- 1 | # To be kept consistent with "Import Formatting" section in contributing.rst 2 | 3 | [flake8] 4 | max-line-length = 88 5 | ignore = 6 | E203, # space before : (needed for how black formats slicing) 7 | W503, # line break before binary operator 8 | W504, # line break after binary operator 9 | E402, # module level import not at top of file 10 | E731, # do not assign a lambda expression, use a def 11 | C406, # Unnecessary list literal - rewrite as a dict literal. 12 | C408, # Unnecessary dict call - rewrite as a literal. 13 | C409, # Unnecessary list passed to tuple() - rewrite as a tuple literal. 14 | S001 # found modulo formatter (incorrect picks up mod operations) 15 | exclude = versioneer.py, dataframe_sql/_version.py 16 | 17 | [isort] 18 | known_first_party = dataframe_sql 19 | known_third_party = pandas, lark, numpy 20 | multi_line_output = 3 21 | include_trailing_comma = True 22 | force_grid_wrap = 0 23 | combine_as_imports = True 24 | line_length = 88 25 | force_sort_within_sections = True 26 | 27 | [mypy] 28 | ignore_missing_imports=True 29 | no_implicit_optional=True 30 | check_untyped_defs=True 31 | 32 | [mypy-dataframe_sql.tests.*] 33 | ignore_errors=True 34 | 35 | [mypy-dataframe_sql._version] 36 | ignore_errors=True 37 | 38 | [mypy-versioneer] 39 | ignore_errors=True 40 | 41 | [tool:pytest] 42 | testpaths = dataframe_sql/tests 43 | 44 | [versioneer] 45 | VCS = git 46 | style = pep440 47 | versionfile_source = dataframe_sql/_version.py 48 | versionfile_build = dataframe_sql/_version.py 49 | tag_prefix = v 50 | parentdir_prefix = dataframe_sql- 51 | 52 | [metadata] 53 | description-file = README.md 54 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from distutils.core import setup 2 | from pathlib import Path 3 | 4 | from setuptools import find_packages 5 | 6 | from versioneer import get_cmdclass, get_version 7 | 8 | CODE_DIRECTORY = Path(__file__).parent 9 | 10 | 11 | def read_file(file_path: Path): 12 | """Source the contents of a file""" 13 | with open(str(file_path), encoding="utf-8") as file: 14 | return file.read() 15 | 16 | 17 | setup( 18 | name="dataframe_sql", 19 | version=get_version(), 20 | cmdclass=get_cmdclass(), 21 | packages=find_packages(), 22 | long_description=read_file(CODE_DIRECTORY / "README.rst"), 23 | maintainer="Zach Brookler", 24 | maintainer_email="zachb1996@yahoo.com", 25 | description="A package for querying dataframes using SQL", 26 | python_requires=">=3.7.0", 27 | install_requires=["sql-to-ibis==0.4.0"], 28 | project_urls={ 29 | "Source Code": "https://github.com/zbrookle/dataframe_sql", 30 | "Bug Tracker": "https://github.com/zbrookle/dataframe_sql/issues", 31 | "Documentation": "https://github.com/zbrookle/dataframe_sql", 32 | }, 33 | url="https://github.com/zbrookle/dataframe_sql", 34 | download_url="https://github.com/zbrookle/dataframe_sql/archive/master.zip", 35 | keywords=["pandas", "data", "dataframe", "sql"], 36 | classifiers=[ 37 | "Development Status :: 4 - Beta", 38 | "License :: OSI Approved :: BSD License", 39 | "Programming Language :: Python :: 3.7", 40 | "Programming Language :: Python :: 3.8", 41 | "Operating System :: OS Independent", 42 | "Intended Audience :: Science/Research", 43 | "Topic :: Scientific/Engineering", 44 | ], 45 | long_description_content_type="text/x-rst", 46 | include_package_data=True, 47 | ) 48 | --------------------------------------------------------------------------------