2017-02-22 234 views
2

我使用movielens数据集(ratings.dat)和pandas数据框来读取和处理数据。我必须将这些数据分成测试和训练集。通过使用熊猫dataframe.sample功能,并且可以将数据划分为随机splits.For例如:根据python中的训练和测试集中的时间戳分割每个用户的数据集

列车= df.sample(FRAC = 0.8,random_state = 200)

测试= df.drop( train.index)

现在我想对USER_ID数据进行排序,然后戳,我需要的数据每用户在训练集和测试分别设置分为80%-20%。

因此,例如,如果用户1的额定10部电影,则该用户的条目应该根据时间戳排序由旧到最新

的评分= pd.read_csv(“文件名”,九月='\吨”,发动机= '蟒',标题= 0)

sorted_df = ratings.sort([ 'USER_ID', '时间戳'],上升= [TRUE,TRUE])

和分束应该以这样的方式,具有最早时间戳的前8个条目将在训练集中和最新的2个条目将在测试集中。

我不知道我该怎么做。有什么建议么?

感谢

数据:

  user_id item_id rating Timestamp 
15    1  539  5 838984068 
16    1  586  5 838984068 
5    1  355  5 838984474 
9    1  370  5 838984596 
12    1  466  5 838984679 
14    1  520  5 838984679 
19    1  594  5 838984679 
7    1  362  5 838984885 
20    1  616  5 838984941 
23    2  260  5 868244562 
29    2  733  3 868244562 
32    2  786  3 868244562 
36    2  1073  3 868244562 
33    2  802  2 868244603 
38    2  1356  3 868244603 
30    2  736  3 868244698 
31    2  780  3 868244698 
27    2  648  2 868244699 

回答

3

它需要多个步骤,但是可以实现如下。

直觉是生成根据时间戳和在0和1之间约束它然后一切低于0.8将是您列车集,否则你测试集。

我们如何做到这一点?创建排名非常简单

df.groupby('user_id')['Timestamp'].rank(method='first') 
Out[51]: 
0  1.0 
1  2.0 
2  3.0 
3  4.0 
4  5.0 
5  6.0 
6  7.0 
7  8.0 
8  9.0 
9  1.0 
10 2.0 
11 3.0 
12 4.0 
13 5.0 
14 6.0 
15 7.0 
16 8.0 
17 9.0 
Name: Timestamp, dtype: float64 

然后您需要在每个组中有多少个值之间创建映射。你可以在这里找到更多的信息:Inplace transformation pandas with groupby

df['user_id'].map(df.groupby('user_id')['Timestamp'].apply(len)) 
Out[52]: 
0  9 
1  9 
2  9 
3  9 
4  9 
5  9 
6  9 
7  9 
8  9 
9  9 
10 9 
11 9 
12 9 
13 9 
14 9 
15 9 
16 9 
17 9 
Name: user_id, dtype: int64 

现在你可以把一切融合在一起

ranks = df.groupby('user_id')['Timestamp'].rank(method='first') 
counts = df['user_id'].map(df.groupby('user_id')['Timestamp'].apply(len)) 
(ranks/counts) > 0.8 
Out[55]: 
0  False 
1  False 
2  False 
3  False 
4  False 
5  False 
6  False 
7  True 
8  True 
9  False 
10 False 
11 False 
12 False 
13 False 
14 False 
15 False 
16  True 
17  True 
dtype: bool 
+1

感谢。解释很清楚,它帮助:) – ssh26

+0

欢呼声,我很高兴它的伎俩! :) –

相关问题