IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 日本電気株式会社の特許一覧

特開2024-172701コード変換装置、方法およびプログラム
<>
  • 特開-コード変換装置、方法およびプログラム 図1
  • 特開-コード変換装置、方法およびプログラム 図2
  • 特開-コード変換装置、方法およびプログラム 図3
  • 特開-コード変換装置、方法およびプログラム 図4
  • 特開-コード変換装置、方法およびプログラム 図5
  • 特開-コード変換装置、方法およびプログラム 図6
  • 特開-コード変換装置、方法およびプログラム 図7
  • 特開-コード変換装置、方法およびプログラム 図8
  • 特開-コード変換装置、方法およびプログラム 図9
  • 特開-コード変換装置、方法およびプログラム 図10
  • 特開-コード変換装置、方法およびプログラム 図11
  • 特開-コード変換装置、方法およびプログラム 図12
  • 特開-コード変換装置、方法およびプログラム 図13
  • 特開-コード変換装置、方法およびプログラム 図14
  • 特開-コード変換装置、方法およびプログラム 図15
  • 特開-コード変換装置、方法およびプログラム 図16
  • 特開-コード変換装置、方法およびプログラム 図17
  • 特開-コード変換装置、方法およびプログラム 図18
< >
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024172701
(43)【公開日】2024-12-12
(54)【発明の名称】コード変換装置、方法およびプログラム
(51)【国際特許分類】
   G06F 8/30 20180101AFI20241205BHJP
【FI】
G06F8/30
【審査請求】未請求
【請求項の数】10
【出願形態】OL
(21)【出願番号】P 2023090583
(22)【出願日】2023-06-01
【公序良俗違反の表示】
(特許庁注:以下のものは登録商標)
1.PYTHON
(71)【出願人】
【識別番号】000004237
【氏名又は名称】日本電気株式会社
(74)【代理人】
【識別番号】100103090
【弁理士】
【氏名又は名称】岩壁 冬樹
(74)【代理人】
【識別番号】100124501
【弁理士】
【氏名又は名称】塩川 誠人
(72)【発明者】
【氏名】小寺 雅司
【テーマコード(参考)】
5B376
【Fターム(参考)】
5B376BC14
5B376BC16
5B376BC23
5B376BC31
5B376BC36
(57)【要約】
【課題】 データに対する処理時間を短縮できるように、既存のコードを同様の結果が得られるコードに変換できるコード変換装置を提供する。
【解決手段】入力手段81は、対象プログラムコードの入力を受け付ける。抽出手段82は、2次元の表形式のデータを表わすデータフレームに対して所定の列の値に基づいてデータフレームにおける各列の集約処理を行うことを示す第一プログラムコード、並びに、集約処理が行われた各データフレームに対して行われる予め定義された処理、および、その処理を呼び出す関数を示す第二プログラムコードを、対象プログラムコードから抽出する。変換手段83は、抽出されたコードを、上記関数により上記処理を呼び出す関数呼出しを行わない処理であって第一プログラムコードおよび第二プログラムコードによる処理と同様の結果が得られる処理を示すプログラムコードである代替プログラムコードに変換する。
【選択図】図18
【特許請求の範囲】
【請求項1】
処理の対象とするプログラムコードである対象プログラムコードの入力を受け付ける入力手段と、
2次元の表形式のデータを表わすデータフレームに対して所定の列の値に基づいてデータフレームにおける各列の集約処理を行うことを示す第一プログラムコード、並びに、前記集約処理が行われた各データフレームに対して行われる予め定義された処理および当該処理を呼び出す関数を示す第二プログラムコードを、前記対象プログラムコードから抽出する抽出手段と、
抽出された前記第一プログラムコードおよび前記第二プログラムコードを、前記関数により前記処理を呼び出す関数呼出しを行わない処理であって当該第一プログラムコードおよび当該第二プログラムコードによる処理と同様の結果が得られる処理を示すプログラムコードである代替プログラムコードに変換する変換手段と、
前記代替プログラムコードを出力する出力手段とを備えた
ことを特徴とするコード変換装置。
【請求項2】
変換手段は、第二プログラムコードが示す関数に含まれるプログラムコードを、予め定められた対応するプログラムコードに変換することで代替プログラムコードを生成する
請求項1記載のコード変換装置。
【請求項3】
変換手段は、処理を呼び出す際の引数の型と当該処理の戻り値の型とが一致している場合に、第一プログラムコードおよび第二プログラムコードを代替プログラムコードに変換する
請求項1または請求項2記載のコード変換装置。
【請求項4】
変換手段は、予め定義された処理内の操作のうち等号で結ばれた式で表わされる操作に対し、当該式の右辺および左辺がいずれも前記処理を呼び出す際の引数とするデータフレームに対する操作である場合であって、当該操作によって前記引数とするデータフレームの行数を変える可能性がない場合に、当該操作が示すコードを高速化するためのコードに変換する
請求項1または請求項2記載のコード変換装置。
【請求項5】
変換手段は、予め定義された処理内の操作のうち等号で結ばれた式で表わされる操作に対し、当該式の右辺および左辺の少なくとも一方が前記処理を呼び出す際の引数とするデータフレームに対する操作でない場合に、当該操作が示すコードを高速化するためのコードに変換する
請求項1または請求項2記載のコード変換装置。
【請求項6】
変換手段は、引数とするデータフレームにおいて集約するキーによる等号のフィルターによって、当該データフレーム以外のデータフレームが生成されている場合に、等号で結ばれた式で表わされる操作が示すコードを高速化するためのコードに変換する
請求項5記載のコード変換装置。
【請求項7】
処理の対象とするプログラムコードである対象プログラムコードの入力を受け付け、
2次元の表形式のデータを表わすデータフレームに対して所定の列の値に基づいてデータフレームにおける各列の集約処理を行うことを示す第一プログラムコード、並びに、前記集約処理が行われた各データフレームに対して行われる予め定義された処理および当該処理を呼び出す関数を示す第二プログラムコードを、前記対象プログラムコードから抽出し、
抽出された前記第一プログラムコードおよび前記第二プログラムコードを、前記関数により前記処理を呼び出す関数呼出しを行わない処理であって当該第一プログラムコードおよび当該第二プログラムコードによる処理と同様の結果が得られる処理を示すプログラムコードである代替プログラムコードに変換し、
前記代替プログラムコードを出力する
ことを特徴とするコード変換方法。
【請求項8】
変換手段は、第二プログラムコードが示す関数に含まれるプログラムコードを、予め定められた対応するプログラムコードに変換することで代替プログラムコードを生成する
請求項7記載のコード変換方法。
【請求項9】
コンピュータに、
処理の対象とするプログラムコードである対象プログラムコードの入力を受け付ける入力処理、
2次元の表形式のデータを表わすデータフレームに対して所定の列の値に基づいてデータフレームにおける各列の集約処理を行うことを示す第一プログラムコード、並びに、前記集約処理が行われた各データフレームに対して行われる予め定義された処理および当該処理を呼び出す関数を示す第二プログラムコードを、前記対象プログラムコードから抽出する抽出処理、
抽出された前記第一プログラムコードおよび前記第二プログラムコードを、前記関数により前記処理を呼び出す関数呼出しを行わない処理であって当該第一プログラムコードおよび当該第二プログラムコードによる処理と同様の結果が得られる処理を示すプログラムコードである代替プログラムコードに変換する変換処理、および、
前記代替プログラムコードを出力する出力処理
を実行させるためのコード変換プログラム。
【請求項10】
コンピュータに、
変換処理で、第二プログラムコードが示す関数に含まれるプログラムコードを、予め定められた対応するプログラムコードに変換することで代替プログラムコードを生成させる
請求項9記載のコード変換プログラム。
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、コンピュータが処理に用いるコードを変換するコード変換装置、コード変換方法およびコード変換プログラムに関する。
【背景技術】
【0002】
データベースに保存されたデータを効率的に利用するには、一般にプログラムコードが定義され、定義されたコードに基づいて処理が行われる。近年、大規模なデータを分析する需要および市場が拡大しており、大規模なデータを高速に分析するためには、高速化を意識したプログラムを作成する必要がある。
【0003】
例えば、特許文献1には、定義されたスクリプトにより作成されたデータ処理プログラムを解析してデータ処理を順次行うシステムが記載されている。特許文献1に記載されたシステムは、スクリプトの解析に際して、アプリケーションプログラムインターフェイス(API)関数の引数をライブラリの元のAPI関数の引数に合うように変換若しくは補完する。
【先行技術文献】
【特許文献】
【0004】
【特許文献1】特開2017-120611号公報
【発明の概要】
【発明が解決しようとする課題】
【0005】
特許文献1に記載されたシステムを用いることで、データ処理を実行可能なプログラムをスクリプトから生成することは可能である。しかし、特許文献1に記載されたシステムでは、データ処理に要する時間については考慮されていない。
【0006】
処理する対象のデータ数が増加すると処理に要する時間も増加することが想定される。そこで、データ処理の時間を短縮できるよう、既存のコードを同様の結果が得られるコードに変換できることが好ましい
【0007】
そこで、本開示では、データに対する処理時間を短縮できるように、既存のコードを同様の結果が得られるコードに変換できるコード変換装置、コード変換方法およびコード変換プログラムを提供することを目的とする。
【課題を解決するための手段】
【0008】
本開示によるコード変換装置は、処理の対象とするプログラムコードである対象プログラムコードの入力を受け付ける入力手段と、2次元の表形式のデータを表わすデータフレームに対して所定の列の値に基づいてデータフレームにおける各列の集約処理を行うことを示す第一プログラムコード、並びに、集約処理が行われた各データフレームに対して行われる予め定義された処理およびその処理を呼び出す関数を示す第二プログラムコードを、対象プログラムコードから抽出する抽出手段と、抽出された第一プログラムコードおよび第二プログラムコードを、上記関数により上記処理を呼び出す関数呼出しを行わない処理であって第一プログラムコードおよび第二プログラムコードによる処理と同様の結果が得られる処理を示すプログラムコードである代替プログラムコードに変換する変換手段と、代替プログラムコードを出力する出力手段とを備えたことを特徴とする。
【0009】
本開示によるコード変換方法は、処理の対象とするプログラムコードである対象プログラムコードの入力を受け付け、2次元の表形式のデータを表わすデータフレームに対して所定の列の値に基づいてデータフレームにおける各列の集約処理を行うことを示す第一プログラムコード、並びに、集約処理が行われた各データフレームに対して行われる予め定義された処理およびその処理を呼び出す関数を示す第二プログラムコードを、対象プログラムコードから抽出し、抽出された第一プログラムコードおよび第二プログラムコードを、上記関数により上記処理を呼び出す関数呼出しを行わない処理であって第一プログラムコードおよび第二プログラムコードによる処理と同様の結果が得られる処理を示すプログラムコードである代替プログラムコードに変換し、代替プログラムコードを出力することを特徴とする。
【0010】
本開示によるコード変換プログラムは、コンピュータに、処理の対象とするプログラムコードである対象プログラムコードの入力を受け付ける入力処理、2次元の表形式のデータを表わすデータフレームに対して所定の列の値に基づいてデータフレームにおける各列の集約処理を行うことを示す第一プログラムコード、並びに、集約処理が行われた各データフレームに対して行われる予め定義された処理およびその処理を呼び出す関数を示す第二プログラムコードを、対象プログラムコードから抽出する抽出処理、抽出された第一プログラムコードおよび第二プログラムコードを、上記関数により上記処理を呼び出す関数呼出しを行わない処理であって第一プログラムコードおよび第二プログラムコードによる処理と同様の結果が得られる処理を示すプログラムコードである代替プログラムコードに変換する変換処理、および、代替プログラムコードを出力する出力処理を実行させることを特徴とする。
【発明の効果】
【0011】
本開示によれば、データに対する処理時間を短縮できるように、既存のコードを同様の結果が得られるコードに変換できる。
【図面の簡単な説明】
【0012】
図1】コード変換装置の一実施形態の構成例を示すブロック図である。
図2】集約処理の例を示す説明図である。
図3】コードの対応関係の例を示す説明図である。
図4】コード変換装置の動作例を示すフローチャートである。
図5】抽出処理の例を示すフローチャートである。
図6】抽出処理の例を示すフローチャートである。
図7】変換処理の例を示すフローチャートである。
図8】変換処理の例を示すフローチャートである。
図9】抽出処理および変換処理の例を示す説明図である。
図10】変換処理を行う第一の具体例を示す説明図である。
図11】変換処理を行う第一の具体例を示す説明図である。
図12】変換処理を行う第二の具体例を示す説明図である。
図13】変換処理を行う第二の具体例を示す説明図である。
図14】変換処理を行う第三の具体例を示す説明図である。
図15】変換処理を行う第三の具体例を示す説明図である。
図16】変換処理を行う第四の具体例を示す説明図である。
図17】変換処理を行う第四の具体例を示す説明図である。
図18】本開示によるコード変換装置の概要を示すブロック図である。
【発明を実施するための形態】
【0013】
以下、本開示の実施形態を図面を参照して説明する。以下では、2次元の表形式で表わされるデータを処理する場合について説明する。このような形式で表わされるデータの一例として、データフレームが挙げられる。以下の説明では、2次元の表形式のデータを、データフレームと記すこともある。
【0014】
図1は、本開示によるコード変換装置の一実施形態の構成例を示す説明図である。本実施形態によるコード変換装置100は、記憶部10と、入力部20と、コード抽出部30と、コード変換部40と、出力部50とを備えている。
【0015】
記憶部10は、コード変換装置100が処理を行う際に用いられる各種情報を記憶する。また、記憶部10は、後述する入力部20が受け付けた情報や、コード変換部40による処理結果を記憶してもよい。記憶部10は、例えば、磁気ディスク等により実現される。
【0016】
入力部20は、処理の対象とするプログラムコード(以下、対象プログラムコードと記す。)の入力を受け付ける。入力部20は、例えば、記憶部10から対象プログラムコードを取得してもよく、外部のストレージサーバ(図示せず)から対象プログラムコードを取得してもよい。また、入力部20は、ユーザインタフェースを介してユーザから対象プログラムコードの入力を受け付けてもよい。
【0017】
以下の説明では、プログラミング言語としてPythonを例示し、対象プログラムコードの記載に用いられるライブラリとしてPandasを例示する。ただし、対象プログラムコードがPandasに基づいて記載されている必要はなく、プログラミング言語もPython以外の任意の言語を使用可能である。後述するコード抽出部30およびコード変換部40は、用いられる対象プログラムコードの規則に従って処理を行えばよい。
【0018】
コード抽出部30は、入力された対象プログラムコードの中から、データフレームに対する処理時間を短縮し得るコードに変換可能なプログラムコードを抽出する。具体的には、コード抽出部30は、2次元の表形式のデータ(すなわち、データフレーム)に対して所定の列の値に基づいてデータフレームにおける各列の集約処理を行うことを示すプログラムコード(以下、第一プログラムコードと記す。)を抽出する。Pandasの場合、第一プログラムコードとして抽出される集約処理の例として、groupby()メソッドが挙げられる。
【0019】
図2は、集約処理の例を示す説明図である。図2は、データフレームdfのデータに対し、生存した人と死亡した人(Survived)とをグループに分けて平均年齢を計算する処理の例を示す。
【0020】
さらに、コード抽出部30は、入力された対象プログラムコードの中から、上述する集約処理が行われた各データフレームに対して行われる予め定義された処理およびその処理を呼び出す関数を示すプログラムコード(以下、第二プログラムコードと記す。)を抽出する。Pandasの場合、第二プログラムコードとして抽出される関数の例として、apply()メソッドが挙げられ、予め定義された処理として外部関数(ユーザ定義関数)が挙げられる。
【0021】
コード変換部40は、抽出されたコード(より具体的には、第一プログラムコードおよび第二プログラムコード)を、データフレームに対する処理時間を短縮し得るコードに変換する。なお、ここでのコードの変換とは、抽出されたコードそのものの変換だけでなく、変換により必要になった(変換により影響を受ける)他のコードに対する変換も含む。
【0022】
具体的には、コード変換部40は、抽出されたコードを、抽出された関数により処理を呼び出す関数呼出しを行わない処理であって、抽出されたコードによる処理と同様の結果が得られる処理を示すプログラムコード(以下、代替プログラムコード)に変換する。すなわち、コード変換部40は、対象プログラムコードに対し、集約処理されたデータフレームに対する処理を、外部関数の関数呼出しを行わない処理で実現できるように変換する。
【0023】
コード変換部40は、第二プログラムコードが示す関数に含まれるプログラムコードを、予め定められた対応するプログラムコードに変換することで代替プログラムコードを生成してもよい。この場合、処理時間を短縮し得るコード(変換後コード)とそのコードに変換可能なコード(変換前コード)との対応関係が予め記憶部10に記憶され、コード変換部40は、その対応関係を読み込んで、変換処理を行ってもよい。
【0024】
なお、コード変換部40は、関数の引数の型(タイプ)と、その関数の戻り値の型(タイプ)とが一致している場合に、第一プログラムコードおよび第二プログラムコードを代替プログラムコードに変換することが好ましい。これにより、プログラムコードが同様の結果が得られる処理に変換されることを担保できる。型が一致する例として、例えば、いずれの引数も型がデータフレームである場合、などが挙げられる。
【0025】
図3は、コードの対応関係の例を示す説明図である。図3では、Pandasの場合に利用される対応関係の例を示している。例えば、図3に例示する対応表の2行目では、集約されたデータフレームの先頭行の要素の値で他の要素の値を上書きする処理(g[“C”]=g[“B”]+iloc[0])に対し、処理時間を短縮し得るコード(df[“C”]=df.groupby([“A”][“B”].transform(“first”)が対応付けられていることを示す。
【0026】
例えば、上記に例示したPandasの場合、対象プログラムコードとして、apply() メソッドを用いた関数呼出しにより外部関数func()が呼び出され、その外部関数で、groupby() メソッドにより集約処理されたデータフレームの処理が実行される、といったコードが想定される。
【0027】
この場合、コード変換部40は、apply() メソッドを用いて外部関数func()を呼び出す処理を、外部関数func()を呼び出さずに同様の結果が得られる処理にプログラムコードに変換する。
【0028】
このように変換された代替プログラムコードによる処理は、関数呼出しを行う処理が抑制されているため、同様の結果が得られるプログラムコードであっても、データに対する処理時間を短縮できる。なお、図3に例示する対応関係を用いた具体的処理については後述される。
【0029】
出力部50は、代替プログラムコードを出力する。出力部50は、代替プログラムコードを表示装置(図示せず)に表示してもよく、記憶部10に代替プログラムコードを記憶させてもよい。また、出力部50は、代替プログラムコードを実行する装置(図示せず)に、そのコードを送信してもよい。
【0030】
入力部20と、コード抽出部30と、コード変換部40と、出力部50とは、プログラム(コード変換プログラム)に従って動作するコンピュータのプロセッサ(例えば、CPU(Central Processing Unit )、GPU(Graphics Processing Unit))によって実現される。
【0031】
例えば、プログラムは、コード変換装置100の記憶部10に記憶され、プロセッサは、そのプログラムを読み込み、プログラムに従って、入力部20、コード抽出部30、コード変換部40、出力部50として動作してもよい。また、コード変換装置100の機能がSaaS(Software as a Service )形式で提供されてもよい。
【0032】
また、入力部20と、コード抽出部30と、コード変換部40と、出力部50とは、それぞれが専用のハードウェアで実現されていてもよい。また、各装置の各構成要素の一部又は全部は、汎用又は専用の回路(circuitry )、プロセッサ等やこれらの組合せによって実現されてもよい。これらは、単一のチップによって構成されてもよいし、バスを介して接続される複数のチップによって構成されてもよい。各装置の各構成要素の一部又は全部は、上述した回路等とプログラムとの組合せによって実現されてもよい。
【0033】
また、コード変換装置100の各構成要素の一部又は全部が複数の情報処理装置や回路等により実現される場合には、複数の情報処理装置や回路等は、集中配置されてもよいし、分散配置されてもよい。例えば、情報処理装置や回路等は、クライアントサーバシステム、クラウドコンピューティングシステム等、各々が通信ネットワークを介して接続される形態として実現されてもよい。
【0034】
次に、本実施形態のコード変換装置100の動作を説明する。図4は、本実施形態のコード変換装置100の動作例を示すフローチャートである。入力部20は、対象プログラムコードの入力を受け付ける(ステップS11)。コード抽出部30は、集約処理を行うことを示す第一プログラムコード、および、集約処理が行われたデータフレームに対して行われる処理およびその処理を呼び出す関数を示す第二プログラムコードを、対象プログラムコードから抽出する(ステップS12)。
【0035】
コード変換部40は、抽出されたプログラムコードを、関数呼出しを行わずに同様の結果が得られる代替プログラムコードに変換する(ステップS13)。そして、出力部50は、代替プログラムコードを出力する(ステップS14)。
【0036】
次に、コード抽出部30が行う処理の具体例を説明する。以下の説明では、上述するPandasを用いた具体例を説明する。また、以下の説明では、図3に例示する対応表に合わせ、コード抽出部30が抽出する対象のコードとして、ilocプロパティで参照して上書きする操作、算術演算、および、集約操作を例示する。ただし、抽出対象のコードは、これらのコードに限定されない。関数呼出しを行わない処理であって同様の結果が得られる変換処理を対応表に定義できる処理であれば、抽出対象は任意である。
【0037】
図5および図6は、コード抽出部30による抽出処理の例を示すフローチャートである。ここでは、対象プログラムコード内の関数をFuncと記し、関数呼出しの引数になるデータフレームをgと記す。
【0038】
まず、コード抽出部30は、呼び出される関数Funcを探索し、その関数で返却(return)されるデータフレームが、その関数に入力される(すなわち、引数の)データフレームと同一か否か判定する(図5におけるステップS101)。同一である場合(ステップS101におけるYes)、コード抽出部30は、その関数について高速化可能か判定する処理を行う。その際、コード抽出部30は、関数内の一番の下の行から順次チェック処理を行う(ステップS102)。一方、同一でない場合、コード抽出部30は、高速化できないと判定し、処理を終了する(ステップS120)。
【0039】
コード抽出部30は、関数Func内の処理を一行読み込む(ステップS103)。コード抽出部30は、読み込んだ行(以下、対象行と記す)の操作が、右辺および左辺ともにgに対する操作か否か判定する(ステップS104)。右辺および左辺ともにgに対する操作である場合(ステップS104におけるYes)、コード抽出部30は、それらの処理がgの行数を変える可能性があるか否か判定する(ステップS105)。
【0040】
gの行数を変える可能性がある場合(ステップS105におけるYes)、コード抽出部30は、高速化できないと判定し、処理を終了する(ステップS120)。一方、gの行数を変える可能性がない場合(ステップS105におけるNo)、コード抽出部30は、対象行の操作がilocプロパティで参照して上書きする操作(以下、第一操作と記す。)か否か判定する(ステップS106)。対象行の操作が第一操作の場合(ステップS106におけるYes)、コード抽出部30は、対象行にフラグ#1を設定する(ステップS130)。
【0041】
同様に、対象行の操作が第一操作でなく(ステップS106におけるNo)、算術演算の場合(ステップS107におけるYes)、コード抽出部30は、対象行にフラグ#1を設定する(ステップS130)。さらに、対象行の操作が算術演算でなく(ステップS107におけるNo)、集約操作の場合(ステップS108におけるYes)、コード抽出部30は、対象行にフラグ#1を設定する(ステップS130)。そして、対象行の操作が集約演算でない場合(ステップS108におけるNo)、コード抽出部30は、高速化できないと判定し、処理を終了する(ステップS120)。なお、ステップS106からステップS108までの処理は、それぞれ順序が入れ替わってもよい。
【0042】
対象行にフラグ#1を設定した後のステップS130において、コード抽出部30は、対象行の上の行(すなわち、前の処理)が存在するか否か判定する(ステップS109)。対象行の上の行が存在する場合(ステップS109におけるYes)、コード抽出部30は、一つ上の行を対象行とし(ステップS110)、関数Func内の処理を一行読み込むステップS103以降の処理を繰り返す。
【0043】
一方、対象行の上の行が存在しない場合(ステップS109におけるNo)、コード抽出部30は、関数Func内の全ての行にフラグ#1が設定されているか否か判定する(ステップS111)。全ての行にフラグ#1が設定されていない場合(ステップS111におけるNo)、コード抽出部30は、高速化できないと判定し、処理を終了する(ステップS120)。一方、全ての行にフラグ#1が設定されている場合(ステップS111におけるYes)、コード抽出部30は、高速化可能できると判定する(ステップS140)。
【0044】
なお、ステップS104において、右辺および左辺ともにgに対する操作でない場合(ステップS104におけるNo)、すなわち、g以外のデータフレームdfに対する処理が行われる場合、図6に例示するステップS201以降の処理が行われる。
【0045】
具体的には、コード抽出部30は、集約するキー(groupkey)による等号のフィルタによって、g以外のデータフレームdfが生成されているか否か判定する(ステップS201)。g以外のデータフレームdfが生成されている場合(ステップS201におけるYes)、コード抽出部30は、対象行にフラグ#1を設定するとともに、フラグ#2が設定されている行のフラグをフラグ#1に置き換える(ステップS202)。以降、図5におけるステップS109以降の処理が行われる。
【0046】
一方、g以外のデータフレームdfが生成されていない場合(ステップS201におけるNo)、コード抽出部30は、対象行の操作がデータを参照する操作(以下、第二操作と記す。)か否か判定する(ステップS203)。対象行の操作が第二操作の場合(ステップS203におけるYes)、コード抽出部30は、対象行にフラグ#2を設定する(ステップS210)。
【0047】
同様に、対象行の操作が第二操作でなく(ステップS203におけるNo)、算術演算の場合(ステップS204におけるYes)、コード抽出部30は、対象行にフラグ#2を設定する(ステップS210)。さらに、対象行の操作が算術演算でなく(ステップS204におけるNo)、集約操作の場合(ステップS205におけるYes)、コード抽出部30は、対象行にフラグ#2を設定する(ステップS210)。そして、対象行の操作が集約演算でない場合(ステップS205におけるNo)、コード抽出部30は、高速化できないと判定し(ステップS120)、処理を終了する。なお、ステップS203からステップS205までの処理は、それぞれ順序が入れ替わってもよい。
【0048】
なお、ステップS210において、対象行にフラグ#2が設定された後、ステップ
図5におけるステップS109以降の処理が行われる。
【0049】
次に、コード変換部40が行う処理の具体例を説明する。図7および図8は、コード変換部40による変換処理の例を示すフローチャートである。ここでは、図5および図6に例示する抽出処理が行われているものとし、高速化が可能と判定された対象のコードについて変換処理が行われるものとする。また、コード変換部40は、対象の関数内の一番の下の行から処理を開始する(ステップS301)。
【0050】
コード変換部40は、関数Func内の処理を一行読み込む(ステップS302)。コード変換部40は、読み込んだ行(すなわち、対象行)の操作が、右辺および左辺ともにgに対する操作か否か判定する(ステップS303)。右辺および左辺ともにgに対する操作である場合(ステップS303におけるYes)、コード変換部40は、対象行の操作がilocプロパティで参照して上書きする操作(すなわち、第一操作)か否か判定する(ステップS304)。対象行の操作が第一操作の場合(ステップS304におけるYes)、コード変換部40は、その対象行のコードを高速化するためのコードに変換する(ステップS305)。
【0051】
同様に、対象行の操作が第一操作でなく(ステップS304におけるNo)、算術演算の場合(ステップS306におけるYes)、コード変換部40は、その対象行のコードを高速化するためのコードに変換する(ステップS307)。さらに、対象行の操作が算術演算でなく(ステップS306におけるNo)、集約操作の場合(ステップS308におけるYes)、コード変換部40は、その対象行のコードを高速化するためのコードに変換する(ステップS309)。そして、対象行の操作が集約演算でない場合(ステップS308におけるNo)、コード変換部40は、コードの変換を行わずに処理を終了する。なお、ステップS304からステップS309までの処理において、判定処理は順序が入れ替わってもよい。
【0052】
コードが変換された後のステップS311において、コード変換部40は、対象行の上の行(すなわち、前の処理)が存在するか否か判定する(ステップS311)。対象行の上の行が存在する場合(ステップS311におけるYes)、コード変換部40は、一つ上の行を対象行とし(ステップS312)、関数Func内の処理を一行読み込むステップS302以降の処理を繰り返す。
【0053】
一方、対象行の上の行が存在しない場合(ステップS311におけるNo)、コード変換部40は、処理(高速化するためのコードへの変換処理)を終了する(ステップS320)。
【0054】
なお、ステップS303において、右辺および左辺ともにgに対する操作でない場合(ステップS303におけるNo)、すなわち、g以外のデータフレームdfに対する処理が行われる場合、図8に例示するステップS401以降の処理が行われる。
【0055】
具体的には、コード変換部40は、集約するキー(groupkey)による等号のフィルタによって、g以外のデータフレームdfが生成されているか否か判定する(ステップS401)。g以外のデータフレームdfが生成されている場合(ステップS401におけるYes)、コード変換部40は、その対象行のコードを高速化するためのコードに変換する(ステップS402)。
【0056】
一方、g以外のデータフレームdfが生成されていない場合(ステップS401におけるNo)、コード変換部40は、対象行の操作がilocプロパティで参照して上書きする操作(すなわち、第一操作)か否か判定する(ステップS403)。対象行の操作が第一操作の場合(ステップS403におけるYes)、コード変換部40は、その対象行のコードを高速化するためのコードに変換する(ステップS404)。
【0057】
同様に、対象行の操作が第一操作でなく(ステップS403におけるNo)、算術演算の場合(ステップS405におけるYes)、コード変換部40は、その対象行のコードを高速化するためのコードに変換する(ステップS406)。さらに、対象行の操作が算術演算でなく(ステップS405におけるNo)、集約操作の場合(ステップS407におけるYes)、コード変換部40は、その対象行のコードを高速化するためのコードに変換する(ステップS408)。そして、対象行の操作が集約演算でない場合(ステップS407におけるNo)、コード変換部40は、コードの変換を行わずに処理を終了する。なお、ステップS403からステップS408までの処理において、判定処理は順序が入れ替わってもよい。
【0058】
なお、高速化するためのコードに変換する処理が行われた後(すなわち、ステップS402、ステップS404、ステップS406およびステップS408の後)、図7におけるステップS311以降の処理が行われる。
【0059】
ここで、具体的なプログラムコードを用いて、図5図8に例示するフローチャートが示す抽出処理および変換処理を説明する。図9は、抽出処理および変換処理の例を示す説明図である。
【0060】
まず、コード抽出部30は、返却(return)されるデータフレームが、入力された(すなわち、引数の)データフレームと同一であるか否か判定する。図9に例示するコードでは、いずれも同一のデータフレームgである。
【0061】
次に、コード抽出部30は、一番下の行(処理の3行目)を読み込み、対象行の操作が右辺および左辺ともにgに対する操作か否か判定する。ここでは、右辺および左辺ともにgに対する操作でないため、コード抽出部30は、集約するキー(groupkey)による等号のフィルタによって、g以外のデータフレームdfが生成されているか否か判定する。
【0062】
ここでは、g以外のデータフレームdfは生成されていないため、コード抽出部30は、データを参照する操作か、算術演算か、集約操作か判定する。ここでは、集約操作に該当するため、対象行にフラグ#2を設定する。そして、対象行の上の行(すなわち、前の処理)が存在するため、その行(処理の2行目)を読み込む。
【0063】
コード抽出部30は、対象行の操作が右辺および左辺ともにgに対する操作か否か判定する。ここでは、右辺および左辺ともにgに対する操作でないため、コード抽出部30は、集約するキー(groupkey)による等号のフィルタによって、g以外のデータフレームdfが生成されているか否か判定する。ここでは、g以外のデータフレームdfは生成されていないため、コード抽出部30は、データを参照する操作か、算術演算か、集約操作か判定する。ここでは、算術演算に該当するため、対象行にフラグ#2を設定する。そして、対象行の上の行(すなわち、前の処理)が存在するため、その行(処理の1行目)を読み込む。
【0064】
コード抽出部30は、対象行の操作が右辺および左辺ともにgに対する操作か否か判定する。ここでは、右辺および左辺ともにgに対する操作でないため、コード抽出部30は、集約するキー(groupkey)による等号のフィルタによって、g以外のデータフレームdfが生成されているか否か判定する。ここでは、g以外のデータフレームdfが生成されているため、コード抽出部30は、対象行にフラグ#1を設定する。さらに、コード抽出部30は、フラグ#2が設定されている行のフラグをフラグ#1に置き換える。
【0065】
そして、対象行の上の行(すなわち、前の処理)が存在しないため、コード抽出部30は、全ての行にフラグ#1が設定されているか否か判定する。ここでは、全ての行にフラグ#1が設定されているため、コード抽出部30は、高速化可能できると判定する。
【0066】
以上のように、本実施形態では、入力部20が、対象プログラムコードの入力を受け付け、コード抽出部30が、第一プログラムコードおよび第二プログラムコードを対象プログラムコードから抽出する。そして、コード変換部40が、抽出されたコードを代替プログラムコード、すなわち、関数呼出しを行わない処理であって抽出されたコードによる処理と同様の結果が得られる処理を示すプログラムコードに変換し、出力部50が、代替プログラムコードを出力する。
【0067】
よって、データに対する処理時間を短縮できるように、既存のコードを同様の結果が得られるコードに変換できる。すなわち、コード変換部40が、集約操作をした後に関数呼出しを行うプログラムコードを、関数呼出しを行わないプログラムコードに変更するため、処理に要する時間を抑制できる。
【0068】
以下、具体例を用いて、本開示のコード変換装置の動作を説明する。
上述するように、コード抽出部30は、第一プログラムコードおよび第二プログラムコードを対象プログラムコードから抽出する。以下の説明では、func(g)が、データフレームを引数とする予め定義された処理を示すプログラムコードであるとする。このとき、apply(func)およびfunc(g)は、第二プログラムコードの例であり、データフレームに対して行われる予め定義された処理funcおよびfuncを呼び出す関数applyを示すプログラムコードである。
【0069】
また、上述するように、groupbyは、第一プログラムコードの例であり、所定の列の値に基づいてデータフレームにおける各列の集約処理を行うことを示すプログラムコードである。そこで、本具体例では、コード抽出部30は、groupby+apply(func)という内容を表わすプログラムコードを抽出する。
【0070】
なお、pandasにおけるapplyは、利便性を重視したメソッドであり、プログラマにとって実現したい機能を直感的に記載できる便利なメソッドである。一方、groupby+apply(func)という形式でコードを記載した場合、集約化されたデータフレームのグループ数だけfuncを呼び出す必要があるため、計算が遅くなることがある。一方、本開示のコード変換装置は、そのような記載のコードを自動的に検出して、高速化するためのコードに変換することを可能にしている。
【0071】
まず、変換処理を行う第一の具体例を説明する。図10および図11は、変換処理を行う第一の具体例を示す説明図である。図10および図11では、データフレームdf1の列Aの値でグループ化したときに、他の列Bの先頭の値でグループ内の列Bの値を上書きする処理を例示する。
【0072】
groupby+apply(func)という形式でコードを記載した場合、本処理は、図10に例示するコードCD1で表わすことができる。まず、データフレームdf1に対して列Aでグループ化した場合、例えば、値A1について集約処理されたデータフレームgが得られる。他の値についても同様である。コードCD1は、このデータフレームgを引数として、集約処理されたデータフレームの数だけ、関数funcを呼び出す処理を示すものである。その結果、データフレームr1が得られる。
【0073】
これに対し、図11に例示するように、図10に例示するコードCD1は、高速化するためのコードCD2に変換することができる。コード変換部40は、例えば、図3に例示する対応関係(具体的には、表の2行目)に基づいて代替プログラムコードであるコードCD2を生成すればよい。これにより、データフレームr2が得られるが、その内容は、図10に例示するデータフレームr1の内容と同様である。
【0074】
次に、変換処理を行う第二の具体例を説明する。図12および図13は、変換処理を行う第二の具体例を示す説明図である。図12および図13では、データフレームdf2を列Aの値でグループ化したときに、他の列Bの値と列Cの値を加算する処理を例示する。
【0075】
groupby+apply(func)という形式でコードを記載した場合、本処理は、図12に例示するコードCD3で表わすことができる。まず、データフレームdf2に対して列Aでグループ化した場合、例えば、値A1について集約処理されたデータフレームgが得られる。他の値についても同様である。コードCD3は、このデータフレームgを引数として、集約処理されたデータフレームの数だけ、関数funcを呼び出す処理を示すものである。その結果、データフレームr3が得られる。
【0076】
これに対し、図13に例示するように、図12に例示するコードCD3は、高速化するためのコードCD4に変換することができる。コード変換部40は、例えば、図3に例示する対応関係(具体的には、表の3行目)に基づいて代替プログラムコードであるコードCD4を生成すればよい。これにより、データフレームr4が得られるが、その内容は、図12に例示するデータフレームr3の内容と同様である。
【0077】
なお、本処理において、コード変換部40は、加算した値で列Bを更新せず、新しい列Dを作成してその列に加算した値を設定するようにしてもよい。
【0078】
次に、変換処理を行う第三の具体例を説明する。図14および図15は、変換処理を行う第三の具体例を示す説明図である。図14および図15では、データフレームdf3の列Aの値でグループ化したときに、そのグループ内の他の列Bの値の総和を算出する処理を例示する。
【0079】
groupby+apply(func)という形式でコードを記載した場合、本処理は、図14に例示するコードCD5で表わすことができる。まず、データフレームdf3に対して列Aでグループ化した場合、例えば、値A1について集約処理されたデータフレームgが得られる。他の値についても同様である。コードCD5は、このデータフレームgを引数として、集約処理されたデータフレームの数だけ、関数funcを呼び出す処理を示すものである。その結果、データフレームr5が得られる。
【0080】
これに対し、図15に例示するように、図14に例示するコードCD5は、高速化するためのコードCD6に変換することができる。コード変換部40は、例えば、図3に例示する対応関係(具体的には、表の4行目)に基づいて代替プログラムコードであるコードCD6を生成すればよい。これにより、データフレームr6が得られるが、その内容は、図14に例示するデータフレームr5の内容と同様である。
【0081】
次に、変換処理を行う第四の具体例を説明する。図16および図17は、変換処理を行う第四の具体例を示す説明図である。図16および図17では、データフレームdf4のID列に含まれる値に一致するデータを、他のデータフレームdf5で集約するキー(groupkey)であるID列から取り出す処理を例示する。なお、別のデータフレームからgroupkeyと等しいデータを取り出すfilter操作は、結合操作とみなすことができる。このような操作の一例として、例えば、データフレームdf4の顧客IDをキーとして、顧客の過去の商品購買記録を格納したデータフレームdf5から統計データを計算する操作が挙げられる。
【0082】
groupby+apply(func)という形式でコードを記載した場合、本処理は、図16に例示するコードCD7で表わすことができる。コードCD7は、IDでグループ化されたデータフレームを引数として、集約処理されたデータフレームの数だけ、関数funcを呼び出す処理を示すものである。
【0083】
まず、データフレームdf4に対して列IDでグループ化し、例えば、値A1に対応する行をデータフレームdf5から探索することで、データフレームdf6が得られる。そして、得られたデータフレームdf6の値の総和を計算する。他の値についても同様である。その結果、データフレームr7が得られる。
【0084】
これに対し、図17に例示するように、図16に例示するコードCD7は、高速化するためのコードCD8に変換することができる。コード変換部40は、例えば、図3に例示する対応関係(具体的には、表の1行目)に基づいて代替プログラムコードであるコードCD8を生成すればよい。これにより、データフレームr11が得られるが、その内容は、図16に例示するデータフレームr7の内容と同様である。
【0085】
以下、第四の具体例の変換処理を詳細に説明する。
まず、コード変換部40は、対象プログラムコードを、後で使用するためにデータフレームdf4をコピーしてインデックスを割り振ったデータフレームdf7を生成するコードに変換する。次に、コード変換部40は、対象プログラムコードを、データフレームdf5とデータフレームdf7をカラムIDで結合してデータフレームd8を生成するコードに変換する。
【0086】
なお、本具体例では、データフレームdf7のカラムIDに注目すると、一番上のIndex=0に対して値A1が対応付けられている。また、データフレームdf5全体に注目すると、カラムIDに対して値A1が対応する行が複数(2つ)存在する。この場合、データフレームdf7のIndex=0の行は複製されて結合される。
【0087】
他のIndexについても同様に、Index=1の行は2つに複製され、Index=2の行は1つ複製される。また、Index=3の行およびIndex=4の行は1つ複製され、Index=5の行は複製されない。ここで、カラムAが一致して、複数回データフレームdf5の該当行を複製することは、apply(func)中で、キーが一致する行について、フィルタでデータフレームdf5を抜き出す操作に対応する。
【0088】
コード変換部40は、対象プログラムコードを、データフレームd8のIndexをキーに集約処理を行って総和を算出し、算出した結果を示すデータフレームd9を生成するコードに変換する。そして、コード変換部40は、対象プログラムコードを、コピーしておいたデータフレームdf4とデータフレームdf9とを結合してデータフレームdf10を生成するコードに変換する。なお、ID=C2に示すような欠損値が存在することを考慮し、コード変換部40は、対象プログラムコードを、欠損値を0で埋めたデータフレームdf11を生成するコードに変換する。
【0089】
次に、本開示の概要を説明する。図18は、本開示によるコード変換装置の概要を示すブロック図である。本開示によるコード変換装置80(例えば、コード変換装置100)は、処理の対象とするプログラムコードである対象プログラムコードの入力を受け付ける入力手段81(例えば、入力部20)と、2次元の表形式のデータを表わすデータフレームに対して所定の列の値に基づいてデータフレームにおける各列の集約処理を行うことを示す第一プログラムコード(例えば、groupby() メソッド)、並びに、集約処理が行われた各データフレームに対して行われる予め定義された処理(例えば、ユーザ定義関数)および、その処理を呼び出す関数(例えば、apply() メソッド)を示す第二プログラムコードを、対象プログラムコードから抽出する抽出手段82(例えば、コード抽出部30)と、抽出された第一プログラムコードおよび第二プログラムコードを、上記関数により上記処理を呼び出す関数呼出しを行わない処理であって第一プログラムコードおよび第二プログラムコードによる処理と同様の結果が得られる処理を示すプログラムコードである代替プログラムコードに変換する変換手段83(例えば、コード変換部40)と、代替プログラムコードを出力する出力手段84(例えば、出力部50)とを備えている。
【0090】
そのような構成により、データに対する処理時間を短縮できるように、既存のコードを同様の結果が得られるコードに変換できる。
【0091】
具体的には、変換手段83は、第二プログラムコードが示す関数に含まれるプログラムコードを、予め定められた対応するプログラムコード(例えば、図2に例示する対応表)に変換することで代替プログラムコードを生成してもよい。
【0092】
また、変換手段83は、処理を呼び出す際の引数の型とその処理の戻り値の型とが一致している場合に、第一プログラムコードおよび第二プログラムコードを代替プログラムコードに変換してもよい。
【0093】
また、変換手段83は、予め定義された処理内の操作のうち等号で結ばれた式で表わされる操作に対し、その式の右辺および左辺がいずれも処理を呼び出す際の引数とするデータフレームに対する操作である場合であって、その操作によって引数とするデータフレームの行数を変える可能性がない場合に、その操作が示すコードを高速化するためのコードに変換してもよい。
【0094】
また、変換手段83は、予め定義された処理内の操作のうち等号で結ばれた式で表わされる操作に対し、その式の右辺および左辺の少なくとも一方が処理を呼び出す際の引数とするデータフレームに対する操作でない場合に、その操作が示すコードを高速化するためのコードに変換してもよい。
【0095】
また、変換手段83は、引数とするデータフレームにおいて集約するキーによる等号のフィルタによって、そのデータフレーム以外のデータフレームが生成されている場合に、等号で結ばれた式で表わされる操作が示すコードを高速化するためのコードに変換してもよい。
【符号の説明】
【0096】
10 記憶部
20 入力部
30 コード抽出部
40 コード変換部
50 出力部
100 コード変換装置
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12
図13
図14
図15
図16
図17
図18