[Python] 297 数値を丸める(偶数丸め,四捨五入)

Java-Swingアプリの外部プログラムとしてPythonコードを走らせ、pandasにて合計を計算したところ変な小数が発生しました。

原因は不明ですが、放置もできないので数値を丸めました。pandasのround()メソッドは四捨五入ではなく偶数丸めです。偶数丸めとは、丸めるところが5の場合すぐ上の桁が偶数であれば切り捨て、奇数であれば切り上げる処理です。

数値の丸めはJIS Z 8401で規定されていて、規則Aが偶数丸め、規則Bが四捨五入です。つまり、誤差がより小さい偶数丸めの方を推奨しています。銀行が好んで使うため銀行丸めとも呼ばれています。

# 小数点以下の桁数は1桁に設定
prize = df['賞金'].sum(skipna=True).round(1)
print(f"獲得賞金 {prize}")

[Java] 66 Swing 06 PythonによるCSVファイル集計

CSVファイルの内容集計は外部プログラムのPython(pandas)に任せています。

集計コードは以下の通りです。Javaとの格闘で一時げんなりしていましたが、直感的にコーディングできるPythonによって息を吹き返しました。リスト内包表記を書くといつも爽快な気分になります。引き続き頑張っていけそうです。

import glob,csv
import pandas as pd

paths = glob.glob('/*.csv')
print(paths)

paths2 = sorted(paths)
print(paths2)

csvfile = paths2[-1]
print(csvfile)

df = pd.read_csv(csvfile,encoding='UTF-8')
print(df)

prize = df['賞金'].sum()
print(f"獲得賞金 {prize}")

race_count = len(df)
print("レース数 " + str(len(df)))

list = df['着順'].tolist()
一着回数 = len([i for i in list if i == 1])
二着回数 = len([i for i in list if i == 2])
三着回数 = len([i for i in list if i == 3])
着外回数 = len([i for i in list if i > 3])

着別度数 = f"{一着回数}-{二着回数}-{三着回数}-{着外回数}"
print("着別度数 " + 着別度数)

list_output = [{"獲得賞金":prize,"着別度数":着別度数}]

# 集計ファイル名作成(集計:aggregate)
filename = csvfile.split(".")[0] + "_agg.csv"

field_name = ['獲得賞金','着別度数']
with open(filename,'w',encoding='utf-8') as f:
    writer = csv.DictWriter(f, fieldnames = field_name)
    writer.writeheader()
    writer.writerows(list_output)

[Java] 65 外部コマンドの実行

Javaにおける配列、リスト、CSVファイルの取り扱いが私にとってはあまりに煩雑なので、外部コマンドにてPythonスクリプトを走らせることにします。

昨日はArrayListをCSVファイルに変換するのに散々痛い目にあって懲りました。JavaでCSVファイルの内容を読み込んで集計するなんてPythonユーザーの私にはかなりの苦行です。

JavaからPythonスクリプトを直接呼び出せないのでコンソールコマンドを使います。戻り値のやりとりはできないため、CSVファイル等を介してデータを出し入れします。

コンソールコマンドを実行するクラスは以下の通りです。

Javaとの実用面での関わりはGUI作成限定になりそうです。好きな言語ではありますが、コーディング快適性や開発速度を考慮しての結論です。

JavaはC言語と同様、実装に使うかどうかはともかく学習対象であることは変わりません。

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.nio.charset.Charset;

public class ProcessExecutor {
    public static void main() throws Exception {
    	System.out.println("ProcessExecutor");

        ProcessBuilder p = new ProcessBuilder("sh", "-c", "python test.py ; echo 'コマンド完了'");

        p.redirectErrorStream(true);

        // コマンドを実行する
        Process process = p.start();

        // 結果を受け取る
        try (BufferedReader r = new BufferedReader(new InputStreamReader(process.getInputStream(), Charset.defaultCharset()))) {
            String line;
            while ((line = r.readLine()) != null) {
                System.out.println(line);
            }
        }
        process.waitFor();
        int result = process.exitValue();
        System.out.printf("result = %d%n", result);
    }
}