binning với phát (bộ dữ liệu lớn; thùng chiều rộng cố định; nổi dữ liệu)
Nếu bạn biết chiều rộng của thùng mong muốn của bạn trước thời hạn - ngay cả khi có hàng trăm hoặc hàng ngàn thùng - sau đó tôi nghĩ rằng giải pháp của riêng bạn lăn sẽ nhanh (cả viết và chạy). Dưới đây là một số Python rằng giả sử bạn có một iterator cung cấp cho bạn giá trị kế tiếp từ file:
from math import floor
binwidth = 20
counts = dict()
filename = "mydata.csv"
for val in next_value_from_file(filename):
binname = int(floor(val/binwidth)*binwidth)
if binname not in counts:
counts[binname] = 0
counts[binname] += 1
print counts
Các giá trị có thể nổi, nhưng điều này là giả sử bạn sử dụng một binwidth integer; bạn có thể cần phải tinh chỉnh điều này một chút nếu bạn muốn sử dụng một băng thông của một số giá trị float.
Đối với next_value_from_file()
, như đã đề cập trước đó, bạn có thể muốn viết trình tạo hoặc đối tượng tùy chỉnh với phương thức iter() làm điều này một cách hiệu quả.Các giả cho một máy phát điện như vậy sẽ là thế này:
def next_value_from_file(filename):
f = open(filename)
for line in f:
# parse out from the line the value or values you need
val = parse_the_value_from_the_line(line)
yield val
Nếu một đường thẳng cho trước có nhiều giá trị, sau đó hãy chắc parse_the_value_from_the_line()
hoặc trả về một danh sách hoặc bản thân là một máy phát điện, và sử dụng giả này:
def next_value_from_file(filename):
f = open(filename)
for line in f:
for val in parse_the_values_from_the_line(line):
yield val
Nguồn
2013-12-29 14:55:13
Giải pháp tốt. Nếu bạn muốn làm cho nó một chút nhanh hơn, bạn có thể làm 'myhist + = htemp' (tôi đoán rằng nó nhanh hơn vì nó cập nhật biểu đồ tại chỗ). – EOL
Cảm ơn @EOL. Tôi quên một số tính năng Python đẹp vì tôi chưa chuyển hoàn toàn từ Octave. Và sau đó có những tính năng nâng cao như máy phát điện mà tôi chưa học. – mtrw