質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.35%

TypeError: 'numpy.float64' object is not callableのエラーについて

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,188

HaTea

score 16

前提・実現したいこと

選手データを取得しそれによって結果を表示するプログラムの作成をしています。

手順
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

該当のソースコード

%matplotlib inline
import random
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import sys
#野手データ取得
BASE_URL = ("http://npb.jp/bis/2019/stats/idb1_m.html")
dfs = pd.io.html.read_html(BASE_URL)
#カラムの再設定
df = dfs[0][1:]; df.columns=dfs[0].loc[0,:]
new_header = df.iloc[0]
df = df[1:]
df.columns = new_header
df
#columnsの表示整え
df2 = df.rename(columns=lambda s: str(s).replace(" ",""))
df_i = df2.rename(columns=lambda s: str(s).replace(" ",""))
del df_i['nan']
df3 = df_i.set_index('選手')
df3
#データの数値化
df3['長打率'] = '0' + (df3['長打率'])
df3['出塁率'] = '0' + (df3['出塁率'])
df3[['試合','打席','打数','得点','安打','二塁打','三塁打','本塁打','塁打',
     '打点','盗塁','盗塁刺','犠打','犠飛', '四球','故意四','死球','三振',
     '併殺打','長打率','出塁率']] = df3[['試合','打席','打数','得点','安打','二塁打','三塁打','本塁打','塁打',
     '打点','盗塁','盗塁刺','犠打','犠飛', '四球','故意四','死球','三振',
     '併殺打','長打率','出塁率']].apply(pd.to_numeric)
#主要要素の追加
df3['OPS'] = df3['長打率'] + df3['出塁率']
df3['打率(割合)'] = df3['安打'] / df3['打数']
#打率評価が出来ない選手に対して1割を割当
df3.mask(df3.isna(), other= 0.1 )
# bは塁打。ホームランも4塁打として扱えば良い。
def hit(base_state, b):
    # どの塁までランナーが到達したか。3塁のあとは4塁,5塁と突き進む。
    new_state = [b]
    for e in base_state:
        new_state.append(e+b)

    # print(new_state)

    # 4塁を超えたランナーをホームインさせる。
    ret = []
    point = 0
    for e in new_state:
        if e < 4:
            ret.append(e)
        else:
            point += 1

    # ベース上の状況と、今の打席の点数を返す。
    return ret, point
#選手毎のデータ読み込み
base_defn = 3
def pro_name(pros):
    state = []
    total_point=[]
    h = 0
    out = 0
    point = 0
    while True:
        for pro in pros:
            one_date = df3.loc[[pro],['安打','二塁打','三塁打','本塁打','打率(割合)']]
            for index, row in one_date.iterrows():
                #選手名
                name = index
                #安打数
                a_bat = row[0] + row[1] + row[2] + row[3]
                #安打数からの単打の割合
                hit = row[0] / a_bat
                #安打数からの二塁打の割合
                two = row[1] / a_bat + hit
                #安打数からの三塁打の割合
                thr = row[2] / a_bat + two
                #打率
                atta = row[4]
                coin1 = random.random()
                coin2 = random.random()
                #3の数字は後に相手投手の防御率が入る。
                if coin1 < (atta + 3 - base_defn):
                    if coin2 < hit:
                        print(name+'ヒット')
                        h = 1
                    elif coin2 < two:
                        print(name+'ツーベースヒット')
                        h = 2
                    elif coin2 < thr:
                        print(name+'スリーベースヒット')
                        h = 3
                    else:
                        print(name+'ホームラン!!!!!!!!!!!!!!!')
                        h = 4
                else:
                    print(name+'アウト!')
                    out += 1
                    print(f'只今{out}アウト')
                    print('-'*16)
                    if not state:
                        print('ランナーなし')
                    else:
                        print(f'ただいまランナー{state}塁')

                    state, point = hit(state, h)    # 塁上の状況の更新。
                    print(f'{point}点入りました')
                    total_point.append(point)
                    print(f'只今{sum(total_point)}点')
                    if out == 3:
                        return print('チェンジ!!')
                        sys.exit()
player=['荻野 貴司','角中 勝也','清田 育宏','井上 晴哉','加藤 翔平','藤岡 裕大','藤原 恭大','細谷 圭','三木 亮']
member = [player[i%9] for i in range(0,100)]
for i in range(9):
    pro_name(member)

補足情報(FW/ツールのバージョンなど)

python3.7

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

パッと見て以下のhit変数と

hit = row[0] / a_bat


以下のhit関数の名前が同じなので提示エラーが発生いると思われます。

state, point = hit(state, h)    # 塁上の状況の更新。


どちらかの名前を変えてみましょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/06/21 13:58

    上手くいきました、ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る