2015-09-14 4 views
7

में स्पार्क डेटाफ्रेम से लेबल किए गए अंक बनाएं, क्या मैं पाइथन में क्या .map() फ़ंक्शन का उपयोग करता हूं, क्या मैं स्पार्क डेटाफ्रेम से लेबल किए गए पॉइंट्स का एक सेट बनाने के लिए उपयोग करता हूं? यदि लेबल/परिणाम पहला कॉलम नहीं है तो नोटेशन क्या है लेकिन मैं इसके कॉलम नाम, 'स्थिति' का संदर्भ ले सकता हूं?पाइथन

मैं इस .map() फ़ंक्शन के साथ अजगर dataframe बनाएँ:

def parsePoint(line): 
    listmp = list(line.split('\t')) 
    dataframe = pd.DataFrame(pd.get_dummies(listmp[1:]).sum()).transpose() 
    dataframe.insert(0, 'status', dataframe['accepted']) 
    if 'NULL' in dataframe.columns: 
     dataframe = dataframe.drop('NULL', axis=1) 
    if '' in dataframe.columns: 
     dataframe = dataframe.drop('', axis=1) 
    if 'rejected' in dataframe.columns: 
     dataframe = dataframe.drop('rejected', axis=1) 
    if 'accepted' in dataframe.columns: 
     dataframe = dataframe.drop('accepted', axis=1) 
    return dataframe 

मैं कम समारोह के बाद एक चिंगारी dataframe करने के लिए इसे परिवर्तित सभी पांडा dataframes पुनर्संयोजन गया है।

parsedData=sqlContext.createDataFrame(parsedData) 

लेकिन अब मैं पाइथन में इस से labledPoints कैसे बना सकता हूं? मुझे लगता है कि यह एक और .map() फ़ंक्शन हो सकता है?

उत्तर

11

आप पहले से ही संख्यात्मक विशेषताएं हैं और जो कोई अतिरिक्त परिवर्तनों की आवश्यकता होती है यदि आप स्तंभों स्वतंत्र चरों युक्त गठबंधन करने के लिए VectorAssembler उपयोग कर सकते हैं:

from pyspark.ml.feature import VectorAssembler 

assembler = VectorAssembler(
    inputCols=["your", "independent", "variables"], 
    outputCol="features") 

transformed = assembler.transform(parsedData) 

अगला आप बस मैप कर सकते हैं:

from pyspark.mllib.regression import LabeledPoint 
from pyspark.sql.functions import col 

(transformed.select(col("outcome_column").alias("label"), col("features")) 
    .rdd 
    .map(lambda row: LabeledPoint(row.label, row.features))) 

स्पार्क के रूप में 2.0 ml और mllib एपीआई अब संगत नहीं है और बाद वाला कोई बहिष्कार और हटाने की ओर जा रहा है। यदि आपको अभी भी इसकी आवश्यकता है तो आपको ml.Vectors से mllib.Vectors को परिवर्तित करना होगा।

from pyspark.mllib import linalg as mllib_linalg 
from pyspark.ml import linalg as ml_linalg 

def as_old(v): 
    if isinstance(v, ml_linalg.SparseVector): 
     return mllib_linalg.SparseVector(v.size, v.indices, v.values) 
    if isinstance(v, ml_linalg.DenseVector): 
     return mllib_linalg.DenseVector(v.values) 
    raise ValueError("Unsupported type {0}".format(type(v))) 

और नक्शा:

lambda row: LabeledPoint(row.label, as_old(row.features))) 
+1

यह काम नहीं करता, दुर्भाग्य से। सबसे पहले, '.map() 'डेटाफ्रेम के साथ काम नहीं करता है। दूसरा, यहां तक ​​कि अगर कोई पहले आरडीडी में परिवर्तित हो जाता है, तो यह त्रुटि टाइप करता है 'TypeError: प्रकार वेक्टर में परिवर्तित नहीं कर सकता। – xenocyon