Uncategorized

Inside the San Francisco Giants’ Incredible Season

At the beginning of the 2021 MLB season, the San Francisco Giants looked like a baseball team on its way down. The Giants won three World Series between 2010 and 2014 and then saw most of the stars from those teams decline in performance or leave town. Save for a brief appearance in the National League Division Series in 2016, they have not played in the postseason since their last title. They’ve finished with a record below .500 each of the last four years.

 

       {                                      let bidders = ['a9', 'ix', 'iris'];                                         // create a requestManager to keep track of bidder state to determine when to send ad server                                        // request and what amazonSlots to request from the ad server                                       var requestManager = {                                          adserverRequestSent: false,                                         };                                          //loop through bidder array and add the bidders to the request manager:                                         bidders.forEach( function( bidder ) {                                           requestManager[bidder] = false;                                         } );                                        // return true if all bidders have returned                                         function allBiddersBack() {                                             var allBiddersBack = bidders                                                    // get the booleans from the object                                                     .map( function( bidder ) {                                                      return requestManager[bidder];                                                  } )                                                     // get rid of false values - indicates that the bidder has responded                                                    .filter( Boolean )                                                  // if length is equal to bidders, all bidders are back                                                  .length === bidders.length;                                             return allBiddersBack;                                      }                                       // handler for header bidder responses                                      function headerBidderBack( bidder ) {                                           // return early if request to adserver is already sent                                          if ( requestManager.adserverRequestSent === true ) {                                                return;                                             }                                           // flip bidder back flag                                            if ( bidder === 'a9' ) {                                                requestManager.a9 = true;                                               console.log('second promise a9 ready');                                             } else if ( bidder === 'ix' ) {                                                 requestManager.ix = true;                                               console.log('second promise ix ready');                                             } else if ( bidder === 'iris' ) {                                               requestManager.iris = true;                                                 console.log('second promise iris ready');                                           }                                           // if all bidders are back, send the request to the ad server                                           if ( allBiddersBack() ) {                                               resolve( url );                                             }                                       }                                       if ( typeof apstag == 'object' &amp;&amp; apstag ) {                                            apstag.fetchBids({                                              slots: [{                                                   slotID: window.prerollTag[vHash],                                                   mediaType: 'video'                                              }]                                          }, function( bids ) {                                               console.log( "AMI jwp amazon bid callback", new Date().getTime(), bids );                                               window.jwpBids[vHash].amazon = true;                                                if ( bids.length &gt; 0 ) { //If we have received any bids back                                                     try {                                                       console.log("AMI jwp amazon bid request ad", bids[0].encodedQsParams);                                                      url = url + '&amp;scp=' + bids[0].encodedQsParams;                                                  } catch ( e ) {                                                         console.log(e);                                                     }                                               } else {                                                    console.log("AMI jwp amazon no bids");                                              }                                               headerBidderBack('a9');                                             });                                         } else {                                            headerBidderBack('a9');                                         }                                       headertag.cmd.push( function() {                                            headertag.retrieveVideoDemand( [{'htSlotName': 'preroll'}], function( demand ) {                                                console.log( "AMI jwp IX callback", demand );                                               if ( 'undefined' !== typeof demand.preroll &amp;&amp; demand.preroll.length ){                                                  window.jwpBids[vHash].ixBids = demand.preroll[0].targeting.price;                                                   console.log( 'AMI jwp IX Bids', new Date().getTime(), demand.preroll[0].targeting );                                                    var vastURL = new URL( url );                                                   var vastParams = new URLSearchParams( vastURL.search );                                                     if ( vastParams.has( 'cust_params' ) ) {                                                        var custParams = new URLSearchParams( vastParams.get( 'cust_params' ) );                                                    } else {                                                        var custParams = new URLSearchParams();                                                     }                                                   var keys = Object.keys( demand.preroll[0].targeting.price );                                                    for ( var key of keys ) {                                                       custParams.set( key, demand.preroll[0].targeting.price[key][0]);                                                    }                                                   vastParams.set( 'cust_params', custParams.toString() );                                                     vastURL.search = vastParams.toString();                                                     url = vastURL.toString();                                               }                                               headerBidderBack('ix');                                             } );                                        } );                                        // Get main item context data                                       window.irisContext.getContext(jwplayer(el).getPlaylistItem().mediaid).then(function(data) {                                             // Encode the context data                                          console.log( 'AMI jwp IrisTV Bids', new Date().getTime(), data.context );                                           // Replace the server url with the context data (this is for simple ad requests),                                           // If you have the serverUrl dynamically configured, then you will need to append the context data                                          // under cust_params, so this is just for testing purpose                                           if ( data.context &amp;&amp; Object.keys( data.context ).length ) {                                                 var vastURL = new URL( url );                                               var vastParams = new URLSearchParams( vastURL.search );                                                 if ( vastParams.has( 'cust_params' ) ) {                                                    var custParams = new URLSearchParams( vastParams.get( 'cust_params' ) );                                                } else {                                                    var custParams = new URLSearchParams();                                                 }                                               custParams.set( 'iris_context', data.context.join(','));                                                vastParams.set( 'cust_params', decodeURIComponent( custParams.toString() ) );                                               vastURL.search = vastParams.toString();                                                 url = vastURL.toString();                                           }                                           headerBidderBack('iris');                                       });                                         setTimeout(function(){                                          resolve( url );                                         }, 10000);                                  });                                 }                               var player_jwplayer_16jkJYGA_eEkK759I_div = jwplayer(el).setup(videoParams).on("ready", function(){                         var el = decodeURIComponent( "jwplayer_16jkJYGA_eEkK759I_div" );                        var playerInstance = jwplayer(el);                      ns_.StreamingAnalytics.JWPlayer( playerInstance, {                          publisherId: "6036076",                             labelmapping: "ns_st_pu="AMI", c3="Mens Journal", ns_st_ge="" + decodeURIComponent( "%2Anull" ) + "", ns_st_ia="" + decodeURIComponent( "%2Anull" ) + "", ns_st_ce="" + decodeURIComponent( "1" ) + "", ns_st_ddt="" + decodeURIComponent( "%2Anull" ) + "", ns_st_tdt="" + decodeURIComponent( "%2Anull" ) + """,                      });                     }).on('adsManager', (e) =&gt; {                 var vHash = 'ami' + decodeURIComponent( '16jkJYGA' );               const { adsManager, videoElement } = e;                 const iasConfig = {                   anId: '928572',                 campId: `${jwplayer().getWidth()}x${jwplayer().getHeight()}`, // This is dynamic based on player dimensions, but can be hard coded                  chanId: window.prerollTag[vHash],                   placementId: 'Open Auction',                pubOrder: 'Video',                  pubId: 'Direct'               };              if (googleImaVansAdapter) {                   googleImaVansAdapter.init(window.google, adsManager, videoElement, iasConfig);                }           }).once("play", function(){             var el = decodeURIComponent( "jwplayer_16jkJYGA_eEkK759I_div" );            var playerInstance = jwplayer(el);          loadIrisPlugin(playerInstance, playerInstance.getConfig().plugins["https://ovp.iris.tv/plugins/jwplayer/v2/iris-jwplayer8.adaptive.min.js"])            }).on('play', (e) =&gt; {               var el = decodeURIComponent( "jwplayer_16jkJYGA_eEkK759I_div" );                var vHash = "ami" + decodeURIComponent( "16jkJYGA" );               var jwInfo = jwplayer(el).getPlaylistItem(jwplayer(el).getPlaylistIndex());                 // skip if the video was paused and trying to resume                if (jwplayer(el).getState() !== 'idle' &amp;&amp; jwplayer(el).getState() !== 'complete') {                     return;                 }               window.permutive.track("VideoPlay", {                   play_id: el, //this will stay constant for all of the events emitted during the same video play                     video: {                        duration: Math.round(jwInfo.duration), // in seconds                        name: jwInfo.title,                         video_id: decodeURIComponent( "16jkJYGA" ),                         description: jwInfo.description,                        published_at: new Date(jwInfo.pubdate).toISOString()                    },                  enriched_data:{                         tvchannel: decodeURIComponent( "Men%26%23039%3Bs%20Journal" ), //tv channel name                        language:"English", //language of the content                       type: "video",                      keywords: jwInfo.tags.split(","), //keywords for the page                   }               });                 console.log("Permutive video play");            }).on('complete', (e) =&gt; {               var el = decodeURIComponent( "jwplayer_16jkJYGA_eEkK759I_div" );                var vHash = "ami" + decodeURIComponent( "16jkJYGA" );               var jwInfo = jwplayer(el).getPlaylistItem(jwplayer(el).getPlaylistIndex());                 // skip if the video was paused and trying to resume                if (jwplayer(el).getState() !== 'idle' &amp;&amp; jwplayer(el).getState() !== 'complete') {                     return;                 }               window.permutive.track("VideoComplete", {                   play_id: el, //this will stay constant for all of the events emitted during the same video play                     video: {                        duration: Math.round(jwInfo.duration), // in seconds                        name: jwInfo.title,                         video_id: decodeURIComponent( "16jkJYGA" ),                         description: jwInfo.description,                        published_at: new Date(jwInfo.pubdate).toISOString()                    },                  enriched_data:{                         tvchannel: decodeURIComponent( "Men%26%23039%3Bs%20Journal" ), //tv channel name                        language: "English", //language of the content                      type: "video",                      keywords: jwInfo.tags.split(","), //keywords for the page                   }               });                 console.log("Permutive video event:", e);               window.lock_25 = false;                 window.lock_50 = false;                 window.lock_75 = false;                 window.lock_100 = false;            }).on('time', (e) =&gt; {               var el = decodeURIComponent( "jwplayer_16jkJYGA_eEkK759I_div" );                var vHash = "ami" + decodeURIComponent( "16jkJYGA" );               var jwInfo = jwplayer(el).getPlaylistItem(jwplayer(el).getPlaylistIndex());                 var progress = (e.currentTime/e.duration).toFixed(2);               if (                    (0.25 === progress &amp;&amp; false === window.lock_25) ||                  (0.5 === progress &amp;&amp; false === window.lock_50) ||                   (0.75 === progress &amp;&amp; false === window.lock_75) ||                  (100 === progress &amp;&amp; false === window.lock_100)                 ) {                     window.permutive.track("VideoProgress", {                       play_id: el, //this will stay constant for all of the events emitted during the same video play                         progress: Number(progress),                         video: {                            duration: Math.round(jwInfo.duration), // in seconds                            name: jwInfo.title,                             video_id: decodeURIComponent( "16jkJYGA" ),                             description: jwInfo.description,                            published_at: new Date(jwInfo.pubdate).toISOString()                        },                      enriched_data:{                             tvchannel: decodeURIComponent( "Men%26%23039%3Bs%20Journal" ), //tv channel name                            language: "English", //language of the content                          type: "video",                          keywords: jwInfo.tags.split(","), //keywords for the page                       }                   });                     if ( 0.25 === progress ) {                      window.lock_25 = true;                  }                   if ( 0.5 === progress ) {                       window.lock_50 = true;                  }                   if ( 0.75 === progress ) {                      window.lock_75 = true;                  }                   if ( 1 === progress ) {                         window.lock_100 = true;                     }                   console.log("Permutive video play progress " + progress);               }           }).on('mute', (e) =&gt; {               var el = decodeURIComponent( "jwplayer_16jkJYGA_eEkK759I_div" );                var vHash = "ami" + decodeURIComponent( "16jkJYGA" );               var jwInfo = jwplayer(el).getPlaylistItem(jwplayer(el).getPlaylistIndex());                 window.permutive.track("VideoEvent", {                  play_id: el, //this will stay constant for all of the events emitted during the same video play                     event: (e.mute) ? "sound off" : "sound on",                     video: {                        duration: Math.round(jwInfo.duration), // in seconds                        name: jwInfo.title,                         video_id: decodeURIComponent( "16jkJYGA" ),                         description: jwInfo.description,                        published_at: new Date(jwInfo.pubdate).toISOString()                    }               });                 console.log("Permutive video event:", e);               }).on('fullscreen', (e) =&gt; {                 var el = decodeURIComponent( "jwplayer_16jkJYGA_eEkK759I_div" );                var vHash = "ami" + decodeURIComponent( "16jkJYGA" );               var jwInfo = jwplayer(el).getPlaylistItem(jwplayer(el).getPlaylistIndex());                 window.permutive.track("VideoEvent", {                  play_id: el, //this will stay constant for all of the events emitted during the same video play                     event: (e.fullscreen) ? "fullscreen on" : "fullscreen off",                     video: {                        duration: Math.round(jwInfo.duration), // in seconds                        name: jwInfo.title,                         video_id: decodeURIComponent( "16jkJYGA" ),                         description: jwInfo.description,                        published_at: new Date(jwInfo.pubdate).toISOString()                    }               });                 console.log("Permutive video event:", e);           }).on('ready', (e) =&gt; {              var el = decodeURIComponent( "jwplayer_16jkJYGA_eEkK759I_div" );                var vHash = "ami" + decodeURIComponent( "16jkJYGA" );               var jwInfo = jwplayer(el).getPlaylistItem(jwplayer(el).getPlaylistIndex());                 console.log(jwInfo);                window.lock_25 = false;                 window.lock_50 = false;                 window.lock_75 = false;                 window.lock_100 = false;                window.permutive.track("VideoLoad", {                   play_id: el, //this will stay constant for all of the events emitted during the same video play                     video: {                        duration: Math.round(jwInfo.duration), // in seconds                        name: jwInfo.title,                         video_id: decodeURIComponent( "16jkJYGA" ),                         description: jwInfo.description,                        published_at: new Date(jwInfo.pubdate).toISOString()                    },                  enriched_data:{                         tvchannel: decodeURIComponent( "Men%26%23039%3Bs%20Journal" ), //tv channel name                        language: "English", //language of the content                      type: "video",                      keywords: jwInfo.tags.split(","), //keywords for the page                   }               });                 console.log("Permutive video load event");          }).on('adPlay', (e) =&gt; {                 var el = decodeURIComponent( "jwplayer_16jkJYGA_eEkK759I_div" );                var vHash = "ami" + decodeURIComponent( "16jkJYGA" );               window.adInfo = e;              var jwInfo = jwplayer(el).getPlaylistItem(jwplayer(el).getPlaylistIndex());                 window.adlock_25 = false;               window.adlock_50 = false;               window.adlock_75 = false;               window.adlock_100 = false;                  window.permutive.track("VideoAdPlay", {                     play_id: el, //this will stay constant for all of the events emitted during the same video play                     ad: {                       duration: Math.round(window.adInfo.duration),                       creative_name: window.adInfo.adtitle,                       ad_id: window.adInfo.adId,                      title: window.adInfo.adtitle,                       video_type: "instream" //outstream                  },                  video: {                        duration: Math.round(jwInfo.duration), // in seconds                        name: jwInfo.title,                         video_id: decodeURIComponent( "16jkJYGA" ),                         description: jwInfo.description,                        published_at: new Date(jwInfo.pubdate).toISOString()                    },                  enriched_data:{                         tvchannel: decodeURIComponent( "Men%26%23039%3Bs%20Journal" ), //tv channel name                        language: "English", //language of the content                      type: "video",                      keywords: jwInfo.tags.split(","), //keywords for the page                   }               });                 console.log("Permutive video ad play");             }).on('adClick', (e) =&gt; {                var el = decodeURIComponent( "jwplayer_16jkJYGA_eEkK759I_div" );                var vHash = "ami" + decodeURIComponent( "16jkJYGA" );               var jwInfo = jwplayer(el).getPlaylistItem(jwplayer(el).getPlaylistIndex());                 window.permutive.track("VideoAdClick", {                    play_id: el, //this will stay constant for all of the events emitted during the same video play                     ad: {                       duration: Math.round(window.adInfo.duration),                       creative_name: window.adInfo.adtitle,                       ad_id: window.adInfo.adId,                      title: window.adInfo.adtitle,                       video_type: "instream" //outstream                  },                  video: {                        duration: Math.round(jwInfo.duration), // in seconds                        name: jwInfo.title,                         video_id: decodeURIComponent( "16jkJYGA" ),                         description: jwInfo.description,                        published_at: new Date(jwInfo.pubdate).toISOString()                    },                  enriched_data:{                         tvchannel: decodeURIComponent( "Men%26%23039%3Bs%20Journal" ), //tv channel name                        language: "English", //language of the content                      type: "video",                      keywords: jwInfo.tags.split(","), //keywords for the page                   }               });                 console.log("Permutive video ad click");            }).on('adTime', (e) =&gt; {                 var el = decodeURIComponent( "jwplayer_16jkJYGA_eEkK759I_div" );                var vHash = "ami" + decodeURIComponent( "16jkJYGA" );               var jwInfo = jwplayer(el).getPlaylistItem(jwplayer(el).getPlaylistIndex());                 var progress = (e.position/e.duration).toFixed(2);                  if (                    (0.25 &gt;= progress &amp;&amp; false === window.adlock_25) ||                  (0.5 &gt;= progress &amp;&amp; false === window.adlock_50) ||                   (0.75 &gt;= progress &amp;&amp; false === window.adlock_75) ||                  (0.95 &gt;= progress &amp;&amp; false === window.adlock_100)                ) {                     window.permutive.track("VideoAdProgress", {                         play_id: el, //this will stay constant for all of the events emitted during the same video play                         progress: Number(progress),                         ad: {                           duration: Math.round(window.adInfo.duration),                           creative_name: window.adInfo.adtitle,                           ad_id: window.adInfo.adId,                          title: window.adInfo.adtitle,                           video_type: "instream" //outstream                      },                      video: {                            duration: Math.round(jwInfo.duration), // in seconds                            name: jwInfo.title,                             video_id: decodeURIComponent( "16jkJYGA" ),                             description: jwInfo.description,                            published_at: new Date(jwInfo.pubdate).toISOString()                        },                      enriched_data:{                             tvchannel: decodeURIComponent( "Men%26%23039%3Bs%20Journal" ), //tv channel name                            language: "English", //language of the content                          type: "video",                          keywords: jwInfo.tags.split(","), //keywords for the page                       }                   });                     if ( 0.25 &gt;= progress ) {                        window.adlock_25 = true;                    }                   if ( 0.5 &gt;= progress ) {                         window.adlock_50 = true;                    }                   if ( 0.75 &gt;= progress ) {                        window.adlock_75 = true;                    }                   if ( 0.95 &gt;= progress ) {                        window.adlock_100 = true;                   }                   console.log("Permutive video ad progress " + progress);                 }           }).setPlaylistItemCallback(function(item, index) {          return waitForAmazon // Wait until Amazon is loaded.                .then(() =&gt; performAsyncBidding( player_jwplayer_16jkJYGA_eEkK759I_div, item, index ), () =&gt; { console.log("AMI JWP bidding FAILER"); }) // External bidding.                 .then(tag =&gt; {                   // Update the playlist item.                    console.log("AMI jwp new headerbid", tag);                      return Object.assign({}, item, {                        adschedule: [{                          tag,                            offset: "pre"                       }]                  });                 }).catch(function(e){                   console.log("AMI jwp bidding failed", e);                   return item;                }); // If bidding fails, use unmodified playlist item.      });;                                clearInterval(checkJWReady);                            }                   }, 500);                })();   ]]&gt;<p> </p>   <p>Yet the Giants are in prime position to make another pennant run in 2021. With two months of regular season games to go, they’ve held a steady lead in the NL West and more or less locked in a playoff spot with a 67–40 record (as of Tuesday morning). They did all that after starting the season with less than a six percent chance in <a href="https://www.fangraphs.com/standings/playoff-odds-graphs?lg=NL&div=W&stat=poff&year=2021" target="_blank" rel="noopener">FanGraphs’ playoff odds tracker</a>. Whether they hold off the Los Angeles Dodgers to win the division or need to play in a one-game Wild Card playoff, the Giants’ postseason drought is basically assured to end in October.</p> <p>How’d the Giants get here? They have a few things going for them, but they all revolve around blending vestiges of the past with smart new acquisitions that have worked out really well. Here’s a closer look at the team’s season so far.</p> <h2>The Giants’ pitching staff has jumped to a new level.</h2> <blockquote class="twitter-tweet"> <p>Kevin Gausman finishes his night with his 10th K. <a href="https://t.co/ffbHb7g1te">pic.twitter.com/ffbHb7g1te</a></p> <p>— MLB (@MLB) <a href="https://twitter.com/MLB/status/1401355676685901824?ref_src=twsrc%5Etfw">June 6, 2021</a></p></blockquote>  <p>The Giants’ 3.39 team earned-run average is the <a href="https://www.fangraphs.com/leaders.aspx?pos=all&stats=pit&lg=all&qual=0&type=8&season=2021&month=0&season1=2021&ind=0&team=0,ts&rost=0&age=0&filter=&players=0&startdate=2021-01-01&enddate=2021-12-31&sort=16,d" target="_blank" rel="noopener">third lowest in baseball</a> and a far cry from their run prevention efforts over the last few years. In the last three seasons, the Giants’ pitching staff posted ERAs of 4.64, 4.38, and 3.95—all slightly below-average marks, according to <a href="https://www.google.com/url?q=https://www.baseball-reference.com/leagues/majors/2020-standard-pitching.shtml&sa=D&source=editors&ust=1628100198170000&usg=AOvVaw3A-YrCEe73TlnHSmWTdSLW" target="_blank" rel="noopener">Baseball Reference’s ERA+ stat</a> that adjusts ERAs to a team’s ballpark.</p> <p>All five Giants starters—Kevin Gausman, Anthony DeSclafani, Logan Webb, Johnny Cueto, and Alex Wood—currently have <a href="https://www.fangraphs.com/teams/giants/stats?season=2021" target="_blank" rel="noopener">ERAs below 4</a>. They’ve also racked up plenty of strikeouts while surrendering relatively few walks. Collectively, the Giants are striking out about 24 percent of the batters they face and walking about seven percent of them; both stats are the team’s <a href="https://www.baseball-reference.com/teams/SFG/2020-pitching.shtml" target="_blank" rel="noopener">best marks over the last five years</a>.</p> <p>The Giants pitching staff are also inducing more ground balls, and combined with their cavernous home stadium, Oracle Park, it has become exceedingly difficult for opposing teams to hit home runs. The Giants give up just <a href="https://www.baseball-reference.com/leagues/majors/2021.shtml" target="_blank" rel="noopener">1.2 homers per nine innings</a>, one of the lowest figures in Major League Baseball.</p> <p>All of the Giants’ starters have been good before, but it’s a bit surprising to see them all playing this well at the same time, especially in 2021. Not long ago, the 35-year-old Cueto appeared to be on his way out of baseball. His last strong season came in 2016, his first full year in the Bay Area, when <a href="https://www.fangraphs.com/players/johnny-cueto/6893/stats?position=P" target="_blank" rel="noopener">he had a 2.79 ERA</a>. The 30-year-old Wood had barely pitched over the previous two years, <a href="https://www.fangraphs.com/players/alex-wood/13781/stats?position=P" target="_blank" rel="noopener">logging less than 50 innings</a> between 2019 and ‘20.</p> <p>If there’s any weakness in the Giants’ pitching, it’s the bullpen, which has been <a href="https://www.baseball-reference.com/leagues/majors/2020.shtml" target="_blank" rel="noopener">slightly below average</a>. But that hasn’t mattered because the club’s starters have been pitching so well.</p>   <h2>The Giants’ offensive production is a mix of old and new. And it works.</h2> <blockquote class="twitter-tweet"> <p>.<a href="https://twitter.com/BusterPosey?ref_src=twsrc%5Etfw">@BusterPosey</a> puts the Giants on the board. <a href="https://t.co/CuCDtg3MCX">pic.twitter.com/CuCDtg3MCX</a></p> <p>— MLB (@MLB) <a href="https://twitter.com/MLB/status/1405348114312085510?ref_src=twsrc%5Etfw">June 17, 2021</a></p></blockquote>  <p>Catcher Buster Posey and shortstop Brandon Crawford are 34. First baseman Brandon Belt is 33. Posey was a key player for all three World Series teams, Crawford and Belt for the latter two. Their ages say that all of them should now be toward the end of their fuses as productive big league hitters. But that hasn’t happened.</p> <p>Posey is having one of the great seasons of a Hall of Fame-caliber career. In addition to 13 home runs and a career-high .424 on-base percentage, he has been excellent in handling the Giants’ pitching staff from behind the plate. Crawford has always been one of the league’s best defensive shortstops, and he’s continued that while also having his best hitting season yet. Belt has continued to hit well and play one of the big leagues’ best defensive first bases. All three members of the old guard have stayed highly productive. (Belt is currently on the injured list but expected back <a href="https://www.cbssports.com/fantasy/baseball/news/giants-brandon-belt-needs-more-rehab-games/" target="_blank" rel="noopener">within a week or so</a>.)</p> <blockquote class="twitter-tweet"> <p>This 444-ft homer from Crawford is his longest in the Statcast era: <a href="https://t.co/JYDavZp3DC">pic.twitter.com/JYDavZp3DC</a></p> <p>— SFGiants (@SFGiants) <a href="https://twitter.com/SFGiants/status/1409725377375784962?ref_src=twsrc%5Etfw">June 29, 2021</a></p></blockquote>  <p>The Giants have also seen great production from guys who weren’t around during the glory days. 35-year-old Darin Ruf, a Philadelphia Phillies washout who played in South Korea from 2017 to ‘19, <a href="https://www.philliesnation.com/2021/08/former-phillie-darin-ruf-is-having-a-career-year-with-san-francisco/" target="_blank" rel="noopener">has turned into an overnight sensation</a>. Steven Duggar and Evan Longoria are hitting well, and the rest of the team’s lineup has also posted solid offensive numbers all season.</p> <p>The Giants’ are <a href="https://www.baseball-reference.com/leagues/majors/2021.shtml" target="_blank" rel="noopener">tied for fifth in the majors in OPS+</a>. And they’ve done it with the oldest group of hitters in the league: an average of 29.8 years old.</p> <h2>Their success to date has felt a bit lucky. But the Giants have only kept winning, and now they’ve added one of the best players in baseball.</h2> <blockquote class="twitter-tweet"> <p>WELCOME TO SAN FRANCISCO KRIS BRYANT <a href="https://t.co/1K5a8DNWRg">pic.twitter.com/1K5a8DNWRg</a></p> <p>— SF Giants on NBCS (@NBCSGiants) <a href="https://twitter.com/NBCSGiants/status/1421941047035240454?ref_src=twsrc%5Etfw">August 1, 2021</a></p></blockquote>  <p>The Giants haven’t been lucky in the conventional ways baseball teams get lucky. With the notable exception of Ruf, they haven’t had players who were supposed to be terrible go on interminable hot streaks. They have the <a href="https://www.fangraphs.com/depthcharts.aspx?position=BaseRuns" target="_blank" rel="noopener">third-best run differential in baseball</a>, so they haven’t been winning a bunch of nail-biters and losing blowouts. Instead, they’ve had many players—both pitchers and hitters—perform at the high end of their potential. Before the 2021 season, they seemed like a .500 roster. Now the Giants look like potential champions.</p> <p>Adding Kris Bryant will help. The Giants traded for the <a href="https://slate.com/culture/2021/07/cubs-kris-bryant-anthony-rizzo-javier-baez-trade.html" target="_blank" rel="noopener">Chicago Cubs’ franchise player</a> at the trade deadline last week. Bryant has been the <a href="https://www.fangraphs.com/leaders.aspx?pos=all&stats=bat&lg=all&qual=y&type=8&season=2021&month=0&season1=2015&ind=0&team=&rost=&age=&filter=&players=&startdate=&enddate=" target="_blank" rel="noopener">fourth most valuable hitter in baseball</a> since debuting in 2015, and he’ll be a Giant for the stretch drive this season before heading to free agency in the winter. With third baseman Longoria on the 60-day injured list, Bryant fills a need and gives the Giants an elite bat and glove. If other bats cool off a bit, Bryant’s dependability should help cushion that blow. The Giants also reunited with their former relief pitcher Tony Watson, another sensible move.</p> <p>Can the Giants secure another pennant? It’s an open question. But just four months ago, the notion that they could be a threat to the Dodgers seemed ridiculous. Now, the only thing that seems ridiculous is to discount their chances.</p>   <p></p>                                                <p>             <em>For access to exclusive gear videos, celebrity interviews, and more, <a href="https://www.youtube.com/channel/UCNeLFVqmsz1ykGWxIzapHHw" target="_blank" rel="noopener">subscribe on YouTube!</a></em>      </p>                       <!-- Table with cooking time details -->                                                                                                <!--/.module-more-news-center-->

Source
Gear up for the 2020 MLB Season with new gear from Nike

GameDayBlog
Welcome to GameDay.Blog Powered by SportsBook-Live.com. Please register to our site, As more States become Available for Online Gambling, We will automatically upgrade your status from Subscriber to Player. Please note we are not affilliated in any way with ESPN, CBS Sports, Home depot or CitiBank GameDay Programs. https://gameday.blog https://mlbgameday.sportsbook-live.com