查找行之间的绝对差异并将差异与其他行进行比较
Finding absolute difference between rows and comparing the difference with other rows
我有这个数据框。
df = pd.DataFrame({'userId': [10,20,10,20,10,20,60,90,60,90,60,90,30,40,30,40,30,40,50,60,50,60,50,60],
'movieId': [500,500,800,800,700,700,1100,1100,1900,1900,2000,2000,1600,1600,1901,1901,3000,3000,3025,3025,4000,4000,500,500],
'ratings': [3.5,4.5,2.0,5.0,3.0,1.5,1.5,4.5,2.5,4.5,4.0,5.0,4.0,1.5,4.5,4.5,3.5,4.5,3.0,5.0,4.0,1.5,3.5,5]})
我已将此数据框转换为不同的块。每 6 行后创建一个新块。
After creating chunks it looks like this
df
userId movieId ratings
0 10 500 3.5
1 20 500 4.5
2 10 800 2.0
3 20 800 5.0
4 10 700 4.0
5 20 700 1.5
userId movieId ratings
6 60 1100 3.5
7 90 1100 4.5
8 60 1900 3.5
9 90 1900 4.5
10 60 2000 2.0
11 90 2000 5.0
userId movieId ratings
12 30 1600 4.0
13 40 1600 1.5
14 30 1901 3.5
15 40 1901 4.5
16 30 3000 3.5
17 40 3000 4.5
userId movieId ratings
18 50 3025 2.0
19 60 3025 5.0
20 50 4000 4.0
21 60 4000 1.5
22 50 500 3.5
23 60 500 4.5
我想做的是:
1. 取两个用户对同一部电影的绝对差值(每对用户都看过三部电影)。
2.取前两部电影的平均差异,然后将其与第三部电影的差异进行比较。
如果第三部电影的差异小于前两部电影的平均值,则为正,否则为负。例如,在第一个块差异 b/w 中,第一部电影是 1,接下来是 3(平均差异是 2)。对于第 3 对 diff 是 2.5(diff > avg),它应该给出负结果。
3. 对数据帧中的每个块执行此操作。
positive_counter = []
negative_counter = []
numberOfUsers = 2
numberOfMovies = 3
usersLength = numberOfUsers*numberOfMovies
def chunker(seq, size):
return (seq[pos:pos + size] for pos in range(0, len(seq), size))
def finding_rating(df):
for i in chunker(data,usersLength):
df['diff'] = df.groupby('movieId')['ratings'].diff().abs()
#code
对于块,你可以应用这个:
dfchunk
userId movieId ratings
0 10 500 3.5
1 20 500 4.5
2 10 800 2.0
3 20 800 5.0
4 10 700 4.0
5 20 700 1.5
r=dfchunk.pivot(index="movieId",columns="userId")
ratings
userId 10 20
movieId
500 3.5 4.5
700 4.0 1.5
800 2.0 5.0
r.columns=["u1","u2"]
r["drate"]=r.u1.sub(r.u2).abs()
u1 u2 drate
movieId
500 3.5 4.5 1.0
700 4.0 1.5 2.5
800 2.0 5.0 3.0
v= r.drate.iloc[:-1].mean()-r.drate.iloc[-1]
-1.25
编辑:
if v<0:
negative_counter.append(v)
else:
positive_counter.append(v)
我有这个数据框。
df = pd.DataFrame({'userId': [10,20,10,20,10,20,60,90,60,90,60,90,30,40,30,40,30,40,50,60,50,60,50,60],
'movieId': [500,500,800,800,700,700,1100,1100,1900,1900,2000,2000,1600,1600,1901,1901,3000,3000,3025,3025,4000,4000,500,500],
'ratings': [3.5,4.5,2.0,5.0,3.0,1.5,1.5,4.5,2.5,4.5,4.0,5.0,4.0,1.5,4.5,4.5,3.5,4.5,3.0,5.0,4.0,1.5,3.5,5]})
我已将此数据框转换为不同的块。每 6 行后创建一个新块。
After creating chunks it looks like this
df
userId movieId ratings
0 10 500 3.5
1 20 500 4.5
2 10 800 2.0
3 20 800 5.0
4 10 700 4.0
5 20 700 1.5
userId movieId ratings
6 60 1100 3.5
7 90 1100 4.5
8 60 1900 3.5
9 90 1900 4.5
10 60 2000 2.0
11 90 2000 5.0
userId movieId ratings
12 30 1600 4.0
13 40 1600 1.5
14 30 1901 3.5
15 40 1901 4.5
16 30 3000 3.5
17 40 3000 4.5
userId movieId ratings
18 50 3025 2.0
19 60 3025 5.0
20 50 4000 4.0
21 60 4000 1.5
22 50 500 3.5
23 60 500 4.5
我想做的是: 1. 取两个用户对同一部电影的绝对差值(每对用户都看过三部电影)。 2.取前两部电影的平均差异,然后将其与第三部电影的差异进行比较。 如果第三部电影的差异小于前两部电影的平均值,则为正,否则为负。例如,在第一个块差异 b/w 中,第一部电影是 1,接下来是 3(平均差异是 2)。对于第 3 对 diff 是 2.5(diff > avg),它应该给出负结果。 3. 对数据帧中的每个块执行此操作。
positive_counter = []
negative_counter = []
numberOfUsers = 2
numberOfMovies = 3
usersLength = numberOfUsers*numberOfMovies
def chunker(seq, size):
return (seq[pos:pos + size] for pos in range(0, len(seq), size))
def finding_rating(df):
for i in chunker(data,usersLength):
df['diff'] = df.groupby('movieId')['ratings'].diff().abs()
#code
对于块,你可以应用这个:
dfchunk
userId movieId ratings
0 10 500 3.5
1 20 500 4.5
2 10 800 2.0
3 20 800 5.0
4 10 700 4.0
5 20 700 1.5
r=dfchunk.pivot(index="movieId",columns="userId")
ratings
userId 10 20
movieId
500 3.5 4.5
700 4.0 1.5
800 2.0 5.0
r.columns=["u1","u2"]
r["drate"]=r.u1.sub(r.u2).abs()
u1 u2 drate
movieId
500 3.5 4.5 1.0
700 4.0 1.5 2.5
800 2.0 5.0 3.0
v= r.drate.iloc[:-1].mean()-r.drate.iloc[-1]
-1.25
编辑:
if v<0:
negative_counter.append(v)
else:
positive_counter.append(v)