1. はじめよう

それでは、簡単な例から始めよう。 nysol_python のインストールができたら、pythonを起動して、例に従って入力しながら動作を確認していこう。

注釈

tty(ターミナル端末)からインタプリタモード(対話モード)で、pytonを起動した場合、コマンド入力を促すプライマリプロンプト(>>>)や 、継続行にセカンダリプロンプト(デフォルトでは...)が表示されるが、このサイトの例では省略している。 また実行結果をコメント行(#で始まる行)として示している。

それでは、表 1.1 に示される顧客の日別購買金額データを用いて簡単な実行例をみていこう。 mcmdは下記に示すような表構造データを扱う。 現在のところは2重リストもしくはCSVのいずれかのフォーマットにより与える。

表 1.1 入力データ例:mcmdが扱う表構造データ

customer

date

amount

A

20180101

5200

B

20180101

800

B

20180102

3500

A

20180105

2000

B

20180107

4000

まずは、mcmdモジュールをimportし、上記の表を二重リストとして dat 変数に格納してみよう( リスト 1.1 )。

リスト 1.1 mcmdのインポートと入力データの設定
1import nysol.mcmd as nm
2dat=[
3["customer","date","amount"],
4["A","20180101",5200],
5["B","20180101",800],
6["B","20180112",3500],
7["A","20180105",2000],
8["B","20180107",4000]
9]

このデータから、顧客別に合計金額を合計する処理を以下に示す。 まずは、必要となる顧客と金額の2項目(customer , amount )のみを切り出してみよう(リスト 1.2 )。 mcut がその機能を実現するメソッドで、入力データとして dat 変数を指定している( i= )。 そして続けて run メソッドを指定することで mcut の処理が実行される。 mcmdでは、このような単一の機能を持ったメソッドを80以上提供しており、 それらのメソッドを特に 処理メソッド と呼ぶ。

リスト 1.2 必要な項目の切り出し処理
1nm.mcut(f="customer,amount",i=dat).run()
2#[['A', '5200'], ['B', '800'], ['B', '3500'], ['A', '2000'], ['B', '4000']]

切り出したデータについて、顧客別に金額を合計する処理は msum メソッドにより実現できる。 以下では、mcut に続けて、msumを . (ドット)でつなげて指定しているが、 この書き方により、mcut の出力結果が、msum の入力として用いられることになる。 それぞれのメソッドはスレッド上で動作し、データはパイプ(FIFOキュー)によって接続されている 1。 詳細は「 処理フロー 」の節を参照されたい。

リスト 1.3 顧客別金額合計の処理
1nm.mcut(f="customer,amount",i=dat).msum(k="customer",f="amount").run()
2#[['A', '7200'], ['B', '8300']]

なお、上述の2つの実行結果のリストからは項目名が省かれているがこれは仕様である 2。 mcmdでは、リスト 1.3 の例のようにメソッドを連結して段階的に処理を行うが、 メソッド間を流れるデータはPythonリストではなく、テキストのバイトストリームである。 そして、最後のメソッド(リスト 1.3 の例では msum )に明示的に出力ファイル o= を指定しなければ、 項目名ヘッダを省いたリストが出力されるようになっている。

組み合わせるmcmdメソッドの数が増えると、それらのメソッドをドットで繋げていくと見にくくなる。 また、途中にコメントや条件文を書いたりすることもできない。 そこで、同じ機能を <<= 演算子を使うことで、これらの問題を解決することができる。 リスト 1.4 は、 リスト 1.3 と同様の処理を <<= 演算子で書き直したものである。 変数 f に次々と処理内容を追加登録し、最後に run メソッドで実行している。

リスト 1.4 <<= 演算子を利用した例
1f=None
2f <<= nm.mcut(f="customer,amount",i=dat)
3f <<= nm.msum(k="customer",f="amount")
4f.run()
5#[['A', '7200'], ['B', '8300']]

複数のメソッドをより複雑に連結することも可能であり、詳細は「 処理フロー 」の節を参照されたい。

最後に、表構造のデータをpythonのネイティブコードを使って処理する例を紹介する。 mcmdには、上記で紹介したようなメソッドの組み合わせで多様な処理を実現するが、 それだけでは実現困難な処理もでてくる。 そのようなときは、mcmdに組み込まれている、イテレータを用いればよい。 mcmdで処理した結果をシームレスにイテレータに接続することが可能である。 リスト 1.5 にその例を示す。 これは リスト 1.4 の結果を、( run せずに) for in のイテレータに接続したものである。 このイテレータは一行ずつ読み込むイテレータで、 amount 項目を100で割った結果を出力している。 for in イテレータでは、データは全て文字列として出力される。 mcmdには、 for in 以外にもいくつかのイテレータが用意されており、 データ型の指定や、コンテナ型の指定、さらにはブロック単位のイテレータなど、 多様な機能が用意されている。詳細は「 イテレータ 」の節を参照されたい。

リスト 1.5 イテレータを利用した例
1f=None
2f <<= nm.mcut(f="customer,amount",i=dat)
3f <<= nm.msum(k="customer",f="amount")
4for line in f:
5   print(line[0],int(line[1])/100)
6#A 72.0
7#B 83.0
1

正確には、処理フローオブジェクトに処理メソッド(mcutやmsum)を登録していっているだけで、最後のrunメソッドが登録された処理フローを実行している。詳しくは「 処理フロー 」の節を参照されたい。

2

項目名を1要素目に出力したければ writelist 関数を用いれば実現することができる。本例では、 nm.mcut(f="customer,amount",i=dat).msum(k="customer",f="amount").writelist(header=True).run() と書けばよい。