2009-06-03 45 views
8

Phiên bản phát triển của Django có các chức năng tổng hợp như Tr.bình, Đếm, Tối đa, Tối thiểu, StdDev, Tổng và Variance (link text). Có lý do nào mà Median bị thiếu trong danh sách không?Thiếu chức năng tổng hợp 'Trung bình' ở Django?

Triển khai thực hiện dường như dễ dàng. Tui bỏ lỡ điều gì vậy? Bao nhiêu là các chức năng tổng hợp làm đằng sau hậu trường?

Trả lời

7

Vâng, lý do có thể là bạn cần theo dõi tất cả các số để tính trung bình. Trung bình, Đếm, Tối đa, Min, StDev, Tổng, và Phương sai tất cả có thể được tính toán với nhu cầu lưu trữ liên tục. Đó là, một khi bạn "ghi lại" một số bạn sẽ không bao giờ cần nó nữa.

FWIW, các biến bạn cần theo dõi là: min, max, count, <n> = avg, <n^2> = avg của bình phương của các giá trị.

2

Khả năng mạnh mẽ là trung vị không phải là một phần của SQL chuẩn.

Ngoài ra, nó đòi hỏi một loại, làm cho nó khá tốn kém để tính toán.

+0

Có tuyến tính, không phân loại, các thuật toán: http://valis.cs.uiuc.edu/~sariel/research/CG/applets/linear_prog/median.html –

+0

thuật toán sai, tôi có nghĩa là trung bình của trung vị : http://en.wikipedia.org/wiki/Selection_algorithm#Linear_general_selection_algorithm_-_.22Median_of_Medians_algorithm.22 –

+0

@Todd Gardner: Liên kết đầu tiên là "lựa chọn chung dựa trên phân vùng" và đó là O (nlogn) không tuyến tính. Trang web sai. Sẽ tốt hơn nếu xóa nhận xét đó, nhưng để lại nhận xét trung bình-trung bình. –

2

Tôi không biết bạn đang sử dụng chương trình phụ trợ db nào, nhưng nếu db của bạn hỗ trợ tổng hợp khác hoặc bạn có thể tìm cách làm thông minh, bạn có thể truy cập dễ dàng bằng Aggregate.

1

FWIW, bạn có thể mở rộng PostgreSQL 8.4 trở lên để có chức năng tổng hợp trung bình với these code snippets.

Đoạn mã khác (hoạt động cho các phiên bản cũ hơn của PostgreSQL) là shown here. Hãy chắc chắn để đọc các ý kiến ​​cho tài nguyên này.

15

Đây là chức năng bị thiếu của bạn. Vượt qua một queryset và tên của cột mà bạn muốn tìm trung vị cho:

def median_value(queryset, term): 
    count = queryset.count() 
    return queryset.values_list(term, flat=True).order_by(term)[int(round(count/2))] 

Điều đó không khó như một số câu trả lời khác dường như chỉ ra. Điều quan trọng là để cho việc phân loại db làm tất cả công việc, vì vậy nếu bạn có cột đã được lập chỉ mục, đây là một hoạt động siêu rẻ.

(cập nhật 1/28/2016) Nếu bạn muốn nghiêm ngặt hơn về định nghĩa trung bình cho số mặt hàng, số này sẽ trung bình với giá trị của hai giá trị giữa.

def median_value(queryset, term): 
    count = queryset.count() 
    values = queryset.values_list(term, flat=True).order_by(term) 
    if count % 2 == 1: 
     return values[int(round(count/2))] 
    else: 
     return sum(values[count/2-1:count/2+1])/Decimal(2.0) 
+0

Có một sự không chính xác nhỏ trong việc thực hiện này, khi số lượng các phần tử là ngay cả. Trích dẫn từ https://en.wikipedia.org/wiki/Median: "Nếu có một số quan sát đồng đều, thì không có giá trị trung bình duy nhất, trung bình sau đó thường được định nghĩa là giá trị trung bình của hai giá trị trung bình ". Tôi nghĩ rằng khi giá trị được lấy ra, tốt nhất là sử dụng hàm python 'trung bình' (cho hàm như vậy, xem chủ đề này: http://stackoverflow.com/questions/24101524/finding-median-of-list -in-python) –

+0

@o_c Đó là một điểm hợp lệ, nhưng tôi không nghĩ rằng sử dụng chức năng trung bình của python trên toàn bộ tập dữ liệu - đó là một hoạt động đắt tiền mà tất cả những gì tôi thực sự cần làm là tạo ra thay đổi nhỏ nếu số lượng là ngay cả. Tôi sẽ xem nếu tôi có thể ném một cái gì đó với nhau. –

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