मेरे पास सीएसवी फाइलों का एक बड़ा डेटासेट है जिसमें दो अलग-अलग ऑब्जेक्ट्स शामिल हैं: "object_a" और "object_b"। इन इकाइयों में से प्रत्येक के पास एक संख्यात्मक "टिक" मूल्य भी है।बड़े डेटा सेट के लिए आवेदन का उपयोग करके इस पांडस नौकरी को पूरा करने का तेज़ तरीका?
Type, Parent Name, Ticks
object_a, 4556421, 34
object_a, 4556421, 0
object_b, 4556421, 0
object_a, 3217863, 2
object_b, 3217863, 1
......
प्रत्येक वस्तु के शेयरों एक "पिता का नाम" मूल्य तो ज्यादातर मामलों में, प्रत्येक वस्तु में से एक एक "पिता का नाम" मूल्य साझा करेंगे लेकिन यह हमेशा मामला नहीं है। मैं कहाँ) देखते हैं> 1 object_a के तहत एक जनक नाम
निकालने सभी object_a के;:
मैं इस डेटासेट के साथ दो लक्ष्य हैं ii) object_a में 0 टिक हैं लेकिन अन्य ऑब्जेक्ट_ए में 0 टिक हैं। यानी शून्य टिक्स के साथ सिर्फ
सभी ऑब्जेक्ट_बी को अभिभावक नाम के नीचे निकालें जहां i) वहाँ = = object_a और; ii) object_b 0 टिक है, लेकिन object_a> 0 टिक्स
मेरा पहला दृष्टिकोण दोनों कार्यों के लिए दो अलग-अलग काम करता है, मात्रा और उत्पादन में CSV फ़ाइलों (आमतौर पर आकार में 1.5GB) है पढ़ने के लिए है
for chunk in pd.read_csv(file, chunksize=500000):
#objective one
chunk_object_a = chunk.groupby(['Parent Name']).apply(lambda g: objective_one(g.name, g))
....
....
#objective two
chunk_object_b = chunk.groupby(['Parent Name']).apply(lambda g: objective_two(g.name, g))
# फिर dataframes कहां लिखें: उन्हें जनक नाम के अनुसार समूहीकरण के बाद एक और csv फ़ाइल के लिए निकाले पंक्तियों ...
def objective_one(group_name, group_df):
group_df = group_df[group_df['Type'] == 'object_a']
if len(group_df) > 1:
zero_tick_object_a = group_df[group_df['Ticks'] == 0]
if len(zero_click_object_a) < len(group_df):
return zero_click_object_a
else:
return pd.DataFrame(columns=group_df.columns)
else:
return pd.DataFrame(columns=group_df.columns)
def objective_two(group_name, group_df):
object_a_in_group_df = group_df[group_df['Type'] == 'object_a']
object_b_has_no_clicks_in_group_df = group_df[(group_df['Type'] == 'object_b') & (group_df['Ticks'] == 0)]
if len(object_a_in_group_df) >= 1 and len(object_b_has_no_ticks_in_group_df) >= 1:
has_ticks_objects = objects_in_group_df[object_a_in_group_df['Ticks'] >= 1]
if len(has_ticks_object_a) > 0:
return object_B_has_no_ticks_in_group_df
else:
return pd.DataFrame(columns=group_df.columns)
else:
return pd.DataFrame(columns=group_df.columns)
यहाँ मुख्य विधि में इन कार्यों के लिए कॉल कर रहे हैं एक सीएसवी फ़ाइल के लिए लागू विधियों द्वारा tputted
इस दृष्टिकोण के साथ समस्या यह है कि जब मुझे यह आउटपुट मिलता है, तो यह 1 जीबी और ऊपर की सीमा में बड़ी फ़ाइलों में बहुत धीमी है। एक और मुद्दा यह है कि सीएसवी से हिस्सों में इसे पढ़ने से कुछ समूहों को प्रभावी रूप से आधे में काट दिया जा सकता है (यानी एक अभिभावक नाम को एक खंड में विभाजित किया जा सकता है और अगला, निकाली गई वस्तुओं की गलत संख्या के लिए)
क्या कोई तरीका है इसे किसी भी तेज़ बनाने के लिए अनुकूलित करें और साथ ही, मेरी चंक समस्या के आसपास हो जाओ?
के लिए परिणाम प्राप्त करें यह आप अगले लेकिन नहीं कैसे करना है जा रहे हैं की बात होगी सीएसवी बनाया जाना है – yukclam9
फ़ंक्शन घोषणा से पहले '@ numba.jit' जोड़ने का प्रयास करें। यह इस फ़ंक्शन को बाइट कोड में संकलित करेगा। – ADR