打者9人が全員イチローだったら?
October 13, 2010 at 01:03 AM | View Commentsさて、今回もメジャーリーグを数字で見るシリーズ。
これまで、
- 安打数 + 四球
- 出塁率
- レッドソックス式の第二の打率
を算出して、イチローや日本人選手を見てきました。
これまでのわかったことは、
- 1番バッターは出塁率が重要というが、スラッガーの方が出塁率は高い
- 安打数ナンバーワンのイチローだが、他の一番バッターと比較すると出塁率は上位だが一番ではない。
ということでした。
今回はRC27と、最近特に重要といわれるOPSで評価してみたいと思う。
RC27は1番から9番まで同じ打者だった場合の1試合の得点数
WikiPediaによると
RC:
(出塁能力A × 進塁能力B)/ 出塁機会Cを基に構成されている。 チームの全打者のRCを合計すると、シーズン中のチームの総得点とほぼ一致するように式が作られている。
RC27:
RC27(Runs Created per 27 outs)はRCを元にある特定の選手1人で構成された打線で試合を行った場合、 27アウト(9イニング×3アウト=1試合)で平均何点とれるかを算出した指標。 この数値が大きいほど、その選手の総合的な得点能力が優れているとされる。
ということらしい。
リンク先の方程式をみるとわかると思いますが、この式は確立などではなく、一般公開されている安打数や塁打、盗塁、四球などのデータを元に、実際の得点となるべく一致するようにそれら変数と定数を掛け合わせたものになっている。
また別の機会で書こうと思うが、ちゃんとした統計学と、こじつけのような計算がごちゃまぜになって評価や予想を行っているところが、個人的にセイバーメトリックスが面白いと感じるポイントだ。
では、ESPNで1番とされている打者(50試合以上出場、安打数80本)の選手たちのRC27ベストは以下の通りになる。
イチローは出塁率と同じく4位。1番から9番まで全部イチローだったら、一試合あたり5.9点得点できると予想される。と、いうことだ。
NO Name Team G H BB SB H+BB AVG OBP SLG AVG2 OPS RC27 1 R Furcal LAD 97 115 40 22 155 0.300 0.366 0.460 0.321 0.826 6.6 2 K Johnson ARI 154 166 79 13 245 0.284 0.370 0.496 0.369 0.865 6.5 3 R Weeks MIL 160 175 76 11 251 0.269 0.366 0.464 0.329 0.830 6.4 4 I Suzuki SEA 162 214 45 42 259 0.315 0.359 0.394 0.207 0.754 5.9 5 C Crisp OAK 75 81 30 32 111 0.279 0.342 0.438 0.372 0.779 5.9 6 A Torres SF 139 136 56 26 192 0.268 0.343 0.479 0.373 0.823 5.9 7 M Prado ATL 140 184 40 5 224 0.307 0.350 0.459 0.227 0.809 5.8 8 A Jackson DET 151 181 47 27 228 0.293 0.345 0.400 0.227 0.745 5.4 9 S Victorino PHI 147 152 53 34 205 0.259 0.327 0.429 0.319 0.756 5.4 10 S Podsednik KC 95 121 29 30 150 0.310 0.353 0.400 0.241 0.753 5.4 11 D Fowler COL 132 114 57 13 171 0.260 0.347 0.410 0.310 0.757 5.2 12 J Reyes NYM 133 159 31 30 190 0.282 0.321 0.428 0.254 0.749 5.1 13 F Lewis TOR 110 112 38 17 150 0.262 0.332 0.414 0.280 0.745 4.9 14 B Phillips CIN 155 172 46 16 218 0.275 0.332 0.430 0.254 0.762 4.9 15 C Coghlan FLA 91 96 33 10 129 0.268 0.335 0.383 0.235 0.718 4.9 16 M Bourn HOU 141 142 59 52 201 0.265 0.341 0.346 0.288 0.686 4.8 17 C Patterson BAL 90 83 20 21 103 0.269 0.315 0.406 0.269 0.721 4.8 18 R Davis OAK 143 149 26 50 175 0.284 0.320 0.377 0.238 0.697 4.7 19 M Scutaro BOS 150 174 53 5 227 0.275 0.333 0.388 0.204 0.721 4.6 20 J Pierre CWS 160 179 45 68 224 0.275 0.341 0.316 0.215 0.657 4.4 21 D Jeter NYY 157 179 63 18 242 0.270 0.340 0.370 0.222 0.710 4.4 22 D Span MIN 153 166 60 26 226 0.264 0.331 0.348 0.221 0.679 4.3 23 S Schumaker STL 137 126 43 5 169 0.265 0.328 0.338 0.174 0.667 4.1 24 J Bartlett TB 135 119 45 11 164 0.254 0.324 0.350 0.216 0.675 4.1 25 E Andrus TEX 148 156 64 32 220 0.265 0.342 0.301 0.199 0.643 4.0 26 N Morgan WSH 136 129 40 34 169 0.253 0.319 0.314 0.206 0.633 3.8 27 J Hairston SD 119 105 31 9 136 0.244 0.299 0.353 0.202 0.652 3.7 28 E Aybar LAA 138 135 35 22 170 0.253 0.306 0.330 0.184 0.636 3.6 29 R Theriot LAD 150 158 41 20 199 0.270 0.321 0.312 0.147 0.633 3.5 30 T Crowe CLE 122 111 29 20 140 0.251 0.302 0.333 0.192 0.634 3.3 G試合数 H安打数 BB四球 SB盗塁 AVG打率 OBP出塁率 SLG長打率 AVG第二の打率 OPS出塁率+長打率 RC27
チーム方針として盗塁禁止のアスレチックPradoが出塁率より順位が落ちた程度かな?
正直、1番で比較しても面白くないので最後に全体のベスト100をのせておきます。
この方程式は 「走力 = 盗塁力」なので、実際の走力は反映されていないのではないかと思う。
走力がものを言うのは、塁に出ているときにヒットが生まれてたときの得点の期待値だからだ。
OPSは出塁率と長打率の足し算
OPSの算出方法をみて唖然とした。なんと率と率の単純な足し算なのだ。
しかも、そんないかにも適当そうな数値が得点との相関関係が高く、非常に重視されているというのだ。
<追記>
よく考えたら 打率も長打率も同じ分母 AB(打数)なので足し算はOKでした。
AVG + OBP = (H/AB) + ((H + 1*2B + 2*3B + 3*HR) / AB) = (2*H + 1*2B + 2*3B + 3*HR) / AB
<追記おわり>
OPS:
OPS(オーピーエス)はOn-base plus sluggingの略であり、野球において打者を評価する指標の一つ。 セイバーメトリクスの祖、ビル・ジェームズがディック・クレイマー、ピート・パーマーと共同開発した指標。 on-baseとは出塁、sluggingとは強打(長打)の意味で、出塁率と長打率とを足し合わせた値である。 得点との相関関係の強さと簡単な算出方法により、現代の米国野球において、非常に重視されている打撃指標である。
「イチローは内野安打が多い」という批判も多いのだけど、長打は得点につながるという認識がアメリカでは多いことからきているのではないだろうか?実際にこの評価でイチローを評価すると厳しい。
RC27ベスト100
ではRC27のベスト100(出場数50以上、安打80本以上)。
81試合しかでていない MorneauがRC27もOPSも驚異的な数字を叩き出している。レッドソックスのYoukilisは四球と長打率に優れていることから4位にランキング。
現役最高の打者といわれるPujolsが5位。
ちなみにイチローは64位。松井57位、福留は67位だった。
NO Name Team G H BB SB H+BB AVG OBP SLG AVG2 OPS RC27 01 J Morneau MIN 81 102 50 0 152 0.345 0.437 0.618 0.443 1.055 10.0 02 J Hamilton TEX 133 186 43 8 229 0.359 0.411 0.633 0.373 1.044 9.6 03 J Votto CIN 150 177 91 16 268 0.324 0.424 0.600 0.472 1.024 9.4 04 K Youkilis BOS 102 111 58 4 169 0.307 0.411 0.564 0.428 0.975 8.8 05 A Pujols STL 159 183 103 14 286 0.312 0.414 0.596 0.484 1.011 8.6 06 C Gonzalez COL 145 197 40 26 237 0.336 0.376 0.598 0.375 0.974 8.4 07 P Konerko CWS 149 171 72 0 243 0.312 0.393 0.584 0.403 0.977 8.4 08 J Bautista TOR 161 148 100 9 248 0.260 0.378 0.617 0.548 0.995 8.2 09 N Cruz TEX 108 127 38 17 165 0.318 0.374 0.576 0.396 0.950 7.6 10 J Werth PHI 156 164 82 13 246 0.296 0.388 0.532 0.408 0.921 7.6 11 M Holliday STL 158 186 69 9 255 0.312 0.390 0.532 0.351 0.922 7.6 12 T Tulowitzki COL 122 148 48 11 196 0.315 0.381 0.568 0.379 0.949 7.5 13 S Choo CLE 144 165 83 22 248 0.300 0.401 0.484 0.375 0.885 7.4 14 G Soto CHC 105 90 62 0 152 0.280 0.393 0.497 0.410 0.890 7.2 15 W Betemit KC 84 82 36 0 118 0.297 0.378 0.511 0.344 0.889 7.2 16 R Cano NYY 160 200 57 3 257 0.319 0.381 0.534 0.310 0.914 7.2 17 C Crawford TB 154 184 46 47 230 0.307 0.356 0.495 0.343 0.851 7.1 18 R Zimmerman WSH 142 161 69 4 230 0.307 0.388 0.510 0.343 0.899 7.1 19 L Scott BAL 131 127 59 2 186 0.284 0.368 0.535 0.387 0.902 7.0 20 P Fielder MIL 161 151 114 1 265 0.261 0.401 0.471 0.408 0.871 7.0 21 A Huff SF 157 165 83 7 248 0.290 0.385 0.506 0.374 0.891 7.0 22 D Uggla FLA 159 169 78 4 247 0.287 0.369 0.508 0.360 0.877 6.9 23 C Utley PHI 115 117 63 13 180 0.275 0.387 0.445 0.348 0.832 6.9 24 D Ortiz BOS 145 140 82 0 222 0.270 0.370 0.529 0.417 0.899 6.8 25 C Ruiz PHI 121 112 55 0 167 0.302 0.400 0.447 0.294 0.847 6.8 26 A Beltre BOS 154 189 40 2 229 0.321 0.365 0.553 0.304 0.919 6.8 27 E Longoria TB 151 169 72 15 241 0.294 0.372 0.507 0.364 0.879 6.7 28 J Mauer MIN 137 167 65 1 232 0.327 0.402 0.469 0.271 0.871 6.7 29 J Willingham WSH 114 99 67 8 166 0.268 0.389 0.459 0.395 0.848 6.7 30 A Dunn WSH 158 145 77 0 222 0.260 0.356 0.536 0.414 0.892 6.7 31 H Ramirez FLA 142 163 64 32 227 0.300 0.378 0.475 0.352 0.853 6.7 32 D Pedroia BOS 75 87 37 9 124 0.288 0.367 0.493 0.358 0.860 6.6 33 R Furcal LAD 97 115 40 22 155 0.300 0.366 0.460 0.321 0.826 6.6 34 J Heyward ATL 142 144 91 11 235 0.277 0.393 0.456 0.375 0.849 6.6 35 R Braun MIL 157 188 56 14 244 0.304 0.365 0.501 0.310 0.866 6.6 36 K Johnson ARI 154 166 79 13 245 0.284 0.370 0.496 0.369 0.865 6.5 37 J Cust OAK 112 95 68 2 163 0.272 0.395 0.438 0.367 0.834 6.5 38 T Hafner CLE 118 110 51 2 161 0.278 0.374 0.449 0.306 0.824 6.5 39 C Rasmus STL 144 128 63 12 191 0.276 0.361 0.498 0.384 0.859 6.5 40 A Ethier LAD 139 151 59 2 210 0.292 0.364 0.493 0.319 0.857 6.5 41 R Weeks MIL 160 175 76 11 251 0.269 0.366 0.464 0.329 0.830 6.4 42 N Swisher NYY 150 163 58 1 221 0.288 0.359 0.511 0.327 0.870 6.4 43 A McCutchen PIT 154 163 70 33 233 0.286 0.365 0.449 0.344 0.814 6.4 44 B Posey SF 108 124 30 0 154 0.305 0.357 0.505 0.273 0.862 6.3 45 D Wright NYM 157 166 69 19 235 0.283 0.354 0.503 0.370 0.856 6.3 46 S Rolen CIN 133 134 50 1 184 0.285 0.358 0.497 0.321 0.854 6.2 47 A Rodriguez NYY 137 141 59 4 200 0.270 0.341 0.506 0.356 0.847 6.2 48 R Howard PHI 143 152 59 1 211 0.276 0.353 0.505 0.338 0.859 6.2 49 M Teixeira NYY 158 154 93 0 247 0.256 0.365 0.481 0.379 0.846 6.2 50 D Murphy TEX 138 122 45 14 167 0.291 0.358 0.449 0.298 0.806 6.1 51 B Gardner NYY 150 132 79 47 211 0.277 0.383 0.379 0.367 0.762 6.1 52 D Barton OAK 159 152 110 7 262 0.273 0.393 0.405 0.342 0.798 6.1 53 D DeJesus KC 91 112 34 3 146 0.318 0.384 0.443 0.230 0.827 6.1 54 M Ordonez DET 84 98 40 1 138 0.303 0.378 0.474 0.297 0.852 6.1 55 B McCann ATL 143 129 74 5 203 0.269 0.375 0.453 0.349 0.828 6.1 56 C Hart MIL 145 158 45 7 203 0.283 0.340 0.525 0.335 0.865 6.1 57 B Butler KC 158 189 69 0 258 0.318 0.388 0.469 0.267 0.857 6.1 58 J Bruce CIN 148 143 58 5 201 0.281 0.353 0.493 0.336 0.846 6.1 59 H Matsui LAA 145 132 67 0 199 0.274 0.361 0.459 0.324 0.820 6.0 60 N Walker PIT 110 126 34 2 160 0.296 0.349 0.462 0.251 0.811 6.0 61 V Martinez BOS 127 149 40 1 189 0.302 0.351 0.493 0.274 0.844 5.9 62 C Jones ATL 95 84 61 5 145 0.265 0.381 0.426 0.369 0.806 5.9 63 S Drew ARI 151 157 62 10 219 0.278 0.352 0.458 0.308 0.810 5.9 64 I Suzuki SEA 162 214 45 42 259 0.315 0.359 0.394 0.207 0.754 5.9 65 C Crisp OAK 75 81 30 32 111 0.279 0.342 0.438 0.372 0.779 5.9 66 A Torres SF 139 136 56 26 192 0.268 0.343 0.479 0.373 0.823 5.9 67 K Fukudome CHC 130 94 64 7 158 0.263 0.371 0.439 0.374 0.809 5.9 68 I Kinsler TEX 103 112 56 15 168 0.286 0.382 0.412 0.307 0.794 5.9 69 J Posada NYY 120 95 59 3 154 0.248 0.357 0.454 0.368 0.811 5.9 70 N Markakis BAL 160 187 73 7 260 0.297 0.370 0.436 0.266 0.805 5.8 71 V Guerrero TEX 152 178 35 4 213 0.300 0.345 0.496 0.261 0.841 5.8 72 M Prado ATL 140 184 40 5 224 0.307 0.350 0.459 0.227 0.809 5.8 73 C Johnson HOU 94 105 15 3 120 0.308 0.337 0.481 0.226 0.818 5.8 74 V Wells TOR 157 161 50 6 211 0.273 0.331 0.515 0.337 0.847 5.7 75 M Stanton FLA 100 93 34 5 127 0.259 0.326 0.507 0.357 0.833 5.7 76 C Young ARI 156 150 74 28 224 0.257 0.341 0.452 0.370 0.793 5.6 77 R Raburn DET 113 104 27 2 131 0.280 0.340 0.474 0.272 0.814 5.6 78 R Hernandez CIN 97 93 29 0 122 0.297 0.364 0.428 0.224 0.792 5.6 79 C Granderson NYY 136 115 53 12 168 0.247 0.324 0.468 0.361 0.792 5.6 80 R Spilborghs COL 134 95 39 4 134 0.279 0.360 0.437 0.284 0.797 5.6 81 J Damon DET 145 146 69 11 215 0.271 0.355 0.401 0.278 0.756 5.5 82 T Colvin CHC 135 91 30 6 121 0.254 0.316 0.500 0.346 0.816 5.5 83 B Abreu LAA 154 146 87 24 233 0.255 0.352 0.435 0.373 0.787 5.5 84 A Pagan NYM 151 168 44 37 212 0.290 0.340 0.425 0.275 0.765 5.5 85 D Stubbs CIN 150 131 55 30 186 0.255 0.329 0.444 0.354 0.773 5.4 86 A Soriano CHC 147 128 45 5 173 0.258 0.322 0.496 0.339 0.818 5.4 87 J Buck TOR 118 115 16 0 131 0.281 0.314 0.489 0.247 0.802 5.4 88 R Branyan SEA 109 89 46 1 135 0.237 0.323 0.487 0.375 0.810 5.4 89 D Valencia MIN 85 93 20 2 113 0.311 0.351 0.448 0.211 0.799 5.4 90 I Davis NYM 147 138 72 3 210 0.264 0.351 0.440 0.319 0.791 5.4 91 R Ibanez PHI 155 154 68 4 222 0.275 0.349 0.444 0.298 0.793 5.4 92 M Byrd CHC 152 170 31 5 201 0.293 0.346 0.429 0.198 0.775 5.4 93 A Jackson DET 151 181 47 27 228 0.293 0.345 0.400 0.227 0.745 5.4 94 S Victorino PHI 147 152 53 34 205 0.259 0.327 0.429 0.319 0.756 5.4 95 S Podsednik KC 95 121 29 30 150 0.310 0.353 0.400 0.241 0.753 5.4 96 C Quentin CWS 131 110 50 2 160 0.243 0.342 0.479 0.351 0.821 5.4 97 G Sanchez FLA 151 156 57 5 213 0.273 0.341 0.448 0.283 0.788 5.4 98 C McGehee MIL 157 174 50 1 224 0.285 0.337 0.464 0.262 0.801 5.4 99 T Hunter LAA 152 161 61 9 222 0.281 0.354 0.464 0.305 0.819 5.4 100 J Jaso TB 109 89 59 4 148 0.263 0.372 0.378 0.301 0.750 5.4 G試合数 H安打数 BB四球 SB盗塁 AVG打率 OBP出塁率 SLG長打率 AVG第二の打率 OPS出塁率+長打率 RC27
算出方法
算出方法はメジャーリーグ公式HPから取得してpythonで計算している。
スクレイピングが面倒そうだったので、16ページ分を手でコピーしてテキストに落としてからデータ化している。
来年もやるのでスクレイピング部分を書いてから、どこかにUPしようかと思う。
#! /usr/bin/env python
#! vim: fileencoding=utf8
import csv
import decimal
class Player(object):
def set_name(self, name):
self.name = name
self.key = name
self.lis = []
def set_stat(self, lis):
self.TEAM = lis[0] #チーム
self.POS = lis[1] #ポジション
self.G = int(lis[2]) #試合数
self.AB = int(lis[3]) #打数
self.R = int(lis[4]) #得点
self.H = int(lis[5]) #ヒット数
self.B2B = int(lis[6]) #2ベースヒット
self.B3B = int(lis[7]) #3ベースヒット
self.HR = int(lis[8]) #ホームラン
self.RBI = int(lis[9]) #打点
self.TB = int(lis[10]) #塁打数
self.BB = int(lis[11]) #四球
self.SO = int(lis[12]) #三振
self.SB = int(lis[13]) #盗塁
self.CS = int(lis[14]) #盗塁失敗
self.OBP = float(lis[15])#出塁率
self.SLG = float(lis[16])#長打率
self.AVG = float(lis[17])#打率
self.lis += lis
self.lis.append(self.HBB)
self.lis.append(".%03d" % (self.AVG2*100))
def set_stat2(self, lis):
lis = lis[2:]
self.SF = int(lis[0]) #犠飛
self.SH = int(lis[1]) #犠打
self.HBP = int(lis[2]) #死球
self.IBB = int(lis[3]) #故意四球
self.GDP = int(lis[4]) #併殺打
self.TPA = int(lis[5]) #打席
self.NP = int(lis[6]) #打者に投げられた投球数
self.XBH = int(lis[7]) #単打以外の安打
self.SBper = float(lis[8]) #盗塁成功率 盗塁÷(盗塁+盗塁死)
self.GO = int(lis[9]) #ゴロアウト
self.AO = int(lis[10]) #フライアウト
self.GO_AO = float(lis[11]) #フライ1つに対するゴロ
self.OPS = float(lis[12]) #出塁率+長打率
self.lis += lis
self.lis.append(self.SBD)
@property
def HBB(self):
""" 安打 + 四球 """
return self.H + self.BB
@property
def AVG2(self):
""" 第二の打率 """
if self.AB > 0:
result = decimal.Decimal(str(((self.TB - self.H + self.BB + self.SB)*1.0) / self.AB))
return float(result.quantize(decimal.Decimal('.000'), rounding=decimal.ROUND_HALF_UP))
return 0
@property
def SBD(self):
""" 盗塁死 """
if self.SBper > 0:
result = decimal.Decimal(str(((self.SB * 1.0) / (self.SBper / 100)) - self.SB))
return float(result.quantize(decimal.Decimal('.000'), rounding=decimal.ROUND_UP))
return 0
@property
def RC(self):
"""
A = 安打 + 四球 + 死球 - 盗塁死 - 併殺打
B = 塁打 + 0.26 ×(四球 + 死球) + 0.53 ×(犠飛 + 犠打) + 0.64 × 盗塁 - 0.03 × 三振
C = 打数 + 四球 + 死球 + 犠飛 + 犠打
"""
a = self.H + self.BB + self.HBP - self.SBD - self.GDP
b = self.TB + 0.26 * (self.BB + self.HBP) + 0.53 * (self.SF + self.SH) + 0.64 * self.SB - 0.03 * self.SO
c = self.AB + self.BB + self.HBP + self.SF + self.SH
return (((a + 2.4*c) * (b + 3*c)) / (9 * c)) - (0.9 * c)
@property
def RC27(self):
"""
TO = 打数 - 安打 + 犠打 + 犠飛 + 盗塁死 + 併殺打
(27 * RC) / TO
"""
to = self.AB - self.H + self.SF + self.SH + self.GDP
return (27 * self.RC) / to
def __str__(self):
return " ".join([str(i) for i in [self.name] + self.lis])
class PlayerShelf(object):
def __init__(self):
#self.lis = []
self.dic = {}
def append(self, player):
self.dic[player.key] = player
#self.lis.append(player)
def get_player(self, key):
if key in self.dic:
return self.dic[key]
return None
@property
def lis(self):
return self.dic.values()
@property
def HBBbest(self):
return sorted(self.lis, cmp=lambda x, y:cmp(y.HBB, x.HBB))
def sortby(self, item, func=None):
if func:
l = self.lis
if type(func) != list:
func = [func]
for f in func:
l = [i for i in l if f(i) is True]
else:
l = self.lis
return sorted(l, cmp=lambda x, y:cmp(getattr(y, item), getattr(x, item)))
def create():
rf = open(r"c:\tmp\major.txt", "rb")
result = PlayerShelf()
for c, lis in enumerate(csv.reader(rf, delimiter="\t")):
if c % 3 == 1:
p = Player()
p.set_name(lis[-1])
if c % 3 == 2:
p.set_stat(lis)
result.append(p)
rf.close()
rf = open(r"c:\tmp\major2.txt", "rb")
for c, lis in enumerate(csv.reader(rf, delimiter="\t")):
if c % 3 == 1:
p = result.get_player(lis[-1])
if p is None:
print lis
continue
if c % 3 == 2:
p.set_stat2(lis)
result.append(p)
return result
def HBBbest(hoge, fs):
a = hoge
c = 0
for i in a.sortby('HBB'):
c += 1
fs.write("%s %s\n" % (c, " ".join([str(i) for i in [i.name, i.TEAM, i.H, i.BB, i.HBB, i.AVG]])))
if c > 100:
break
def BBbest(hoge, fs):
a = hoge
c = 0
for i in a.sortby('BB'):
c += 1
fs.write("%s %s\n" % (c, " ".join([str(i) for i in [i.name, i.TEAM, i.H, i.BB, i.SB, i.HBB, i.AVG]])))
if c > 100:
break
def OBPbest(hoge, fs):
a = hoge
c = 0
for i in a.sortby('OBP', [lambda x:x.H>=80, lambda x:x.name in First_list]):
c += 1
fs.write("%02d %s\n" % (c, " ".join([str(i) for i in [i.name, i.TEAM, i.G, i.H, i.BB, i.SB, i.HBB, i.AVG, i.OBP, i.AVG2]])))
if c > 100:
break
def AVG2best(hoge, fs):
a = hoge
c = 0
for i in a.sortby('AVG2', lambda x:x.H>=80):
c += 1
fs.write("%s %s\n" % (c, " ".join([str(i) for i in [i.name, i.TEAM, i.G, i.H, i.BB, i.SB, i.HBB, i.AVG, i.OBP, i.AVG2]])))
if c > 100:
break
def RC27best(hoge, fs):
a = hoge
c = 0
for i in a.sortby('RC27', lambda x:x.H>=80):
c += 1
fs.write(" %02d %s\n" % (c, "\t".join([str(i) for i in [i.name.ljust(14), i.TEAM, i.G, i.H, i.BB, i.SB, i.HBB, "%1.3f" % i.AVG, "%1.3f" % i.OBP, "%1.3f" % i.SLG, "%1.3f" % i.AVG2, "%1.3f" % i.OPS, "%1.1f" % i.RC27]])))
if c > 100:
break
def RC27best2(hoge, fs):
a = hoge
c = 0
for i in a.sortby('RC27', [lambda x:x.H>=80, lambda x: x.name in First_list]):
c += 1
fs.write("%s %s\n" % (c, "\t".join([str(i) for i in [i.name, i.TEAM, i.G, i.H, i.BB, i.SB, i.HBB, "%1.3f" % i.AVG, "%1.3f" % i.OBP, "%1.3f" % i.SLG, "%1.3f" % i.AVG2, "%1.3f" % i.OPS, "%1.1f" % i.RC27]])))
if c > 100:
break
First_list = [
'M Scutaro', 'B Roberts', 'C Patterson', 'D Jeter', 'J Bartlett',
'F Lewis', 'T Snider', 'M Prado', 'C Coghlan', 'J Reyes',
'S Victorino', 'N Morgan', 'C Patterson', 'J Pierre', 'T Crowe',
'A Jackson', 'S Podsednik', 'D Span', 'R Theriot', 'B Phillips',
'M Bourn', 'R Weeks', 'A McCutchen ', 'S Schumaker', 'E Aybar',
'C Crisp', 'R Davis', 'E Andrus', 'K Johnson', 'D Fowler',
'R Furcal', 'J Hairston', 'A Torres',
'I Suzuki']
if __name__ == "__main__":
a = create()
hbb = open(r"c:\tmp\hbb.csv", "w")
obp = open(r"c:\tmp\obp2.csv", "w")
avg2 = open(r"c:\tmp\avg2.csv", "w")
bb = open(r"c:\tmp\bb.csv", "w")
rc27 = open(r"c:\tmp\rc27.csv", "w")
rc272 = open(r"c:\tmp\rc27_2.csv", "w")
HBBbest(a, hbb)
BBbest(a, bb)
OBPbest(a, obp)
AVG2best(a, avg2)
RC27best(a, rc27)
RC27best2(a, rc272)
hbb.close()
bb.close()
obp.close()
avg2.close()
rc27.close()
rc272.close()