2017-02-23 11 views
2

map<string, int>のcassandraカラムファミリからデータを読み込み、それをPandasデータフレームに変換したいと考えています。さらに、私は虹彩の種の分類でhereと記載されているように、Pythonでモデルを訓練するために使用したい。Cassandra MapをPandas Dataframeに変換する方法

私はcsvを使用してモデルをトレーニングしていました。そして、それはこのように見えただろう:

label, f1, f2, f3, f4, f5 
    0 , 11 , 1, 6 , 1, 2 
    1 , 5, 5, 1 , 2, 6 
    0 , 12, 9, 3 , 6, 8 
    0 , 9, 3, 8, 1, 0 

カサンドラ列ファミリ:

    FeatureSet     | label 

{'f1': 11, 'f2': 1, 'f3': 6, 'f4': 1, 'f5': 2} |  0 
{'f1': 5, 'f2': 5, 'f3': 1, 'f4': 2, 'f5': 6} |  1 
{'f1': 12, 'f2': 9, 'f3': 3, 'f4': 6, 'f5': 8} |  0 
{'f1': 9, 'f2': 3, 'f3': 8, 'f4': 1, 'f5': 0} |  0 

コード:

import pandas as pd 
from sklearn2pmml import PMMLPipeline 
from sklearn.tree import DecisionTreeClassifier 
from cassandra.cluster import Cluster 

CASSANDRA_HOST = ['172.16.X.Y','172.16.X1.Y1'] 
CASSANDRA_PORT = 9042 
CASSANDRA_DB = "KEYSPACE" 
CASSANDRA_TABLE = "COLUMNFAMILY" 

cluster = Cluster(contact_points=CASSANDRA_HOST, port=CASSANDRA_PORT) 
session = cluster.connect(CASSANDRA_DB) 

sql_query = "SELECT * FROM {}.{};".format(CASSANDRA_DB, CASSANDRA_TABLE) 

df = pd.DataFrame() 

for row in session.execute(sql_query): 
      What should i write here and get X_train, Y_train in pandas dataframe 



iris_pipeline = PMMLPipeline([ 
    ("classifier", DecisionTreeClassifier()) 
]) 
iris_pipeline.fit(X_train, Y_train) 

答えて

1

をあなたはthis approachを使用することができます。

import pandas as pd 
from cassandra.cluster import Cluster 

def pandas_factory(colnames, rows): 
    return pd.DataFrame(rows, columns=colnames) 

CASSANDRA_HOST = ['172.16.X.Y','172.16.X1.Y1'] 
CASSANDRA_PORT = 9042 
CASSANDRA_DB = "KEYSPACE" 
CASSANDRA_TABLE = "COLUMNFAMILY" 

cluster = Cluster(contact_points=CASSANDRA_HOST, port=CASSANDRA_PORT) 
session = cluster.connect(CASSANDRA_DB) 

session.row_factory = pandas_factory 
session.default_fetch_size = None 

query = "SELECT * FROM {}.{};".format(CASSANDRA_DB, CASSANDRA_TABLE) 

rslt = session.execute(query, timeout=None) 
df = rslt._current_rows 
+0

すでにこの方法を試しました。しかし、 'print df'は出力のマップのキー、すなわち(f1、f2、f3、f4)のみです。ここで 'df.values'を出力するときに' [OrderedMapSerializedKey([(u'f1 '、11)、(u'f2'、1)、(u'f3 '、6)、(u'f4'、 1)、(u'f5 '、2)])] 'となる。私はこれらの値を使って訓練することはできません。それは私に最初の行のヘッダーと一緒に数値を返す必要があります。ちょうど私がcsvで言及したように – Naresh

1

同じ質問に対してhereという実用的な解決法を投稿しました。 Cassandraのマップフィールドをデータフレームに追加しました。


EDIT:私は、Cassandraのデータセットの最初(0番目)の行を交換前の溶液に

from cassandra.util import OrderedMapSerializedKey 

def pandas_factory(colnames, rows): 

    # Convert tuple items of 'rows' into list (elements of tuples cannot be replaced) 
    rows = [list(i) for i in rows] 

    # Convert only 'OrderedMapSerializedKey' type list elements into dict 
    for idx_row, i_row in enumerate(rows): 

     for idx_value, i_value in enumerate(i_row): 

      if type(i_value) is OrderedMapSerializedKey: 

       rows[idx_row][idx_value] = dict(rows[idx_row][idx_value]) 

    return pd.DataFrame(rows, columns=colnames) 
rowsはタプルのリストであり、すべてのタプルがカサンドラの行です)
0

MaxUの回答に加えて、結果をデータフレームとして表示するには、もう1行追加する必要があります。

df = pd.DataFrame(rslt._current_rows)

関連する問題