前提
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
## ランダムデータの作成 import pandas as pd import numpy as np pd.options.display.float_format="{:.2f}".format N = 1000 type = ["FF","SL"] type = np.random.choice(type,size=N) df = pd.DataFrame({ "Type":type, "Score1":np.random.sample(N) * 20.0 + 140.0, "Score2":np.random.sample(N) * 100.0 - 50.0, "Score3":np.random.sample(N) * 80.0 - 40.0, })
追記(条件が3種以上の場合は?)
Python
## ランダムデータの作成 import pandas as pd import numpy as np pd.options.display.float_format="{:.2f}".format type = ["FF","SL","CU"] N = 1000 type = np.random.choice(type,size=N) df = pd.DataFrame({ "Pitch Type":type, "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], "Score2":[np.random.rand()*40+30 if t == "FF" else np.random.rand()*20+30 for t in type], "Score3":[np.random.rand()*20+20 if t == "FF" else np.random.rand()*30-10 for t in type], })
追記(発生しているエラー)
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
import pandas as pd import numpy as np import matplotlib.pyplot as plt import japanize_matplotlib pd.options.display.float_format="{:.2f}".format type = ["FF","CU","SP","SL","SI","CB"] N = 1000 type = np.random.choice(type,size=N) df = pd.DataFrame({"Type":type}) # Score1 df.loc[df.Type=="FF","Score1"] = np.random.rand()*10+150 df.loc[df.Type=="CU","Score1"] = np.random.rand()*10+140 df.loc[df.Type=="SP","Score1"] = np.random.rand()*10+130 df.loc[df.Type=="SL","Score1"] = np.random.rand()*10+120 df.loc[df.Type=="SI","Score1"] = np.random.rand()*10+145 df.loc[df.Type=="CB","Score1"] = np.random.rand()*20+100 # Score2 df.loc[df.Type=="FF","Score2"] = np.random.rand()*30+35 df.loc[df.Type=="CU","Score2"] = np.random.rand()*30+10 df.loc[df.Type=="SP","Score2"] = np.random.rand()*20+0 df.loc[df.Type=="SL","Score2"] = np.random.rand()*20-10 df.loc[df.Type=="SI","Score2"] = np.random.rand()*20+20 df.loc[df.Type=="CB","Score2"] = np.random.rand()*30-40 # Score3 df.loc[df.Type=="FF","Score3"] = np.random.rand()*30+15 df.loc[df.Type=="CU","Score3"] = np.random.rand()*30-10 df.loc[df.Type=="SP","Score3"] = np.random.rand()*30+10 df.loc[df.Type=="SL","Score3"] = np.random.rand()*40-30 df.loc[df.Type=="SI","Score3"] = np.random.rand()*20+30 df.loc[df.Type=="CB","Score3"] = np.random.rand()*10-25 #画像サイズ、軸サイズ調整 plt.figure(figsize=(11,11)) #各タイプの色を定義づけ pitch_colors = {"FF":"b","SI":"c","SL":"r","SP":"g","CB":"pink","CU":"y"} ax1 = plt.subplot(1,1,1) # make ScatterPlot ax1.axis([-70,70,-70,70]) x = df[["Score3"]] y = df[["Score2"]] #各タイプを色別でplot for k in pitch_colors: df_selected = df[df['Type'] == k] if not df_selected.empty: df_selected.plot.scatter(x='Score3', y='Score2', marker='o', c=pitch_colors[k], s = 50, label=k, ax=ax1) #プロットのグリッド線 ax1.grid(True,linestyle = "dotted") # adding vertical line in data co-ordinates ax1.axvline(0, c='silver', ls='-') # adding horizontal line in data co-ordinates ax1.axhline(0, c='silver', ls='-') #凡例の表示 flg=12 ax1.legend(loc='upper left',fontsize=flg,title='Type')
### 追記2 -現状と理想
現状
理想(ランダムで作成したものではないため例です)
補足情報(FW/ツールのバージョンなど)
python3.9、VSCode
> ランダムデータ全体の範囲指定はできたのですが、Typeでさらに範囲を区別する方法
やりたいことがよく分かりません。
欲しい結果のサンプルを提示いただけませんか?
⇒ これかな?と思った回答をしました。
まだ回答がついていません
会員登録して回答してみよう