NBA players boycotted playoff games to demand social justice

NBA players decided to boycott tonight’s games to protest the shooting of Jacob Blake in Kenosha, Wisconsin. The move was initiated by the Milwaukee Bucks, but it wouldn’t have much impact if it weren’t joined by other players, organizations, media, fans and everyone that is involved. Huge props. A few players such as Lebron James and Donovan Mitchell already tweeted their frustration with the social injustice and their demand for change. Swiftly after the NBA announced the boycott, other leagues such as WNBA and MLB followed suit by postponing their games.

I have nothing, but respect for everyone who stood up and used their influence. Some people question the effectiveness of this boycott, saying it wouldn’t change anything. Well, isn’t that sad? These athletes have a huge following and influence. They are trying to put it to good use. It’s true that it may not bring about immediate change as they work on wooden floors in arenas, not in Washington DC or state buildings. Their actions; however, bring attention to the issue at hand and influence others, especially league officials and team owners, many of who have a lot more influence in the political world than these players. From a corporate perspective, if you are Nike, will you risk the wrath of these players by not standing with them? I am not saying that anti-racism isn’t a value that Nike naturally endorses, but financially speaking, it makes sense to stand with the players.

I am perplexed by some who criticized this boycott. If it’s unacceptable to kneel peacefully during an anthem, walk peacefully on the streets to voice opinions or simply boycott a basketball game to demand change that is long overdue, I don’t know what is acceptable any more. Only no right to protest is acceptable? Is that even American? If even these actions can’t be accepted, what could black people do? Just take everything on the chin and live on?

Critics of the protests argue that the police had their reason in shooting George Floyd as he was resisting or Jacob Blake as he was allegedly reaching for a knife on his car’s floor. But why is shooting people the first option that police take when it comes to black people? A 17-year old white guy killed two people in Kenosha with an AR-15 and he was taken into custody. Many white protestors came to state buildings a few months ago, armed heavily, to demand the lifting of state at home orders. Nobody was shot. I am glad that nobody was shot, but if those people had been black, I am confident things would have turned out very differently.

I am not black, so I can’t fully relate to the pain and fear of black people. But I am not white either. As a minority living in this country and much more importantly as a fellow human being, I support their protest completely. To round this off, I leave with the powerful speech by Coach Doc Rivers, who said: it’s amazing that we keep loving this country and this country doesn’t love us back.

The paradox of the NBA

NBA free agency started on Sunday night. It has been a melee with numerous deals announced after the 6pm mark. Bleacher Report claimed that the first day of the free agency saw $3bn in contracts signed.

That’s a lot of money. Players’ lives are changed over night. Career takes dramatic turns over night.

Yet, the irony in all this show of wealth is that while some players command attention, freedom and money, others may not be able to choose where to work. Grown men in the 20s or 30s don’t even get to choose where to work and live. If traded suddenly, they have to uproot their family and disrupt their spouses or kids’ lives.

That’s what I find very sad about the NBA. At least in soccer or what we call football, players have all the freedom in the world to choose where to work. If they don’t want to, their current clubs can’t force them out, unless contracts are broken and the players get all the contract value. Take Gareth Bale for instance. His manager doesn’t want him. His club doesn’t want him. His teammates don’t like him. The fans in Madrid don’t want to see him. Yet, unless he is willing to be transferred, there is nothing that Madrid can do.

Another disappointing aspect of the NBA is some hostile fans. By playing, players essentially trade their time and health for money. Injuries happen. Your body takes a toll. Continuous workouts are required. Media presence is mandated. Yet, players sometimes don’t get to choose where to play and live. Nonetheless, that doesn’t stop hostile fans from throwing tantrums at players whenever they do what is in their best interest. Take Kevin Durant for instance. He did what he thought was best for him by signing with GSW. Yet, he is called soft, a snake and other vulgarities.

Money and fame do come at an expense. Costly expense.

Data Analytics: Klay Thompson’s Performance

This is my data analytics practice by analyzing Klay Thompson’s performance so far in the 2018-2019 season up to 22nd Dec 2018. Klay Thompson is the shooting guard of Golden State Warriors. He is a three time world champion and I am a big fan of his playing style and deadly explosiveness. This post features my findings by analyzing his shot data this season from NBA website here. My code is available on my personal GitHub for your reference.


  • Klay made about 44% of his shots so far
  • Klay’s successful shots’ average distance to the basket is 15.92m
  • He made more shots in the first half than he did in the second half
  • 67% of Klay’s made shots are two pointers. The rest are three pointers
  • Living up to his name, Klay’s favorite play type is “catch and shoot jump shot”
  • Regarding Klay’s made two-pointers, below is the distribution by distance. He seems to be more effective within 10 feet of the basket and from 15 to 20 feet.
  • In regards to Klay’s three pointers, the distribution by distance to the basket is as follows: (no surprise that the farther he is from the basket, the less lethal he is)

  • As one of the best three point shooters in the league, Klay seems to be equally good throughout the periods of a game, except for the first quarter

Technical lessons I learned from this practice:Pie chart in Python with Matplot

Pie chart in Python

Let’s say you have two variables: TwoPT and ThreePT that stand for the shooting percentage of Klay’s two and three pointers respectively. Here is the code to draw a pie chart

labels = '2PT Field Goal', '3PT Field Goal'
sizes = [TwoPT, ThreePT]
colors = ['green', 'gold']
explode = (0, 0)  # explode 1st slice
# Plot
plt.pie(sizes, explode=explode, labels=labels, colors=colors,
        autopct='%1.1f%%', shadow=True, startangle=140)
plt.title("Klay's made shots by shot types")

Nunique function

Imagine if you have a data frame as the following

If you want to count how many events (whether it’s a missed or made shot) by Klay by period, instead of using SQL, the alternative is to use Nunique function. An advantage of using the aggregate is that the outcome is automatically a data frame. The code is as follows:

periodstats = madeshot.groupby(by='period', as_index=False).agg({"game_date": pd.Series.nunique, 'time_remaining': pd.Series.nunique}) #the data frame's name is madeshot. Pd is the abbreviation of Pandas

The result is:

Sort and get the top 10 of a data frame

If your data frame looks like the one below and your intention is to get the top 10 records in terms of “times”, what will you do?

The code I used is pretty straightforward and simple. (The data frame’s name is shotdistance

shotdistance = shotdistance.sort_values(by='times', ascending=False)
shotdistance_top10 = shotdistance.head(10)

Categorize a data frame by bins

If you want to categorize Klay’s shot by distance in terms of “less than 10 feet”, “from 10 to 15 feet” and “from 15 to 20 feet”, for instance, what will you do? The code to turn the distance to categories is:

df1 = pd.cut(TwoPTtype['shot_distance'], bins=[0, 10, 15, 20, 23], include_lowest=True, labels=['Less than 10 feet', 'From 10 to 15 feet', 'From 15 to 20 feet', 'From 20 to 23 feet'])

#pd stands for Pandas
#TwoPTtype is the name of the data frame in question

The result is:

If you merge that data frame with the frequencies in the original data frame:

df1 = pd.cut(TwoPTtype['shot_distance'], bins=[0, 10, 15, 20, 23], include_lowest=True, labels=['Less than 10 feet', 'From 10 to 15 feet', 'From 15 to 20 feet', 'From 20 to 23 feet'])

newdf = pd.concat([df1, TwoPTtype['times']], axis=1)