Google Sheets/Excel/Python实现每行非零列求和及PGA赛事关联分析
PGA赛事相关性分析解决方案(基于共同进前30球员数)
Google Sheets 实现
单赛事对计算
如果要计算赛事A(列B)和赛事B(列C)的共同进前30球员数,直接用:
=SUMPRODUCT(--(B2:B101>0), --(C2:C101>0))
--用于把布尔值转成0/1,SUMPRODUCT会逐行相乘后求和,得到同时在两个赛事有非零完赛次数的球员总数。
批量生成相关性矩阵
如果要一次性生成所有赛事对的结果,用ArrayFormula结合MMULT:
假设赛事列从B到CV(共200列),球员行是2到101(共100行),把公式放在空白区域的左上角(比如B103):
=ArrayFormula(MMULT(--(B2:CV101>0), TRANSPOSE(--(B2:CV101>0))))
这个公式会把非零值转成1矩阵,转置后做矩阵乘法,结果矩阵的每个单元格就是对应赛事对的共同非零球员数。
Excel 实现
单赛事对计算
和Google Sheets逻辑一致,公式:
=SUMPRODUCT(--(A2:A101>0), --(B2:B101>0))
批量生成相关性矩阵
Excel 365/2021支持动态数组,直接用:
=MMULT(--(B2:CV101>0), TRANSPOSE(--(B2:CV101>0)))
旧版Excel需要选中200x200的结果区域,输入公式后按Ctrl+Shift+Enter作为数组公式执行。
Python 实现(用Pandas)
适合处理大表格,还能快速可视化结果:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 读取数据(替换成你的文件路径,假设第一列是球员姓名) df = pd.read_csv("pga_player_data.csv", index_col="Player_Name") # 把数据转成布尔矩阵:非零值标记为True(代表进过前30) bool_matrix = df > 0 # 计算赛事间共同进前30的球员数:矩阵转置后点积 common_player_matrix = bool_matrix.T.dot(bool_matrix) # 用热图可视化相关性(可选) plt.figure(figsize=(18, 15)) sns.heatmap(common_player_matrix, cmap="YlGnBu", fmt="d", cbar_kws={"label": "共同进前30球员数"}) plt.title("PGA赛事相关性矩阵(基于共同进前30球员数)") plt.xticks(rotation=45) plt.yticks(rotation=0) plt.tight_layout() plt.show()
其他赛事关联分析思路
- Jaccard相似度修正:用
共同球员数 / 至少在一个赛事进前30的球员数,消除不同赛事参赛规模的影响,更公平对比相关性。 - 排名相关性:计算球员在两个赛事的排名之间的斯皮尔曼相关系数,衡量赛事难度或球员表现的一致性。
- 赛事聚类:用K-means或层次聚类把相关性高的赛事分组,发现赛事的类型特征(比如大满贯/常规美巡赛的聚类差异)。
- 参赛球员重合度分布:分析单个球员跨赛事进前30的次数分布,找出“全能型”球员,反过来辅助赛事相关性验证。
内容的提问来源于stack exchange,提问作者Sedric Hibler
相关产品推荐
相关产品推荐

