为了账号安全,请及时绑定邮箱和手机立即绑定

Python 行到时间序列列

Python 行到时间序列列

慕慕森 2022-05-11 17:07:06
我正在分析 PGA 巡回赛数据。出于机器学习的目的,我希望列数据能够代表几周内的统计数据。下面是原始数据结构的示例。import pandas as pdimport numpy as npdata = {'Player Name':['Tiger','Tiger','Tiger','Tiger','Tiger','Tiger','Jack',                       'Jack','Jack','Jack','Jack','Jack','Jack'],         'Date':[1, 2, 4, 6, 7, 9, 1, 3, 4, 6, 9, 10, 11],        'SG Total':[13, 2, 14, 6, 8, 1, 1, 3, 8, 4, 9, 2, 1]}df_original = pd.DataFrame(data)我想获取以下格式的数据。data = {'Player Name':['Tiger','Tiger','Tiger','Jack','Jack',                   'Jack','Jack'],     'Date':[6, 7, 9, 6, 9, 10, 11],    'SG Total (Date t-3)':[13, 2, 14, 1, 3, 8, 4],    'SG Total (Date t-2)':[2, 14, 6, 3, 8, 4, 9],    'SG Total (Date t-1)':[14, 6, 8, 8, 4, 9, 2],    'SG Total (Date y)':  [6, 8, 1, 4, 9, 2, 1]}df_correct = pd.DataFrame(data)在我使用的真实数据集中,我大约有 1000 列。因此,新的所需数据集可能有 4000 列。正如您在所需数据集中看到的那样,我删除了每个玩家的前 3 周。我在个人数据的第 4 周开始日期,因为我使用前 3 周来填写 (t-3)、(t-2) 和 (t-1)无论玩家是否玩过游戏,我最初都会为每周创建一个数据集,并使用此代码创建所需的 DataFrame。#%% Creates weekly dataframes & predictions dataframes#Creates dataframes of each weekdict_of_weeks = {}for i in range(1,df_numeric_combined['Date'].nunique()+1):    dict_of_weeks['Week_{}_df'.format(i)] = df_numeric_combined[df_numeric_combined['Date'] == i]    dict_of_weeks['Week_{}_df'.format(i)].columns += ' (Week ' + str(i) + ')'    dict_of_weeks['Week_{}_df'.format(i)].rename(columns={'Player Name (Week ' + str(i) + ')' : 'Player Name' , 'Date (Week ' + str(i) + ')' : 'Date'},inplace=True)#Creating dataframes for prediction of each weekimport functoolsdict_of_predictions = {}df_weeks = []for i in range(4,df_numeric_combined['Date'].nunique()+1):    dfs = [dict_of_weeks['Week_'+str(i-3)+'_df'], dict_of_weeks['Week_'+str(i-2)+'_df'], dict_of_weeks['Week_'+str(i-1)+'_df'], dict_of_weeks['Week_'+str(i)+'_df']]    dict_of_predictions['Week_{}_predictions'.format(i)] = functools.reduce(lambda left,right: pd.merge(left,right,on=['Player Name'], how='outer'), dfs)然而,我创建的这段代码只有在玩家连续玩几周时才有效,因为它依赖于周数并减去 3、2 和 1。最终目标是获取 df_correct 格式的数据。
查看完整描述

1 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

如果我正确理解您的要求,您可以shift在排序的数据框中使用groupby来完成previous每个玩家的一周结果:



## Sort first by player and date

df_corrected = df_original.sort_values(['Player Name','Date'])


your_columns = ['SG Total'] ## name your 4000 columns here


for col in your_columns:

    for s in [3,2,1,0]: ### time lapses

        df_corrected[f'{col} (Date t-{s})'] = df_corrected.groupby('Player Name')[col].shift(s)


df_corrected.drop(your_columns, axis=1, inplace=True)

哪个输出


Out[12]: 

   Player Name  Date  SG Total (Date t-3)  SG Total (Date t-2)  \

6         Jack     1                  NaN                  NaN   

7         Jack     3                  NaN                  NaN   

8         Jack     4                  NaN                  1.0   

9         Jack     6                  1.0                  3.0   

10        Jack     9                  3.0                  8.0   

11        Jack    10                  8.0                  4.0   

12        Jack    11                  4.0                  9.0   

0        Tiger     1                  NaN                  NaN   

1        Tiger     2                  NaN                  NaN   

2        Tiger     4                  NaN                 13.0   

3        Tiger     6                 13.0                  2.0   

4        Tiger     7                  2.0                 14.0   

5        Tiger     9                 14.0                  6.0   


    SG Total (Date t-1)  SG Total (Date t-0)  

6                   NaN                    1  

7                   1.0                    3  

8                   3.0                    8  

9                   8.0                    4  

10                  4.0                    9  

11                  9.0                    2  

12                  2.0                    1  

0                   NaN                   13  

1                  13.0                    2  

2                   2.0                   14  

3                  14.0                    6  

4                   6.0                    8  

5                   8.0                    1 


查看完整回答
反对 回复 2022-05-11
  • 1 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信