【问题标题】:Average values in last n days pandas大熊猫过去 n 天的平均值
【发布时间】:2018-02-14 06:44:30
【问题描述】:

我有一个关于高尔夫球手及其在各种锦标赛中的高尔夫球场的数据框(请参阅下面发布的 df head 字典)。我需要一种快速的计算方法,对于玩家玩的每一轮,他在前 n 天的平均“获得的击球数”(SG),其中 n 是我决定的任何值。我会知道如何通过将数据框转换为列表列表并迭代来做到这一点,但这会非常慢。理想情况下,我希望在 Pandas df 中增加一列,标题为“过去 100 天内玩家的平均 SG”。

这就是我们正在使用的(数据帧头的字典):

{'Avg SG Player': {0: 0.4564491861877877,
  1: -0.170952417298073,
  2: 1.509033309098962,
  3: -1.7298114700775877,
  4: 1.7856746598995106},
 'Avg Score': {0: 69.53846153846153,
  1: 69.53846153846153,
  2: 69.53846153846153,
  3: 69.53846153846153,
  4: 69.53846153846153},
 'Date': {0: Timestamp('2003-01-23 00:00:00'),
  1: Timestamp('2003-01-23 00:00:00'),
  2: Timestamp('2003-01-23 00:00:00'),
  3: Timestamp('2003-01-23 00:00:00'),
  4: Timestamp('2003-01-23 00:00:00')},
 'Field Strength': {0: 0.08871540761770776,
  1: 0.08871540761770776,
  2: 0.08871540761770776,
  3: 0.08871540761770776,
  4: 0.08871540761770776},
 'Ind': {0: 0, 1: 1, 2: 2, 3: 3, 4: 4},
 'Overall SG': {0: 7.627176946079241,
  1: 5.627176946079241,
  2: 5.627176946079241,
  3: 4.627176946079241,
  4: 4.627176946079241},
 'Player': {0: 'Harrison Frazar',
  1: 'John Huston',
  2: 'David Toms',
  3: 'James H. McLean',
  4: 'Luke Donald'},
 'Round': {0: 'R1', 1: 'R1', 2: 'R1', 3: 'R1', 4: 'R1'},
 'Rounds Played': {0: 270, 1: 209, 2: 228, 3: 28, 4: 221},
 'SG on Field': {0: 7.538461538461533,
  1: 5.538461538461533,
  2: 5.538461538461533,
  3: 4.538461538461533,
  4: 4.538461538461533},
 'Score': {0: 62, 1: 64, 2: 64, 3: 65, 4: 65},
 'Tourn-Round': {0: '2003 Phoenix OpenR1',
  1: '2003 Phoenix OpenR1',
  2: '2003 Phoenix OpenR1',
  3: '2003 Phoenix OpenR1',
  4: '2003 Phoenix OpenR1'},
 'Tournament': {0: '2003 Phoenix Open',
  1: '2003 Phoenix Open',
  2: '2003 Phoenix Open',
  3: '2003 Phoenix Open',
  4: '2003 Phoenix Open'}}

已编辑

Dataframe 本质上是这样的:

玩家获得回合的日期(当天)

T 伍兹 - 01-01-2010 - 5.4

R 麦克罗伊 - 01-01-2010 - 3.8

T 伍兹 - 02-01-2010 - 0.4

等等

有 350,000 行。我需要的是一个额外的列,给出该球员在当前回合日期之前的 n(比如 100)天内获得的平均击球数。

如果下一行是:

玩家-日期-获得的击球数(当天)

T 伍兹 - 20-01-2018 - 3.2

我希望第四个(新)列,称为“100 天平均值”,为 2.9 ((5.4+0.4)/2),因为这是定义的 Tiger 前两轮的平均值时间跨度。

谢谢,

汤姆

【问题讨论】:

  • 预期输出是什么。你的问题陈述不是很清楚
  • 请复制该 dfn.head() 输出并将其作为文本放入您的问题中。
  • 请提供minimal reproducible example。不要发布代码/数据的图像。发布文本。
  • 请使用 dfn.head().to_dict() 并粘贴结果,以便我们可以使用一些东西来创建数据框。
  • 已经编辑给你们这个。感谢您的帮助。

标签: python pandas pandas-groupby


【解决方案1】:

这应该可行:

n = 10000

start_date = pd.to_datetime('today') - pd.Timedelta(n, unit='D')

df[df['Date'] >= start_date].groupby('Player')['Avg SG Player'].mean()

如果要输入开始日期和结束日期:

start_date = pd.to_datetime('2005-12-01')
end_date = pd.to_datetime('2015-12-01')

df[(df['Date'] >= start_date) & (df['Date'] <= end_date)].groupby('Player')['Avg SG Player'].mean()

【讨论】:

  • 这里有点混乱,可能是我造成的。如果一名球员在 2018 年 2 月 13 日打了一轮高尔夫球并且 n 是 12,那么我希望他在 2018 年 1 月 2 日和 2018 年 2 月 12 日之间的平均表现(即在他当前一轮之前的 12 天内) .
  • 只需将pd.to_datetime('today') 替换为您想要的任何结束日期,例如pd.to_datetime('2018-12-02')
  • 那么结束日期呢?目前该代码将返回他在未来所有轮次中的平均表现?
  • n更改为结束日期前的天数
  • 基本上我需要一个动态的开始日期(不是固定的),具体取决于当前回合的日期。
猜你喜欢
  • 2016-04-03
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
  • 2020-11-04
  • 2020-09-05
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多