【发布时间】:2017-04-28 05:05:27
【问题描述】:
我想要一个可以对不同电影评分的用户。一部电影可以有很多评分;一个用户可以给许多电影评分。
我认为它会是这样的:
class User(db.Model, UserMixin):
__tablename__ = 'users'
id = db.Column(db.Integer(), primary_key=True)
username = db.Column(db.String(), nullable=True, unique=True)
password = db.Column(db.String(), nullable=True)
def __init__(self, *args, **kwargs):
super(User, self).__init__(*args, **kwargs)
class Movie(db.Model):
__tablename__ = 'movies'
id = db.Column(db.Integer(), primary_key=True)
title = db.Column(db.String(), nullable=True)
release_year = db.Column(db.String(), nullable=True)
imdb_url = db.Column(db.String(), nullable=True)
poster = db.Column(db.String(), nullable=True)
description = db.Column(db.String(), nullable=True)
genre = db.Column(db.String(), nullable=True)
rating = db.Column(db.String(), nullable=True)
def __init__(self, *args, **kwargs):
super(Movie, self).__init__(*args, **kwargs)
class Rating(db.Model):
__tablename__ = 'ratings'
id = db.Column(db.Integer(), primary_key=True)
movie_id = db.Column(db.Integer(), db.ForeignKey('movies.id'))
user_id = db.Column(db.Integer(), db.ForeignKey('users.id'))
rating = db.Column(db.Float(), default='0')
user = db.relationship("User", backref=backref("ratings", order_by=id))
movie = db.relationship("Movie", backref=backref("ratings", order_by=id))
如果这是正确的,我将如何查询这些表以获取所有用户及其对每部电影的评分,然后生成一个 pandas 数据框,其中所有用户的 userIds 是列,所有 movieIds 是行,各自的评分是价值?
UserId 1 2 3 4 5 6 7 8 9 10
MovieId
1 5.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
2 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 5.0
3 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 4.5 0.0
4 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
5 0.0 0.0 0.0 0.0 2.0 0.0 0.0 0.0 0.0 0.0
如果一个用户没有给电影评分,我仍然希望他们在矩阵中,比如没有给电影评分的 8 号用户。
【问题讨论】:
-
我可以生成上面的矩阵,但仅限于对至少 1 部电影进行评分的用户和至少被评分一次的电影,使用以下 2 行:df1 = pd.read_sql(session.query (Rating).statement,session.bind) print(df1.pivot(column='movie_id', index='user_id', values='rating')) 但无论如何我都想获得所有用户和所有电影他们多次评价或被评价。
标签: python pandas sqlalchemy