मैं काफी बड़े पंडों के डेटाफ़्रेम के साथ काम कर रहा हूँ - मेरा डेटासेट निम्नलिखित df
सेटअप जैसा दिखता है :
import pandas as pd
import numpy as np
#--------------------------------------------- SIZING PARAMETERS :
R1 = 20 # .repeat( repeats = R1 )
R2 = 10 # .repeat( repeats = R2 )
R3 = 541680 # .repeat( repeats = [ R3, R4 ] )
R4 = 576720 # .repeat( repeats = [ R3, R4 ] )
T = 55920 # .tile( , T)
A1 = np.arange( 0, 2708400, 100 ) # ~ 20x re-used
A2 = np.arange( 0, 2883600, 100 ) # ~ 20x re-used
#--------------------------------------------- DataFrame GENERATION :
df = pd.DataFrame.from_dict(
{ 'measurement_id': np.repeat( [0, 1], repeats = [ R3, R4 ] ),
'time':np.concatenate( [ np.repeat( A1, repeats = R1 ),
np.repeat( A2, repeats = R1 ) ] ),
'group': np.tile( np.repeat( [0, 1], repeats = R2 ), T ),
'object': np.tile( np.arange( 0, R1 ), T )
}
)
#--------------------------------------------- DataFrame RE-PROCESSING :
df = pd.concat( [ df,
df \
.groupby( ['measurement_id', 'time', 'group'] ) \
.apply( lambda x: np.random.uniform( 0, 100, 10 ) ) \
.explode() \
.astype( 'float' ) \
.to_frame( 'var' ) \
.reset_index( drop = True )
], axis = 1
)
नोट: एक न्यूनतम उदाहरण होने के उद्देश्य से, इसे आसानी से कम किया जा सकता है (उदाहरण के लिए df.loc[df['time'] <= 400, :]
), लेकिन चूंकि मैं डेटा का अनुकरण करता हूं, वैसे भी मुझे लगा था कि मूल आकार बेहतर अवलोकन देगा।
['measurement_id', 'time', 'group']
मेरे द्वारा परिभाषित प्रत्येक समूह के लिए निम्न फ़ंक्शन को कॉल करने की आवश्यकता है:
from sklearn.cluster import SpectralClustering
from pandarallel import pandarallel
def cluster( x, index ):
if len( x ) >= 2:
data = np.asarray( x )[:, np.newaxis]
clustering = SpectralClustering( n_clusters = 5,
random_state = 42
).fit( data )
return pd.Series( clustering.labels_ + 1, index = index )
else:
return pd.Series( np.nan, index = index )
प्रदर्शन को बढ़ाने के लिए मैंने दो तरीकों की कोशिश की:
पंडेरेलल पैकेज
पहला तरीका pandarallel
पैकेज का उपयोग करके संगणनाओं को समानांतर करना था :
pandarallel.initialize( progress_bar = True )
df \
.groupby( ['measurement_id', 'time', 'group'] ) \
.parallel_apply( lambda x: cluster( x['var'], x['object'] ) )
हालाँकि, यह सब-इष्टतम प्रतीत होता है क्योंकि इसमें बहुत अधिक रैम की खपत होती है और सभी कोर का उपयोग अभिकलन में नहीं किया जाता है (भले ही pandarallel.initialize()
विधि में कोर की संख्या को स्पष्ट रूप से निर्दिष्ट करने के बावजूद )। इसके अलावा, कभी-कभी कम्प्यूटेशन को विभिन्न त्रुटियों के साथ समाप्त कर दिया जाता है, हालांकि मुझे इसके लिए एक कारण खोजने का मौका नहीं मिला है (संभवतः रैम की कमी?)।
पाइस्पार्क पंडस यूडीएफ
मैंने स्पार्क पंडों को यूडीएफ भी दिया, हालांकि मैं स्पार्क के लिए बिल्कुल नया हूं। यहाँ मेरा प्रयास है:
import findspark; findspark.init()
from pyspark.sql import SparkSession
from pyspark.conf import SparkConf
from pyspark.sql.functions import pandas_udf, PandasUDFType
from pyspark.sql.types import *
spark = SparkSession.builder.master( "local" ).appName( "test" ).config( conf = SparkConf() ).getOrCreate()
df = spark.createDataFrame( df )
@pandas_udf( StructType( [StructField( 'id', IntegerType(), True )] ), functionType = PandasUDFType.GROUPED_MAP )
def cluster( df ):
if len( df['var'] ) >= 2:
data = np.asarray( df['var'] )[:, np.newaxis]
clustering = SpectralClustering( n_clusters = 5,
random_state = 42
).fit( data )
return pd.DataFrame( clustering.labels_ + 1,
index = df['object']
)
else:
return pd.DataFrame( np.nan,
index = df['object']
)
res = df \
.groupBy( ['id_half', 'frame', 'team_id'] ) \
.apply( cluster ) \
.toPandas()
दुर्भाग्य से, प्रदर्शन भी असंतोषजनक था, और जो मैंने इस विषय पर पढ़ा था, यह केवल यूडीएफ फ़ंक्शन का उपयोग करने का बोझ हो सकता है, जिसे पायथन में लिखा गया है और सभी पायथन ऑब्जेक्ट्स को स्पार्क ऑब्जेक्ट और बैक में परिवर्तित करने की संबद्ध आवश्यकता है।
तो यहाँ मेरे सवाल हैं:
- क्या मेरे किसी भी दृष्टिकोण को संभावित बाधाओं को खत्म करने और प्रदर्शन में सुधार करने के लिए समायोजित किया जा सकता है? (उदाहरण PySpark सेटअप, उप-इष्टतम संचालन आदि को समायोजित करना)
- क्या वे कोई बेहतर विकल्प हैं? प्रदर्शन के संदर्भ में वे प्रदान किए गए समाधानों की तुलना कैसे करते हैं?
dask
((मेरी टिप्पणी है, तो यह शोध के लिए सिर्फ सलाह है।