2017-03-08 3 views
0

Ich arbeite an Datenanalyse mit PCA, ich schrieb diesen Code mit PySpark und es funktioniert perfekt, aber es funktioniert nur auf Daten aus einer CSV-Datei mit genau 5 Spalten ["a", "b", "c", "d", "e"], ich schreibe einen generischen Code, der PCA für eine beliebige Anzahl von Spalten aus der CSV-Datei berechnet. Was soll ich hinzufügen? Hier ist mein Code:Pyspark Generisches Modell für PCA-Datenverarbeitung

#########################! importing libraries !######################## 
from __future__ import print_function 
from pyspark.ml.linalg import Vectors 
from pyspark.sql import SparkSession 
from pyspark import SparkConf, SparkContext 
from pyspark.ml.feature import PCA, VectorAssembler 
from pyspark.mllib.linalg import Vectors 
from pyspark.ml import Pipeline 
from pyspark.sql import SQLContext 
from pyspark import SparkContext 
from pyspark.mllib.feature import Normalizer 
import timeit 
########################! main script !################################# 
sc = SparkContext("local", "pca-app") 
sqlContext = SQLContext(sc) 
if __name__ == "__main__": 
    spark = SparkSession\ 
     .builder\ 
     .appName("PCAExample")\ 
     .getOrCreate() 
    data = sc.textFile('dataset.csv') \ 
     .map(lambda line: [float(k) for k in line.split(';')])\ 
     .collect() 
    df = spark.createDataFrame(data, ["a","b","c","d","e"]) 
    df.show() 
    vecAssembler = VectorAssembler(inputCols=["a","b","c","d","e"], outputCol="features") 

    pca = PCA(k=2, inputCol="features", outputCol="pcaFeatures") 
    pipeline = Pipeline(stages=[vecAssembler, pca] 
    model = pipeline.fit(df) 
    result = model.transform(df).select("pcaFeatures") 
    result.show(truncate=False)) 
    spark.stop() 

Antwort

1

Sie benötigen, indem einige Zeilen Code generisch zu machen: -

fileObj = sc.textFile('dataset.csv') 
data = fileObj.map(lambda line: [float(k) for k in line.split(';')]).collect() 
columns = (fileObj.first()).split() 
df = spark.createDataFrame(data, columns) 
df.show() 
vecAssembler = VectorAssembler(inputCols=columns, outputCol="features") 
+0

nur das fehlende ';' in der "(fileObj.first()). split()" und es funktioniert perfekt: D danke –

+0

@MehdiBenHamida dies hängt von Ihrem Format (Trennzeichen), nahm ich Raum als Trennzeichen. –

+0

wie auch immer, danke: D –

Verwandte Themen