1
1

More than 3 years have passed since last update.

qを試してみた

Last updated at Posted at 2019-11-20

qとは

qとはcsv、tsvなどのファイルをデータベーステーブルのように扱い、それらに対してSQLを実行するというものです。

類似のツールとしてAWSが提供するAthenaなどがありますが、開発用PCで捌けるような比較的少数のデータに対してサクッとSQLを使いたい方などにはqは向いているかもしれません。

インストール

開発元が公表しているインストール手段としてMac OSWindowsLinuxと大方のOSに対応しているようです。
またDockerイメージPython APIとしても公開されています。

使用例

以降ではDockerPythonを使った簡単なqのサンプルを記載します。
データにはアヤメのデータを使用します。

カラムは左からがく片の長さがく片の幅花びらの長さ花びらの幅となリます。

$ docker run --rm -it -v `pwd`:/w -w /w jupyter/datascience-notebook python -c '
from sklearn.datasets import load_iris

iris = load_iris()
data = iris.data[:15]
text = "\n".join([",".join([str(scalar) for scalar in scalars]) for scalars in data])

columns = ["SepalLength", "SepalWidth", "PetalLength", "PetalWidth"]
columntext = ",".join(columns)

with open("data.csv", "w", encoding="utf-8") as f:
    f.write(columntext + "\n")
    f.write(text)
'
$ cat data.csv
SepalLength,SepalWidth,PetalLength,PetalWidth
5.1,3.5,1.4,0.2
4.9,3.0,1.4,0.2
4.7,3.2,1.3,0.2
4.6,3.1,1.5,0.2
5.0,3.6,1.4,0.2
5.4,3.9,1.7,0.4
4.6,3.4,1.4,0.3
5.0,3.4,1.5,0.2
4.4,2.9,1.4,0.2
4.9,3.1,1.5,0.1
5.4,3.7,1.5,0.2
4.8,3.4,1.6,0.2
4.8,3.0,1.4,0.1
4.3,3.0,1.1,0.1
5.8,4.0,1.2,0.2

以降ではがく片の長さ5.0以上かつ、花びらの長さ1.5以上という条件でデータを取得します。

  • CLI
$ docker run --rm -it -v `pwd`:/w -w /w eiryu/q-text-as-data -H -d ',' 'select * from data.csv where SepalLength >= 5.0 and PetalLength >= 1.5'
5.4,3.9,1.7,0.4
5.0,3.4,1.5,0.2
5.4,3.7,1.5,0.2
  • Python

コンテナ化したいので、下記のDockerfileをビルドします。

FROM python:latest

ENV PYTHONPATH /usr/local/src:$PYTHONPATH 
WORKDIR /tmp/q

RUN set -eux && \
    git init && \
    git config core.sparsecheckout true && \
    git remote add origin https://github.com/harelba/q.git && \
    echo bin > .git/info/sparse-checkout && \
    git pull origin master && \
    pip install six && \
    cp -p bin/q /usr/local/src/qtextasdata.py

イメージをビルドし、スクリプト実行します。

$ docker build -t qpy .
$ docker run --rm -it -v `pwd`:/w -w /w qpy python -c '
from qtextasdata import QTextAsData, QInputParams

q = QTextAsData()
stmt = "select * from data.csv where SepalLength >= 5.0 and PetalLength >= 1.5"
input_params = QInputParams(delimiter=",", skip_header=True)

r = q.execute(stmt, input_params)
if r.status != "ok":
    raise BaseException("status: " + r.status)

for data in r.data:
    print(*data, sep=",")
'
5.4,3.9,1.7,0.4
5.0,3.4,1.5,0.2
5.4,3.7,1.5,0.2

CLI、Pythonどちらとも同様に同じ結果が取得されていると思います。

最後に

上記ではqの簡単な紹介を行いました、後から考えてみるとSQLというインターフェースに拘らなければPandasでも同様のことが実現できそうです。。。

機械学習の予測結果のデバッグ用に使用できればと思います。

1
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1