2019-12-25
Querypy更新(0.0.1)

バージョン0.0.1

先日公開したQuerypy

  1. テスト環境の整備
  2. 関数記号の導入

までやったのでバージョンを0.0.1にしました。

テスト環境

momotaro98さんがutilsのテストを書いてくださったついでに、READMEの開発指南にテスト関係の項目を追加しました。今後は重要な機能であったり複雑なロジックを実装した部分を意識しつつテスト済みコンポーネントを増やしていきたいです。

細かいREADMEの修正

READMEのスクリプトが間違っていたので修正しました。

項の間の演算

加減乗除とべき乗をつかって計算できるようになりました。

例によって以下のscores.csvを読み込んで条件に合う学生を探し出しましょう。

名前, 解析入門, 経済学入門
山田,      80,      50
 劉,      50,      80
data    = Querypy.read_csv("scores.csv", "名前")
math101 = data.get_term("解析入門")
econ101 = data.get_term("経済学入門")

例えば二教科math101, econ101の合計点数はmath101 + econ101と表現して実際に条件式に組み入れることができます。

data.find(math101 + econ101 >= 100)
# -> ['山田', '劉']

他にも加減乗除、べき乗すべてが同様に条件式のなかで扱えることになります。

# 解析入門のほうが点数が高い人
math101 - econ101 > 0

# 数学の点数を1.5倍の重みで評価する場合
math101 * 1.5 + econ101 >= 120

# 経済学入門のほうが10%以上点数が高い人
econ101/math101 >= 1.1

# 両方共50点との距離を測る
(math101 - 50) ** 2 + (econ101 - 50) ** >= 100

関数記号の導入

関数記号を導入することでレコードに任意の演算を施した結果をつかって条件を記述できるようになりました。

例えばGPAを以下のようなルールでつけて、GPA3以上の学生を見つけたいとしましょう:

  • 60点以上69点以下:2点
  • 70点以上79点以下:3点
  • 80点以上    :4点

この条件分岐を含んだ式は上のような加減乗除べき乗だけでは表現できませんが、

def get_grade_point(test_result):
    if test_result >= 80:
        return 4
    elif test_result >= 70:
        return 3
    elif test_result >= 60:
        return 2
    else:
        return 0

def get_gpa(math, econ):
    return (get_grade_point(math) + get_grade_point(econ)) / 2

という関数を用意すればget_gpa(math101, econ101)みたいな感じで計算できそうです。これを条件式に組み込みたいときはまず

from querypy.FunctionSymbol import FunctionSymbol

gpa_func_sym = FunctionSymbol(get_gpa)

という形で関数記号オブジェクト(FunctionSymbol)を作成します。 そしてそのあとは通常どおりに条件式を不等号をつかって作成できます。

data.find(gpa_func_sym(math101, econ101) >= 3)

今後の方針

2つのレコードを利用

順序付きデータや時系列データでは 「前の項が条件Aをみたして次の項が条件Bをみたすもの」 「一時間での差分が5%以内」 など複数レコードにまたがる条件が使えると便利です。

まだこの機能の構想、設計ができていないのですぐにコードに落とし込むことはできませんが、逆になにかアイデアがあればIssueいただけると嬉しいです。

テストの充実

せっかくテストのルールを作ることができたのでそれを活かして製品の質を上げていきたいです。

対象レコードの範囲

今はかなりかぎられた条件を満たすCSVしか使うことができません。 より一般的なCSVでも検索できるよう、またJSONなどほかの形式でも扱えるようにデザインを変更していきたいです。