【解説】データサイエンス100本ノック【問66〜68 回答】

【解説】データサイエンス100本ノック【問66〜68 回答】





目次

この記事の対象者



・ データサイエンティストを目指している人

・ 小数の扱いについて理解したい人



以降はデータサイエンス100本ノックの問題を題材にしながら学んでいきます。


データサイエンス100本ノックの始め方は、以下の記事を参考にしていただければと思います。


>>データサイエンス100本ノックの始め方を確認する


第66問目: 小数の四捨五入

P-066: 商品データフレーム(df_product)の各商品について、利益率が30%となる新たな単価を求めよ。今回は、1円未満を四捨五入すること(0.5については偶数方向の丸めで良い)。そして結果を10件表示させ、利益率がおよそ30%付近であることを確認せよ。ただし、単価(unit_price)と原価(unit_cost)にはNULLが存在することに注意せよ。

小数の四捨五入をround関数で行う場合、SeriesデータにNaNが存在するとエラーになります。

NaNが存在する場合は、numpy.round関数を使用します。

まずはdf_productのコピーをdf_tmpに格納します。

1
df_tmp = df_product.copy()

次に利益率が30%となる価格をnew_priceカラムに代入します。

1
2
df_tmp['new_price'] = np.round(df_tmp['unit_cost']/0.7)
df_tmp
出力
1
2
3
4
5
6
7
8
9
10
11
12
13
14

product_cd category_major_cd category_medium_cd category_small_cd unit_price unit_cost new_price
0 P040101001 04 0401 040101 198.0 149.0 213.0
1 P040101002 04 0401 040101 218.0 164.0 234.0
2 P040101003 04 0401 040101 230.0 173.0 247.0
3 P040101004 04 0401 040101 248.0 186.0 266.0
4 P040101005 04 0401 040101 268.0 201.0 287.0
... ... ... ... ... ... ... ...
10025 P091503001 09 0915 091503 280.0 210.0 300.0
10026 P091503002 09 0915 091503 680.0 510.0 729.0
10027 P091503003 09 0915 091503 1080.0 810.0 1157.0
10028 P091503004 09 0915 091503 1130.0 848.0 1211.0
10029 P091503005 09 0915 091503 1280.0 960.0 1371.0
10030 rows × 7 columns

new_priceで利益率を算出し、new_profit_rateカラムに代入します。

出力
1
2
df_tmp['new_profit_rate'] = (df_tmp['new_price'] - df_tmp['unit_cost']) / df_tmp['new_price']
df_tmp.head(10)
出力
1
2
3
4
5
6
7
8
9
10
11
	product_cd	category_major_cd	category_medium_cd	category_small_cd	unit_price	unit_cost	new_price	new_profit_rate
0 P040101001 04 0401 040101 198.0 149.0 213.0 0.300469
1 P040101002 04 0401 040101 218.0 164.0 234.0 0.299145
2 P040101003 04 0401 040101 230.0 173.0 247.0 0.299595
3 P040101004 04 0401 040101 248.0 186.0 266.0 0.300752
4 P040101005 04 0401 040101 268.0 201.0 287.0 0.299652
5 P040101006 04 0401 040101 298.0 224.0 320.0 0.300000
6 P040101007 04 0401 040101 338.0 254.0 363.0 0.300275
7 P040101008 04 0401 040101 420.0 315.0 450.0 0.300000
8 P040101009 04 0401 040101 498.0 374.0 534.0 0.299625
9 P040101010 04 0401 040101 580.0 435.0 621.0 0.299517

これで完成です。

第67問目: 小数の切り上げ

P-067: 商品データフレーム(df_product)の各商品について、利益率が30%となる新たな単価を求めよ。今回は、1円未満を切り上げること。そして結果を10件表示させ、利益率がおよそ30%付近であることを確認せよ。ただし、単価(unit_price)と原価(unit_cost)にはNULLが存在することに注意せよ。

小数の切り上げをmath.ceil関数で行う場合、SeriesデータにNaNが存在する場合エラーとなります。

NaNが存在する場合は、numpy.ceil関数を使用します。

まずはdf_productのコピーを作成し、利益率が30%となる価格をnew_priceカラムに代入します。

1
2
3
df_tmp = df_product.copy()
df_tmp['new_price'] = np.ceil(df_tmp['unit_cost'] / 0.7)
df_tmp
出力
1
2
3
4
5
6
7
8
9
10
11
12
13
	product_cd	category_major_cd	category_medium_cd	category_small_cd	unit_price	unit_cost	new_price
0 P040101001 04 0401 040101 198.0 149.0 213.0
1 P040101002 04 0401 040101 218.0 164.0 235.0
2 P040101003 04 0401 040101 230.0 173.0 248.0
3 P040101004 04 0401 040101 248.0 186.0 266.0
4 P040101005 04 0401 040101 268.0 201.0 288.0
... ... ... ... ... ... ... ...
10025 P091503001 09 0915 091503 280.0 210.0 300.0
10026 P091503002 09 0915 091503 680.0 510.0 729.0
10027 P091503003 09 0915 091503 1080.0 810.0 1158.0
10028 P091503004 09 0915 091503 1130.0 848.0 1212.0
10029 P091503005 09 0915 091503 1280.0 960.0 1372.0
10030 rows × 7 columns

new_priceで利益率を算出し、new_profit_rateカラムに代入します。

1
2
3
df_tmp = df_product.copy()
df_tmp['new_price'] = np.ceil(df_tmp['unit_cost'] / 0.7)
df_tmp
出力
1
2
3
4
5
6
7
8
9
10
11
12
13
	product_cd	category_major_cd	category_medium_cd	category_small_cd	unit_price	unit_cost	new_price
0 P040101001 04 0401 040101 198.0 149.0 213.0
1 P040101002 04 0401 040101 218.0 164.0 235.0
2 P040101003 04 0401 040101 230.0 173.0 248.0
3 P040101004 04 0401 040101 248.0 186.0 266.0
4 P040101005 04 0401 040101 268.0 201.0 288.0
... ... ... ... ... ... ... ...
10025 P091503001 09 0915 091503 280.0 210.0 300.0
10026 P091503002 09 0915 091503 680.0 510.0 729.0
10027 P091503003 09 0915 091503 1080.0 810.0 1158.0
10028 P091503004 09 0915 091503 1130.0 848.0 1212.0
10029 P091503005 09 0915 091503 1280.0 960.0 1372.0
10030 rows × 7 columns

new_priceで利益率を算出し、new_profit_rateカラムに代入します。

1
2
df_tmp['new_profit_rate'] = (df_tmp['new_price'] - df_tmp['unit_cost']) / df_tmp['new_price']
df_tmp.head(10)
出力
1
2
3
4
5
6
7
8
9
10
11
product_cd	category_major_cd	category_medium_cd	category_small_cd	unit_price	unit_cost	new_price	new_profit_rate
0 P040101001 04 0401 040101 198.0 149.0 213.0 0.300469
1 P040101002 04 0401 040101 218.0 164.0 235.0 0.302128
2 P040101003 04 0401 040101 230.0 173.0 248.0 0.302419
3 P040101004 04 0401 040101 248.0 186.0 266.0 0.300752
4 P040101005 04 0401 040101 268.0 201.0 288.0 0.302083
5 P040101006 04 0401 040101 298.0 224.0 320.0 0.300000
6 P040101007 04 0401 040101 338.0 254.0 363.0 0.300275
7 P040101008 04 0401 040101 420.0 315.0 451.0 0.301552
8 P040101009 04 0401 040101 498.0 374.0 535.0 0.300935
9 P040101010 04 0401 040101 580.0 435.0 622.0 0.300643

これで完成です。

第68問目: 小数の切り捨て

P-068: 商品データフレーム(df_product)の各商品について、消費税率10%の税込み金額を求めよ。 1円未満の端数は切り捨てとし、結果は10件表示すれば良い。ただし、単価(unit_price)にはNULLが存在することに注意せよ。

少数の切り捨てをmath.froor関数で行う場合、SeriesデータにNaNが存在する場合エラーとなってしまいます。

NaNが存在する場合は、numpy.floor関数を使用します。

まずはdf_productのコピーを作成し、df_tmpに代入します。

1
df_tmp = df_product.copy()

税込価格をprice_taxカラムに代入します。

1
2
df_tmp['price_tax'] = np.floor(df_tmp['unit_price'] * 1.1)
df_tmp.head(10)
出力
1
2
3
4
5
6
7
8
9
10
11
	product_cd	category_major_cd	category_medium_cd	category_small_cd	unit_price	unit_cost	price_tax
0 P040101001 04 0401 040101 198.0 149.0 217.0
1 P040101002 04 0401 040101 218.0 164.0 239.0
2 P040101003 04 0401 040101 230.0 173.0 253.0
3 P040101004 04 0401 040101 248.0 186.0 272.0
4 P040101005 04 0401 040101 268.0 201.0 294.0
5 P040101006 04 0401 040101 298.0 224.0 327.0
6 P040101007 04 0401 040101 338.0 254.0 371.0
7 P040101008 04 0401 040101 420.0 315.0 462.0
8 P040101009 04 0401 040101 498.0 374.0 547.0
9 P040101010 04 0401 040101 580.0 435.0 638.0

こちらで完成です。

まとめ: 小数の扱いを学びました。

本記事は、「【解説】データサイエンス100本ノック【問66〜68 回答】」というテーマでまとめました。

本記事で紹介した方法を元にデータサイエンティストとしての知見を深めていただければと思います。

AI・データサイエンティストのスキルを高めたい場合は、これまでの受講者数30,000人以上!【ikus.ai】にて無料カウンセリングを受けるのが良いと思います。

>> 無料カウンセリング予約はこちら

なお、データサイエンティストに必要な知識は、Udemyを活用した学習が効率的です。30日間の返金保証、および一流講師へのQ&Aシステムが整ったオンライン学習プラットフォームです。

不定期で90%以上の割引セールも行っているので無料会員登録だけでも実施しておくといいと思います。

世界で34万人が受講した以下の講座をご確認ください。

【世界で34万人が受講】データサイエンティストを目指すあなたへ〜データサイエンス25時間ブートキャンプ〜

コメント