2010-12-21 18 views
9

पिछले प्रश्न (Working with heterogenous data in a statically typed language) में, मैंने पूछा कि एफ # डेटा विश्लेषण में मानक कार्यों को कैसे प्रबंधित करता है, जैसे एक untyped CSV फ़ाइल में हेरफेर करना। गतिशील भाषाओं की तरहएफ # प्रकार प्रदाता और डेटा प्रोसेसिंग

data = load('income.csv') 
data.log_income = log(income) 

एफ # में बुनियादी कार्यों में उत्कृष्टता, सबसे खूबसूरत दृष्टिकोण प्रश्न चिह्न (?) ऑपरेटर हो रहा है। दुर्भाग्यवश इस प्रक्रिया में हम स्थिर टाइपिंग खो देते हैं और अभी भी यहां और वहां टाइप एनोटेशन की आवश्यकता है।

एफ # की सबसे रोमांचक भविष्य सुविधा में से एक Type Providers है। प्रकार की सुरक्षा की न्यूनतम हानि के साथ, एक सीएसवी प्रकार प्रदाता फ़ाइल की गतिशील रूप से जांच करके प्रकार प्रदान कर सकता है।

लेकिन डेटा विश्लेषण आमतौर पर वहां नहीं रुकता है। हम अक्सर संचालन की पाइपलाइन के माध्यम से डेटा को बदलते हैं और नए डेटासेट बनाते हैं। मेरा सवाल यह है कि अगर हम अधिकतर डेटा में हेरफेर करते हैं तो प्रदाता सहायता कर सकते हैं? उदाहरण के लिए:

open CSV // Type provider 
let data = CSV(file='income.csv') // Type provider magic (syntax?) 
let log_income = log(data.income) // works! 

यह काम करता है लेकिन वैश्विक नामस्थान को प्रदूषित करता है। एक नया चर बनाने के बजाय, कॉलम जोड़ने के बारे में सोचने के लिए अक्सर अधिक प्राकृतिक होता है। क्या करने का कोई तरीका है?

let data.logIncome = log(data.income) // won't work, sadly. 

Do प्रकार प्रदाताओं (?) ऑपरेटर जब लक्ष्य नई व्युत्पन्न या साफ-डेटासेट पैदा कर रही है का उपयोग कर से बचने के प्रदान करते हैं?

शायद की तरह कुछ:

let newdata = colBind data {logIncome = log(data.income)} // ugly, does it work? 

अन्य विचार?

उत्तर

6

संक्षिप्त उत्तर नहीं है, लंबा जवाब हाँ है (लेकिन आप परिणाम पसंद नहीं करेंगे)। याद रखने की मुख्य बात यह है कि एफ # एक स्थैतिक टाइप की गई भाषा है, पूर्ण स्टॉप है।

आपके द्वारा प्रदान किए गए कोड के लिए, नया डेटा किस प्रकार है? यदि इसे संकलन-समय पर पिन नहीं किया जा सकता है, तो आपको ओबज से/कास्टिंग करने का सहारा लेना होगा।

// newdata MUST have a static type, even if obj 
let newdata = colBind data {logIncome = log(data.income)} 

कल्पना कीजिए colBind निम्नलिखित sinature है:

val colBind: Thingey<'a> -> 'b -> Thingey2<'a, 'b> 

कि वास्तव में एक तरीके के लिए काम करेगा, लेकिन यह सार्वभौमिक कार्य नहीं करेगा। क्योंकि अंत में आपको एक प्रकार की आवश्यकता होगी जो संकलन समय पर मौजूद न हो।

एफ # प्रकार प्रदाता आपको मानक रूप से मानक संकलन-समय वातावरण के बाहर से उत्पन्न डेटा टाइप करने की अनुमति देता है। हालांकि, प्रकार अभी भी स्थिर हैं। रनटाइम * पर गतिशील रूप से उन प्रकारों को बदलने का कोई तरीका नहीं है।

* आप इस तरह के DynamicObject के रूप में धोखाधड़ी का उपयोग कर कार्यावधि में वस्तु संशोधित कर सकते हैं। हालांकि, एक बार जब आप उस पथ से नीचे जाने लगते हैं तो आप को सांख्यिकीय रूप से टाइप की गई भाषा जैसे इंटेलिसेंस के सभी लाभ खो देते हैं। (जो पहले स्थान पर एफ # का उपयोग करने का एक प्रमुख कारण है।)

संकल्पनात्मक रूप से, आप जो करना चाहते हैं वह सीधे आगे है।System.Data.DataTable प्रकार में पहले से ही कॉलम को गतिशील रूप से जोड़ने की क्षमता के साथ टैब्यूलर डेटा संग्रहीत करने की धारणा है। लेकिन चूंकि अतिरिक्त कॉलम के लिए प्रकार की जानकारी संकलन समय पर ज्ञात नहीं है, इसलिए यह है कि उन कॉलम में संग्रहीत चीजों को ओबीजे के रूप में माना जाना चाहिए और रनटाइम पर डाला जाना चाहिए।

0

वैकल्पिक रूप से, आप आवश्यक कॉलम वाले टेबल के साथ 'से' और 'टू' टेबल बना सकते हैं। इस तरह, आपके पास एक स्थिर टाइप की गई क्वेरी और परिणाम स्कीमा है जो प्रकार प्रदाता काम करते हैं।

संबंधित मुद्दे