2011-08-23 36 views
8

Tôi sẽ đưa ra một số ngữ cảnh để nó có ý nghĩa. Tôi đang nắm xếp Xếp hạng của Khách hàng cho Sản phẩm trong một bảng (Xếp hạng) và muốn có thể trả lại Mức trung bình di chuyển tích lũy của xếp hạng dựa trên thời gian.Cách tính trung bình di chuyển tích lũy trong Python/SQLAlchemy/Flask

Một ví dụ cơ bản sau lấy một đánh giá mỗi ngày:

02 FEB - Rating: 5 - Cum Avg: 5 
03 FEB - Rating: 4 - Cum Avg: (5+4)/2 = 4.5 
04 FEB - Rating: 1 - Cum Avg: (5+4+1)/3 = 3.3 
05 FEB - Rating: 5 - Cum Avg: (5+4+1+5)/4 = 3.75 
Etc... 

Tôi đang cố gắng để nghĩ ra một cách tiếp cận đó sẽ không quy mô khủng khiếp.

ý tưởng hiện tại của tôi là phải có một chức năng được vấp khi một hàng được chèn vào bảng đánh giá rằng hoạt động ra Cum Avg dựa trên hàng trước cho sản phẩm đó

Vì vậy, các lĩnh vực sẽ là một cái gì đó như:

TABLE: Rating 
| RatingId | DateTime | ProdId | RatingVal | RatingCnt | CumAvg | 

Nhưng điều này có vẻ là một cách khá tinh vi để lưu trữ dữ liệu.

Điều gì sẽ là (hoặc bất kỳ) cách nào để thực hiện việc này? Nếu tôi sử dụng 'kích hoạt' các loại, làm thế nào để bạn thực hiện điều đó trong SQLAlchemy?

Bất kỳ và tất cả lời khuyên đều được đánh giá cao!

+1

Chắc chắn có thể làm điều này trong SQL - xem: http://stackoverflow.com/questions/4107479/subqueries-aggregates-and-aggravation/4107784#4107784 ... Tôi không chắc chắn làm thế nào để có được SQLAlchemy để tạo một truy vấn như vậy (và cơ sở dữ liệu của bạn có thể không hỗ trợ cú pháp cần thiết.) –

+0

@Sean Vieria: Cảm ơn bạn đã liên kết - Tôi biết có thể trong SQL thuần túy, nhưng điều này có nghĩa là số xếp hạng tăng lên, hiệu suất tồi tệ hơn khi tính toán được thực hiện trên mỗi hàng. Tôi có thể thử thực hiện ý tưởng ban đầu của tôi về lưu trữ nó khi mỗi hàng được nhập như tôi biết rằng sẽ quy mô. Tôi chỉ không chắc liệu có cái gì cơ bản tôi đã nhìn. Cảm ơn đã giúp đỡ! – mwan

Trả lời

5

Tôi không biết về SQLAlchemy, nhưng tôi có thể sử dụng một cách tiếp cận như thế này:

  • Lưu trữ trung bình tích lũy và xếp hạng riêng biệt với xếp hạng riêng lẻ.
  • Mỗi lần bạn sẽ có được một đánh giá mới, cập nhật tích lũy trung bình và giá count:
    • NEW_COUNT = old_count + 1
    • new_average = ((old_average * old_count) + new_rating)/NEW_COUNT
  • Tùy chọn, lưu trữ một hàng cho mỗi xếp hạng mới.

Cập nhật số lượng trung bình và xếp hạng có thể được thực hiện bằng một câu lệnh SQL.

+0

Cảm ơn, tôi đã thực hiện hầu hết nó ngày hôm qua và đây là cách tiếp cận mà tôi đã kết thúc, tôi đã hoàn thành việc triển khai nó và sau đó tôi sẽ đăng lại mã mà tôi đã sử dụng.Nó có quy mô một cách có trách nhiệm và dự đoán, đó là những gì tôi đã sau. – mwan

+0

Và nếu người dùng có thể chỉnh sửa xếp hạng? Cách tiếp cận này sẽ hoạt động? – user2990084

+1

Sẽ dễ dàng hơn nhiều để lưu trữ tổng * và tổng số, thay vì * trung bình * và số đếm. –

-5

Tôi nghĩ bạn nên lưu trữ các MA trong một danh sách 2 yếu tố, nó sẽ đơn giản hơn nhiều:

#first rating 5 is rating number 0 
a = [5,0] 

#next: 
for i in rating: 
a = [(a[0]*a[1]+lastRating)/(a[1]+1),a[1]+1] 

Bye

+0

Bạn có gợi ý rằng tôi lưu trữ danh sách Python-side (nghĩa là phải tính toán lại toàn bộ danh sách cho mỗi truy vấn đang chạy)? Tôi không chắc chắn tôi làm theo. Điều này sẽ không quy mô lớn khi số lượng xếp hạng tăng lên? – mwan

Các vấn đề liên quan