2016-12-18 22 views
11

Cảm ơn bạn đã dành thời gian.Làm cách nào để kiểm tra sự tương quan bằng cách sử dụng số thập phân/dữ liệu với python 3

Tôi đang viết một số mã đang kiểm tra sự tương quan giữa nhiều bộ dữ liệu. Nó hoạt động tốt khi tôi đang sử dụng dữ liệu gốc (mà tôi thành thật không chắc chắn định dạng của nó vào thời điểm đó), nhưng sau khi tôi chạy dữ liệu thông qua một số phương trình sử dụng mô-đun thập phân, tập dữ liệu sẽ không hiển thị khi được kiểm tra cho sự tương quan.

Tôi cảm thấy thực sự ngu ngốc và mới lol, tôi chắc chắn đó là một sửa chữa rất dễ dàng.

Đây là một chương trình nhỏ mà tôi đã viết để chứng minh ý tôi.

from decimal import Decimal 
import numpy as np 
import pandas as pd 

a = [Decimal(2.3), Decimal(1.5), Decimal(5.7), Decimal(4.6), Decimal(5.5), Decimal(1.5)] 
b = [Decimal(2.1), Decimal(1.2), Decimal(5.3), Decimal(4.4), Decimal(5.3), Decimal(1.7)] 

h = [2.3,1.5,5.7,4.6,5.5,1.5] 
j = [2.1,1.2,5.3,4.4,5.3,1.7] 

corr_data1 = pd.DataFrame({'A': a, 'B': b}) 

corr_data2 = corr_data1.corr() 
print(corr_data2) 

corr_data3 = pd.DataFrame({'H': h, 'J': j}) 

corr_data4 = corr_data3.corr() 
print(corr_data4) 

Các dữ liệu cho cả hai danh sách Một & B cũng như H & F là giống hệt nhau, với sự khác biệt duy nhất của A & B số là số thập phân formated, nơi như H & F thì không.

Khi chương trình đang chạy, A & B nhuận:

Empty DataFrame 
Columns: [] 
Index: [] 

và H & J trả:

  H   J 
H 1.000000 0.995657 
J 0.995657 1.000000 

Làm thế nào để làm cho nó để tôi có thể sử dụng các dữ liệu sau khi tôi đã chạy nó thông qua phương trình của tôi?

Xin lỗi vì câu hỏi ngu ngốc và cảm ơn bạn đã dành thời gian. Tôi hy vọng bạn là tất cả tốt, ngày lễ hạnh phúc!

+1

Trên thực tế trong số tất cả những người đầu tiên câu hỏi mà người dùng đã hỏi rằng tôi đã đánh giá bạn có một trong những người viết hay nhất, với mã ví dụ nhất. Đạo cụ cho một câu hỏi được truyền đạt tốt. –

+0

Tôi không nghĩ rằng gấu trúc hoặc gấu trúc hỗ trợ kiểu thập phân như vậy. Pandas đang xử lý mảng của bạn như một mảng các đối tượng. Nếu bạn muốn gấu trúc đối xử với chúng như những con số tôi nghĩ bạn sẽ cần phải chuyển đổi sang phao. – BrenBarn

+0

Danh sách các đối tượng 'Decimal' của bạn sẽ được chuyển thành mảng' object' dtype 'DataFrame' hoặc' numpy'. 'corr_data1.dtypes'. Một số hoạt động toán học hoạt động trên mảng đối tượng, nhưng nó bị đánh và bỏ lỡ. 'corr' là một trong số đó. 'corr.data1._get_numeric_data()' xuất hiện trống. – hpaulj

Trả lời

4

Gấu trúc không nhận dạng dữ liệu dưới dạng giá trị số. Dưới đây là cách chuyển đổi dữ liệu của bạn thành nổi.

corr_data1.astype(float).corr() 

#   A   B 
# A 1.000000 0.995657 
# B 0.995657 1.000000 

Điều này cũng sẽ hiệu quả nhưng thực tế là không.

pd.to_numeric(corr_data1['A'], errors='coerce') 

# 0 NaN 
# 1 NaN 
# 2 NaN 
# 3 NaN 
# 4 NaN 
# 5 NaN 
3

Pandas không có bất kỳ hỗ trợ đặc biệt nào cho loại Thập phân, do đó, nó coi là loại "đối tượng". Điều này có nghĩa là các phương thức như .corr chỉ hoạt động trên các cột số sẽ không xem các cột có giá trị thập phân phải là số. Nhiều hàm gắt gỏng và scipy cũng sẽ không hoạt động đúng trên số thập phân, bởi vì các đối tượng thập phân không thể được kết hợp với các phao thông thường trong các phép toán. (Có vẻ như scipy.stats.pearsonr không hoạt động, nhưng scipy.stats.spearmanr.)

Đối với hầu hết các phép toán số trong khối/gấu trúc, bạn sẽ cần phải chuyển dữ liệu của mình thành phao.

1

Bên cạnh những câu trả lời tốt khác mô tả làm thế nào bạn sẽ cần các giá trị dấu chấm động cho mối tương quan, chiến lược của bạn để nhập Decimal giá trị là xấu bị phá vỡ.

a = [Decimal(2.3), Decimal(1.5), Decimal(5.7), Decimal(4.6), 
    Decimal(5.5), Decimal(1.5)] 

Sản lượng:

[Decimal('2.29999999999999982236431605997495353221893310546875'), 
Decimal('1.5'), 
Decimal('5.70000000000000017763568394002504646778106689453125'), 
Decimal('4.5999999999999996447286321199499070644378662109375'), 
Decimal('5.5'), 
Decimal('1.5')] 

Đó là buồn, vì bạn đã đi đến tất cả các rắc rối đó để nhập cơ quan đại diện thập phân chính xác, nhưng Python mất chúng như float literals, và áp đặt không chính xác xấu xí của nhị phân điểm nổi trên chúng trước khi chúng có thể đến được bến cảng an toàn của nhà xây dựng Decimal(). Đối với một số giá trị may mắn như 1.5, không có vấn đề gì. float đại diện cho chúng tại chỗ. Đối với những người khác như 2,3, Ác nhanh chóng hạ xuống.

Xem xét thay vì:

a = [Decimal('2.3'), Decimal('1.5'), Decimal('5.7'), Decimal('4.6'), 
    Decimal('5.5'), Decimal('1.5')] 

Hoặc vì đó là khó sử dụng:

a = [Decimal(x) for x in '2.3,1.5,5.7,4.6,5.5,1.5'.split(',')] 

Hoặc mang đến cho bạn gọn gàng, số thập phân chính xác mà bạn tìm kiếm:

[Decimal('2.3'), 
Decimal('1.5'), 
Decimal('5.7'), 
Decimal('4.6'), 
Decimal('5.5'), 
Decimal('1.5')] 
Các vấn đề liên quan