2016-02-05 26 views
9

Tôi đang sử dụng trình điều khiển Cassandra Python để kết nối và truy vấn cụm Cassandra của chúng tôi.Pandas và Cassandra: không tương thích định dạng mảng numpy

Tôi muốn thao tác dữ liệu của tôi qua Pandas, có một khu vực trong tài liệu cho người lái xe cassandra đề cập đến này chính xác: https://datastax.github.io/python-driver/api/cassandra/protocol.html

NumpyProtocolHander: deserializes results directly into NumPy arrays. This facilitates efficient integration with analysis toolkits such as Pandas.

Tiếp theo hướng dẫn ở trên và thực hiện một truy vấn SELECT trong Cassandra, tôi có thể thấy đầu ra (thông qua các loại() chức năng) như là một:

<class 'cassandra.cluster.ResultSet'> 

iterating thông qua các kết quả, điều này những gì in liên tiếp đi lên như:

{u'reversals_rejected': array([0, 0]), u'revenue': array([ 0, 10]), u'reversals_revenue': array([0, 0]), u'rejected': array([3, 1]), u'impressions_positive': array([3, 3]), u'site_user_id': array([226226, 354608], dtype=int32), u'error': array([0, 0]), u'impressions_negative': array([0, 0]), u'accepted': array([0, 2])} 

(Tôi đã giới hạn kết quả truy vấn, tôi đang làm việc với số lượng dữ liệu lớn hơn nhiều - do đó, muốn sử dụng số lượng lớn và gấu trúc).

kiến ​​thức của tôi về gấu trúc bị hạn chế, tôi đã cố gắng để chạy chức năng rất cơ bản:

rslt = cassandraSession.execute("SELECT accepted FROM table") 

test = rslt[["accepted"]].head(1) 

này kết quả đầu ra được lỗi sau:

Traceback (most recent call last): 
    File "/UserStats.py", line 27, in <module> 
    test = rslt[["accepted"]].head(1) 
    File "cassandra/cluster.py", line 3380, in cassandra.cluster.ResultSet.__getitem__ (cassandra/cluster.c:63998) 
TypeError: list indices must be integers, not list 

Tôi hiểu lỗi, tôi chỉ không biết làm thế nào để "chuyển tiếp" từ mảng này được cho là numpy để có thể sử dụng Pandas.

Trả lời

7

Câu trả lời ngắn gọn là:

df = pd.DataFrame(rslt[0]) 
test = df.head(1) 

rslt [0] cung cấp cho bạn dữ liệu của bạn như một dict Python, có thể dễ dàng chuyển đổi sang một dataframe Pandas.

Đối với một giải pháp hoàn chỉnh:

import pandas as pd 
from cassandra.cluster import Cluster 
from cassandra.protocol import NumpyProtocolHandler 
from cassandra.query import tuple_factory 

cluster = Cluster(
    contact_points=['your_ip'], 
    ) 
session = cluster.connect('your_keyspace') 
session.row_factory = tuple_factory 
session.client_protocol_handler = NumpyProtocolHandler 

prepared_stmt = session.prepare ("SELECT * FROM ... WHERE ...;") 
bound_stmt = prepared_stmt.bind([...]) 
rslt = session.execute(bound_stmt) 
df = pd.DataFrame(rslt[0]) 

Lưu ý: Các giải pháp trên sẽ chỉ giúp bạn có được một phần dữ liệu nếu truy vấn là lớn. Vì vậy, bạn nên làm:

df = pd.DataFrame() 
for r in rslt: 
    df = df.append(r) 
+0

Cảm ơn sự giúp đỡ của bạn! Chỉ định chỉ mục cho DataFrame là những gì tôi đã bỏ lỡ cuối cùng! – joao

+0

Cái gì nằm trong dấu ngoặc '.bind ([...])'? – yeliabsalohcin

+1

@yeliabsalohcin Đó là các biến bạn muốn gửi đến truy vấn. Vì vậy, nếu bạn có một truy vấn như thế này trong câu lệnh đã chuẩn bị của bạn: "SELECT * FROM users WHERE user_id =? AND date =?" họ sẽ thay thế "?". – Tickon

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