Pandas を利用して,CSV ファイルを読み込んで問題を解いてみよう.なお,Pandas の利用方法はこちらを参照してください.
GitHub のリポジトリからメニューのデータ (gochi-menu.csv) を Pandas のデータフレームに読み込んで表示してみます.なお,Web ブラウザで CSV ファイルをダウンロードして Python プログラムと同じフォルダにコピーしたものを読み込んでも良いでしょう.なお,gochi-sample.csv ファイルの中身は次のようなカンマ区切りのテキストファイルです.
gochi-sample.csv
no,menu,size,price
0,あわびのオイスターソース煮込み,,928
1,かに肉と青梗菜のクリーム煮込み,,598
2,タチウオ四川風炒め,(小),880
3,タチウオ四川風炒め,(大),1180
4,にんにくの芽と蜂の巣の四川風炒め,,598
5,フカヒレスープ,,1280
6,ふかひれ姿煮込み,(小),1860
7,ふかひれ姿煮込み,(大),2580
8,むしホタテにんにく風味,,788
9,伊勢海老チリ or マヨ,,2588
10,海鮮いため,,898
11,海鮮入りおこげ,,898
12,海老サラダ,,598
13,海老チリソース,,698
14,海老マヨネーズ,,698
15,活アゲマキ貝とニンニクの芽炒め,(小),980
16,活アゲマキ貝とニンニクの芽炒め,(大),1280
17,活カキ入りチヂミ,(小),880
18,活カキ入りチヂミ,(大),1000
19,干し海老白菜芯炒め,,498
20,牛肉と生椎茸オイスタソース炒め,,698
21,黒胡椒入り鳥唐揚げ,,498
22,黒酢いり広東風キムチ,,398
23,蒸し豚肉の辛ソース,,598
24,赤酒粕入り豚バラ煮込みと花巻挟み,(小),680
25,赤酒粕入り豚バラ煮込みと花巻挟み,(大),980
26,ジャージャーメン,,550
27,ビーフン五目炒め,(小),880
28,ビーフン五目炒め,(大),1180
29,豚スペアリブ唐揚げ特製ソースかけ,(小),880
30,豚スペアリブ唐揚げ特製ソースかけ,(大),1180
31,豚足とろけるほど醤油煮込み,,398
32,軟らかい豚バラ煮込み,,598
33,北京ダック,,625
次に Python で必要なモジュールをインポートします.
モジュールのインポート
import numpy as np
import pandas as pd
from ortoolpy import knapsack
Pandas で CSV ファイルをデータフレームとして読み込み,中身を確認します.
CSV ファイルを読み込む
url = "https://github.com/rinsaka/sample-data-sets/blob/master/gochi-menu.csv?raw=true"
# url = "gochi-menu.csv" # カレントディレクトリから読み込む場合
df = pd.read_csv(url)
df
読み込んだデータフレームから priceの 列だけを取り出し,NumPy 配列に変換します.
1次元リストに変換する
weight = df.loc[:, 'price' ].values
print(weight)
[ 928 598 880 1180 598 1280 1860 2580 788 2588 898 898 598 698 698 980 1280 880 1000 498 698 498 398 598 680 980 550 880 1180 880 1180 398 598 625]
設定金額を指定し,問題を解く.
設定金額を指定し,問題を解く
# 設定金額
capacity = 2980
# 問題を解く
total, order_ids = knapsack(weight, weight, capacity)
print(total)
print(order_ids)
2980.0 [8, 11, 21, 22, 31]
結果の表示を若干工夫してみよう.
注文するかどうかの 0-1 配列を生成
n, _ = df.shape # データ数
order = np.zeros(n, dtype=int) # 注文を整数の 0 で初期化
order[order_ids] = 1 # 注文するメニューだけを 1 に変更
print(order)
[0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0]
注文の NumPy 配列を Pandas のデータフレームに追加して表示します.
注文を追加したデータフレームを表示
df['order'] = order
df
さらに,注文する料理だけを表示します.
df[df["order"] == 1]