前提
Pythonのnumpyで作成するランダムデータに関する質問です。
ランダムデータを作成したいのですが、いくつか条件があります。
●Type”FF”
・Score1が150.0~160.0の範囲
・Score2が20.0~50.0の範囲
・Score3が20.0~40.0の範囲
●Type"SL"
・Score1が140.0~150.0の範囲
・Score2が-50.0~30.0の範囲
・Score3が-40.0~40.0の範囲
のように、ランダムで作成する中でもdf["Type"]の値によって、とる範囲を変化させたいです。
以下のコードのように、ランダムデータ全体の範囲指定はできたのですが、Typeでさらに範囲を区別する方法が分かりません。
詳しい方、ご教授の程よろしくお願いいたします。
該当のソースコード
Python
1## ランダムデータの作成 2import pandas as pd 3import numpy as np 4 5pd.options.display.float_format="{:.2f}".format 6 7N = 1000 8type = ["FF","SL"] 9type = np.random.choice(type,size=N) 10df = pd.DataFrame({ 11 "Type":type, 12 "Score1":np.random.sample(N) * 20.0 + 140.0, 13 "Score2":np.random.sample(N) * 100.0 - 50.0, 14 "Score3":np.random.sample(N) * 80.0 - 40.0, 15}) 16 17
追記(条件が3種以上の場合は?)
Python
1## ランダムデータの作成 2import pandas as pd 3import numpy as np 4 5pd.options.display.float_format="{:.2f}".format 6type = ["FF","SL","CU"] 7N = 1000 8type = np.random.choice(type,size=N) 9df = pd.DataFrame({ 10 "Pitch Type":type, 11 "Score1":[np.random.rand()*10+150 if t == "FF" elif np.random.rand()*20+130 if t == "SL" else np.random.rand()*10+140 for t in type], 12 "Score2":[np.random.rand()*40+30 if t == "FF" else np.random.rand()*20+30 for t in type], 13 "Score3":[np.random.rand()*20+20 if t == "FF" else np.random.rand()*30-10 for t in type], 14}) 15
追記(発生しているエラー)
File "C:\Users\DELL\AppData\Local\Temp/ipykernel_18992/3232225939.py", line 13 "Score1":[np.random.rand()*10+150 if t == "FF" elif np.random.rand()*20+130 if t == "SL" else np.random.rand()*10+140 for t in type], ^ SyntaxError: invalid syntax
追記2 - 同じTypeであっても値は一定ではなくランダムに設定したい
Python
1import pandas as pd 2import numpy as np 3import matplotlib.pyplot as plt 4import japanize_matplotlib 5 6pd.options.display.float_format="{:.2f}".format 7 8type = ["FF","CU","SP","SL","SI","CB"] 9 10N = 1000 11type = np.random.choice(type,size=N) 12df = pd.DataFrame({"Type":type}) 13# Score1 14df.loc[df.Type=="FF","Score1"] = np.random.rand()*10+150 15df.loc[df.Type=="CU","Score1"] = np.random.rand()*10+140 16df.loc[df.Type=="SP","Score1"] = np.random.rand()*10+130 17df.loc[df.Type=="SL","Score1"] = np.random.rand()*10+120 18df.loc[df.Type=="SI","Score1"] = np.random.rand()*10+145 19df.loc[df.Type=="CB","Score1"] = np.random.rand()*20+100 20# Score2 21df.loc[df.Type=="FF","Score2"] = np.random.rand()*30+35 22df.loc[df.Type=="CU","Score2"] = np.random.rand()*30+10 23df.loc[df.Type=="SP","Score2"] = np.random.rand()*20+0 24df.loc[df.Type=="SL","Score2"] = np.random.rand()*20-10 25df.loc[df.Type=="SI","Score2"] = np.random.rand()*20+20 26df.loc[df.Type=="CB","Score2"] = np.random.rand()*30-40 27# Score3 28df.loc[df.Type=="FF","Score3"] = np.random.rand()*30+15 29df.loc[df.Type=="CU","Score3"] = np.random.rand()*30-10 30df.loc[df.Type=="SP","Score3"] = np.random.rand()*30+10 31df.loc[df.Type=="SL","Score3"] = np.random.rand()*40-30 32df.loc[df.Type=="SI","Score3"] = np.random.rand()*20+30 33df.loc[df.Type=="CB","Score3"] = np.random.rand()*10-25 34 35#画像サイズ、軸サイズ調整 36plt.figure(figsize=(11,11)) 37#各タイプの色を定義づけ 38pitch_colors = {"FF":"b","SI":"c","SL":"r","SP":"g","CB":"pink","CU":"y"} 39ax1 = plt.subplot(1,1,1) 40 41# make ScatterPlot 42ax1.axis([-70,70,-70,70]) 43x = df[["Score3"]] 44y = df[["Score2"]] 45#各タイプを色別でplot 46for k in pitch_colors: 47 df_selected = df[df['Type'] == k] 48 if not df_selected.empty: 49 df_selected.plot.scatter(x='Score3', y='Score2', marker='o', c=pitch_colors[k], s = 50, label=k, ax=ax1) 50#プロットのグリッド線 51ax1.grid(True,linestyle = "dotted") 52# adding vertical line in data co-ordinates 53ax1.axvline(0, c='silver', ls='-') 54# adding horizontal line in data co-ordinates 55ax1.axhline(0, c='silver', ls='-') 56#凡例の表示 57flg=12 58ax1.legend(loc='upper left',fontsize=flg,title='Type') 59 60 61 62
### 追記2 -現状と理想
現状
理想(ランダムで作成したものではないため例です)
補足情報(FW/ツールのバージョンなど)
python3.9、VSCode
> ランダムデータ全体の範囲指定はできたのですが、Typeでさらに範囲を区別する方法
やりたいことがよく分かりません。
欲しい結果のサンプルを提示いただけませんか?
⇒ これかな?と思った回答をしました。
回答1件