前提・実現したいこと
選手データを取得しそれによって結果を表示するプログラムの作成をしています。
手順
1.選手データをスクレイピングする
2.データフレームの内にデータを数値化
3.打順通りリストに選手を格納
4.pro_name関数に打順を入れて結果を表示
手順4を実行しようとするとエラーが起こります。
TypeError: 'numpy.float64' object is not callableのエラー文を調べたが分からず。
pro_name関数の中の変数hがhit関数に渡せてい無い様な感じがします。
変数hを上手くhit関数に渡したい。
発生している問題・エラーメッセージ
荻野 貴司ヒット 角中 勝也アウト! 只今1アウト ---------------- ランナーなし --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-14-7e748234c16e> in <module> 2 member = [player[i%9] for i in range(0,100)] 3 for i in range(9): ----> 4 pro_name(member) <ipython-input-12-b347acd473e6> in pro_name(pros) 49 print(f'ただいまランナー{state}塁') 50 ---> 51 state, point = hit(state, h) # 塁上の状況の更新。 52 print(f'{point}点入りました') 53 total_point.append(point) TypeError: 'numpy.float64' object is not callable
該当のソースコード
python
1%matplotlib inline 2import random 3import matplotlib.pyplot as plt 4import numpy as np 5import pandas as pd 6import sys 7#野手データ取得 8BASE_URL = ("http://npb.jp/bis/2019/stats/idb1_m.html") 9dfs = pd.io.html.read_html(BASE_URL) 10#カラムの再設定 11df = dfs[0][1:]; df.columns=dfs[0].loc[0,:] 12new_header = df.iloc[0] 13df = df[1:] 14df.columns = new_header 15df
python
1#columnsの表示整え 2df2 = df.rename(columns=lambda s: str(s).replace(" ","")) 3df_i = df2.rename(columns=lambda s: str(s).replace(" ","")) 4del df_i['nan'] 5df3 = df_i.set_index('選手') 6df3
python
1#データの数値化 2df3['長打率'] = '0' + (df3['長打率']) 3df3['出塁率'] = '0' + (df3['出塁率']) 4df3[['試合','打席','打数','得点','安打','二塁打','三塁打','本塁打','塁打', 5 '打点','盗塁','盗塁刺','犠打','犠飛', '四球','故意四','死球','三振', 6 '併殺打','長打率','出塁率']] = df3[['試合','打席','打数','得点','安打','二塁打','三塁打','本塁打','塁打', 7 '打点','盗塁','盗塁刺','犠打','犠飛', '四球','故意四','死球','三振', 8 '併殺打','長打率','出塁率']].apply(pd.to_numeric)
python
1#主要要素の追加 2df3['OPS'] = df3['長打率'] + df3['出塁率'] 3df3['打率(割合)'] = df3['安打'] / df3['打数'] 4#打率評価が出来ない選手に対して1割を割当 5df3.mask(df3.isna(), other= 0.1 )
python
1# bは塁打。ホームランも4塁打として扱えば良い。 2def hit(base_state, b): 3 # どの塁までランナーが到達したか。3塁のあとは4塁,5塁と突き進む。 4 new_state = [b] 5 for e in base_state: 6 new_state.append(e+b) 7 8 # print(new_state) 9 10 # 4塁を超えたランナーをホームインさせる。 11 ret = [] 12 point = 0 13 for e in new_state: 14 if e < 4: 15 ret.append(e) 16 else: 17 point += 1 18 19 # ベース上の状況と、今の打席の点数を返す。 20 return ret, point
python
1#選手毎のデータ読み込み 2base_defn = 3 3def pro_name(pros): 4 state = [] 5 total_point=[] 6 h = 0 7 out = 0 8 point = 0 9 while True: 10 for pro in pros: 11 one_date = df3.loc[[pro],['安打','二塁打','三塁打','本塁打','打率(割合)']] 12 for index, row in one_date.iterrows(): 13 #選手名 14 name = index 15 #安打数 16 a_bat = row[0] + row[1] + row[2] + row[3] 17 #安打数からの単打の割合 18 hit = row[0] / a_bat 19 #安打数からの二塁打の割合 20 two = row[1] / a_bat + hit 21 #安打数からの三塁打の割合 22 thr = row[2] / a_bat + two 23 #打率 24 atta = row[4] 25 coin1 = random.random() 26 coin2 = random.random() 27 #3の数字は後に相手投手の防御率が入る。 28 if coin1 < (atta + 3 - base_defn): 29 if coin2 < hit: 30 print(name+'ヒット') 31 h = 1 32 elif coin2 < two: 33 print(name+'ツーベースヒット') 34 h = 2 35 elif coin2 < thr: 36 print(name+'スリーベースヒット') 37 h = 3 38 else: 39 print(name+'ホームラン!!!!!!!!!!!!!!!') 40 h = 4 41 else: 42 print(name+'アウト!') 43 out += 1 44 print(f'只今{out}アウト') 45 print('-'*16) 46 if not state: 47 print('ランナーなし') 48 else: 49 print(f'ただいまランナー{state}塁') 50 51 state, point = hit(state, h) # 塁上の状況の更新。 52 print(f'{point}点入りました') 53 total_point.append(point) 54 print(f'只今{sum(total_point)}点') 55 if out == 3: 56 return print('チェンジ!!') 57 sys.exit()
python
1player=['荻野 貴司','角中 勝也','清田 育宏','井上 晴哉','加藤 翔平','藤岡 裕大','藤原 恭大','細谷 圭','三木 亮'] 2member = [player[i%9] for i in range(0,100)] 3for i in range(9): 4 pro_name(member)
補足情報(FW/ツールのバージョンなど)
python3.7
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/21 04:58