2009-06-19 40 views
6

Tôi đang triển khai một thư viện đa bảng trong Python như một bài tập lập trình cho công việc mới của mình, và tôi đã thực hiện các yêu cầu mà hoạt động nhưng không phù hợp và dư thừa. Tôi muốn một mô hình tốt hơn cho nó, cái gì đó cho phép chuyển động dữ liệu giữa các mô hình cơ bản, được lưu trữ dưới dạng dữ liệu dạng bảng trong các tệp phẳng và tất cả các kết quả phân tích thống kê có thể được hỏi về điều này. Ngay bây giờ, tôi có một sự tiến triển từ một tập hợp các bộ dữ liệu cho mỗi hàng trong bảng, để một biểu đồ đếm tần số xuất hiện của các bộ dữ liệu quan tâm, đến một bộ nối tiếp - hơi vụng về - biên dịch xuất ra một tập hợp các ô bảng để hiển thị. Tuy nhiên, cuối cùng tôi phải quay lại bàn hoặc biểu đồ thường xuyên hơn tôi muốn vì không có đủ thông tin tại chỗ.Mô hình dữ liệu tốt cho việc lập bảng chéo là gì?

Vì vậy, có ý tưởng nào không?

Chỉnh sửa: Dưới đây là ví dụ về một số dữ liệu và những gì tôi muốn có thể xây dựng từ . Lưu ý rằng "." biểu thị một chút dữ liệu 'bị thiếu', đó chỉ là điều kiện được tính.

1 . 1 
1 0 3 
1 0 3 
1 2 3 
2 . 1 
2 0 . 
2 2 2 
2 2 4 
2 2 . 

Nếu tôi được nhìn vào mối tương quan giữa các cột 0 và 2 ở trên, đây là bàn Tôi muốn có:

. 1 2 3 4 
1 0 1 0 3 0 
2 2 1 1 0 1 

Ngoài ra, tôi muốn để có thể tính toán tỷ lệ tần suất/tổng, tần số/tổng phụ, & c.

+0

Đó là không phải là rất rõ ràng với tôi những gì bạn đang cố gắng làm. Bạn có thể mô tả các yêu cầu hoặc đưa ra một ví dụ với một số dữ liệu và hiển thị các biến đổi bạn muốn làm không? –

+0

Trong ví dụ này, bạn nên viết nó theo thứ tự cột lớn. – jonnii

+0

jonnii, tôi không phải là một nhà thống kê; bạn có thể làm rõ ý bạn là gì? –

Trả lời

1

Bạn có thể sử dụng cơ sở dữ liệu trong bộ nhớ sqlite làm cấu trúc dữ liệu và xác định các hoạt động mong muốn dưới dạng truy vấn SQL.

import sqlite3 

c = sqlite3.Connection(':memory:') 
c.execute('CREATE TABLE data (a, b, c)') 

c.executemany('INSERT INTO data VALUES (?, ?, ?)', [ 
    (1, None, 1), 
    (1, 0, 3), 
    (1, 0, 3), 
    (1, 2, 3), 
    (2, None, 1), 
    (2, 0, None), 
    (2, 2, 2), 
    (2, 2, 4), 
    (2, 2, None), 
]) 

# queries 
# ... 
-1

Tại sao không lưu trữ nó bằng Bảng HTML? Nó có thể không phải là tốt nhất, nhưng bạn có thể sau đó, rất dễ dàng, xem nó trong một trình duyệt.

Chỉnh sửa:

Tôi chỉ đọc lại câu hỏi và bạn đang yêu cầu mô hình dữ liệu chứ không phải mô hình lưu trữ. Để trả lời câu hỏi đó ...

Tất cả phụ thuộc vào cách bạn sẽ báo cáo dữ liệu. Ví dụ: nếu bạn định thực hiện nhiều phép xoay vòng hoặc tổng hợp, có thể có ý nghĩa hơn để lưu trữ nó theo thứ tự cột lớn, theo cách này, bạn có thể chỉ cần tổng hợp một cột để lấy số đếm, ví dụ.

Nó sẽ giúp ích rất nhiều nếu bạn giải thích loại thông tin bạn đang cố trích xuất.

+0

Tôi không chắc chắn về loại dữ liệu nào; các bài tập đang được chuyển thành từng bước một (bước 1: đọc tệp được phân tách bằng tab và đếm các cặp trong cột 1/2 (bảng tổng hợp?/tôi lang thang tới wikipedia ...) Giả sử rằng tôi muốn làm mọi thứ ở đây: http://en.wikipedia.org/wiki/Cross_tabulation#Statistics_related_to_cross_tabulations –

+1

Bạn có ý gì khi đếm các cặp trong một cột? – jonnii

0

Vì đây là một bài tập lập trình ban đầu cho Python, họ có thể muốn bạn xem những cơ chế tích hợp Python nào phù hợp với phiên bản ban đầu của vấn đề. Cấu trúc từ điển có vẻ là một ứng cử viên tốt. Giá trị cột đầu tiên từ tệp tab-sep của bạn có thể là chìa khóa trong từ điển. Mục nhập do khóa đó tìm thấy có thể là từ điển, khóa có giá trị cột thứ hai. Các mục của từ điển sẽ là một số đếm, được khởi tạo thành 1 khi bạn thêm một từ điển mới khi một cặp lần đầu tiên gặp phải.

1

S W đã đăng a good basic recipe for this on activestate.com.

Bản chất có vẻ là ...

  1. Xác định xsort = [] và ysort = [] làm mảng của trục của bạn. Cư trú chúng bằng cách lặp qua dữ liệu của bạn, hoặc một số cách khác.
  2. Xác định rs = {} như một dict của dicts của dữ liệu được lập bảng của bạn, bằng cách lặp qua dữ liệu của bạn và tăng rs [yvalue] [xvalue]. Tạo các phím bị thiếu nếu/khi cần.

Sau đó, ví dụ tổng cho hàng y sẽ sum([rs[y][x] for x in xsort])

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