我正在使用一些EPL统计数据。我有以下格式的一季中所有比赛的csv。
D H A H_SC A_SC H_ODDS D_ODDS A_ODDS...
11.05.2014 Norwich Arsenal 0 2 5.00 4.00 1.73
11.05.2014 Chelsea Swansea 0 0 1.50 3.00 5.00
我想要做的是每场比赛计算N场前比赛的球队平均数据。结果看起来应该是这样的。
D H A H_SC A_SC H_ODDS D_ODDS A_ODDS...
11.05.2014 Norwich Arsenal avgNorwichSC avgArsenalSC 5.00 4.00 1.73
11.05.2014 Chelsea Swansea avgChelseaSC avgSwanseaSC 1.50 3.00 5.00
因此,日期,球队和赔率保持不变,其他统计数据将替换为之前N场比赛的平均值。编辑:前N轮的比赛不应该在决赛桌中,因为没有足够的数据来计算平均值。
对我来说最棘手的部分是我平均的统计数据具有不同的预置(H_或A_),具体取决于比赛的位置。
我现在设法做的就是创建字典,其中key是俱乐部名称,值是包含俱乐部所有比赛的DataFrame。
D H A H_SC A_SC H_ODDS D_ODDS A_ODDS...
11.05.2014 Norwich Arsenal 0 2 5.00 4.00 1.73
04.05.2014 Arsenal West Brom 1 0 1.40 5.25 8.00
我以前也没有大熊猫编码,但我对代码不满意,我想学习大熊猫:)。
答案 0 :(得分:0)
你说你想学习大熊猫,所以我给出了一些例子(用类似数据测试过)来让你走上正确的轨道。这是一个观点,但我认为找到最后的N
游戏很难,所以我最初假设/假装你想要在整个桌面上找到平均值。如果发现“最后N”确实是重要的,我可以添加答案。这应该让你和熊猫和gropuby一起去 - 我已经留下了印刷品,所以你可以理解发生了什么。
import pandas
EPL_df = pandas.DataFrame.from_csv('D:\\EPLstats.csv')
#Find most recent date for each team
EPL_df['D'] = pandas.to_datetime(EPL_df['D'])
homeGroup = EPL_df.groupby('H')
awayGroup = EPL_df.groupby('A')
#Following will give you dataframes, team against last game, home and away
homeLastGame = homeGroup['D'].max()
awayLastGame = awayGroup['D'].max()
teamLastGame = pandas.concat([homeLastGame, awayLastGame]).reset_index().groupby('index')['D'].max()
print teamLastGame
homeAveScore = homeGroup['H_SC'].mean()
awayAveScore = awayGroup['A_SC'].mean()
teamAveScore = (homeGroup['H_SC'].sum() + awayGroup['A_SC'].sum()) / (homeGroup['H_SC'].count() + awayGroup['A_SC'].count())
print teamAveScore
您现在拥有每支球队的平均得分以及最近的比赛日期。您现在要做的就是使用最近的日期选择原始数据框的相关行(即除了得分列之外的其他内容),然后使用该行中的团队名称从平均得分数据框中进行选择。
e.g。
recentRows = EPL_df.loc[EPL_df['D'] > pandas.to_datetime("2015/01/10")]
print recentRows
def insertAverages(s):
a = teamAveScore[s['H']]
b = teamAveScore[s['A']]
print a,b
return pandas.Series(dict(H_AVSC=a, A_AVSC=b))
finalTable = pandas.concat([recentRows, recentRows.apply(insertAverages, axis = 1)], axis=1)
print finalTable
finalTable有最新游戏的原始赔率等,有两个额外的列(H_AVSC和A_AVSC),用于参与这些比赛的主队和客队的平均分数
一堆陷阱
刚才注意到我没有在to_datetime()
中放置格式字符串。对于您的日期 - 它们看起来像英国格式的点,所以你应该做
EPL_df['D'] = pandas.to_datetime(EPL_df['D'], format='%d.%m.%Y')
您可以使用teamLastGame
中的最短日期,而不是我示例中的硬编码2015/01/10
。
如果您确实需要在H_SC
中使用H_AVSC
替换列finalTable
,而不是添加平均值:
newCols = recentRows.apply(insertAverages, axis = 1)
recentRows['H_SC'] = newCols['H_AVSC']
recentRows['A_SC'] = newCols['A_AVSC']
print recentRows