-
Notifications
You must be signed in to change notification settings - Fork 0
/
model.py
130 lines (96 loc) · 4.27 KB
/
model.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, String, Date, and_, or_
from sqlalchemy.orm import sessionmaker, relationship, backref
from sqlalchemy.orm import scoped_session
from sqlalchemy import ForeignKey
import correlation
#magical shit that makes each session thread-safe
engine = create_engine("sqlite:///ratings.db", echo=False)
session = scoped_session(sessionmaker(bind=engine, autocommit=False, autoflush=False))
Base = declarative_base()
Base.query = session.query_property()
### Class declarations go here
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True)
email = Column(String(64), nullable=True)
password = Column(String(64), nullable=True)
age = Column(Integer, nullable=True)
zipcode = Column(String(15), nullable=True)
gender = Column(String(20), nullable=True)
def similarity(self, other):
u_movies = {}
for rating in self.ratings:
u_movies[rating.movie_id] = rating.rating
rating_pairs = []
for rating in other.ratings:
u_rating = u_movies.get(rating.movie_id)
if u_rating:
rating_pairs.append((u_rating, rating.rating))
if rating_pairs:
return correlation.pearson(rating_pairs)
else:
return 0.0
# def predict_rating(self,movie):
# ratings = self.ratings
# other_ratings = movie.ratings
# other_users = [r.user for r in other_ratings]
# similarities = [(self.similarity(other_user), other_user) for other_user in other_users]
# similarities.sort(reverse = True)
# top_user = similarities[0]
# matched_rating = None
# for rating in other_ratings:
# if rating.user_id == top_user[1].id:
# matched_rating = rating
# break
# return matched_rating.rating * top_user[0]
# def predict_rating(self,movie):
# ratings = self.ratings
# other_ratings = movie.ratings
# similarities = [(self.similarity(other_rating.user), other_rating) for other_rating in other_ratings]
# similarities.sort(reverse = True)
# numerator = sum([other_rating.rating * similarity for similarity, other_rating in similarities])
# denominator = sum([similarity[0] for similarity in similarities])
# return numerator/denominator
def predict_rating(self,movie):
#ratings = self.ratings
other_ratings = movie.ratings
similarities = [(self.similarity(other_rating.user), other_rating) for other_rating in other_ratings]
similarities.sort(reverse = True)
similarities = [sim for sim in similarities if sim[0] > 0]
if not similarities:
similarities = [(self.similarity(other_rating.user), other_rating) for other_rating in other_ratings]
numerator = sum([other_rating.rating * similarity for similarity, other_rating in similarities])
denominator = sum([similarity[0] for similarity in similarities])
return numerator/float(denominator)
class Movie(Base):
__tablename__ = "movies"
id = Column(Integer, primary_key = True)
movie_name = Column(String(120), nullable = False)
release_date = Column(Date)
url = Column(String(150), nullable = True)
class Rating(Base):
__tablename__ = "ratings"
id = Column(Integer, primary_key = True)
movie_id = Column(Integer, ForeignKey('movies.id'))
user_id = Column(Integer, ForeignKey('users.id'))
rating = Column(Integer, nullable = False)
user = relationship("User", backref=backref("ratings", order_by=id))
movie = relationship("Movie", backref=backref("ratings", order_by=id))
### End class declarations
def connect():
global ENGINE
global Session
ENGINE = create_engine("sqlite:///ratings.db", echo=False)
Session = sessionmaker(bind=ENGINE)
return Session()
def main():
pass
# """In case we need this for something"""
# session = connect()
# results = session.query(Movie).filter(or_(Movie.movie_name.like('J%'),Movie.movie_name.like('Q%'))).all()
# for result in results:
# print result.movie_name, result.release_date
if __name__ == "__main__":
main()