2011-02-18 16 views
6

प्राप्त करें और अपडेट करें मेरे पास दैनिक स्टॉक डेटा है जो पीईटीबल्स का उपयोग करके बनाई गई एचडीएफ 5 फाइल के रूप में है। मैं पंक्तियों का एक समूह प्राप्त करना चाहता हूं, इसे एक सरणी के रूप में संसाधित करना चाहता हूं और फिर उसे PyTables का उपयोग कर डिस्क (अद्यतन पंक्तियों) पर वापस लिखना चाहता हूं। मैं इसे साफ करने का कोई तरीका नहीं समझ सका। क्या आप कृपया मुझे बता सकते हैं कि इसे पूरा करने का सबसे अच्छा तरीका क्या होगा?पीईटीबल्स बैच

मेरे डेटा:

Symbol, date, price, var1, var2 
abcd, 1, 2.5, 12, 12.5 
abcd, 2, 2.6, 11, 10.2 
abcd, 3, 2.45, 11, 10.3 
defg, 1,12.34, 19.1, 18.1 
defg, 2, 11.90, 19.5, 18.2 
defg, 3, 11.75, 21, 20.9 
defg, 4, 11.74, 22.2, 21.4 

मैं, खेतों var1 और var2 पंक्तियों को एक सरणी के रूप में प्रत्येक प्रतीक के अनुरूप पढ़ कुछ प्रसंस्करण करते हैं और अद्यतन करने के लिए करना चाहते हैं। मैं पहले से ही सभी प्रतीकों को जानता हूं ताकि मैं उनके माध्यम से लूप कर सकूं।

rows_array = [row.fetch_all_fields() for row in table.where('Symbol == "abcd"')] 

मैं चाहते हैं एक और समारोह var1 और var2 के लिए मूल्यों की गणना और प्रत्येक रिकॉर्ड के लिए यह अद्यतन करेगा जो करने के लिए rows_array पारित करने के लिए: मैं कुछ इस तरह की कोशिश की। कृपया ध्यान दें कि var1, var2 मूविंग एवरेज की तरह हैं इसलिए मैं उन्हें एक इटरेटर के अंदर गणना करने में सक्षम नहीं होगा और इसलिए पंक्तियों के पूरे सेट की आवश्यकता सरणी होगी।

मैं जो कुछ भी मुझे rows_array का उपयोग करने की आवश्यकता है उसकी गणना करने के बाद, मुझे यकीन नहीं है कि इसे डेटा पर वापस कैसे लिखना है, यानी नए गणना मूल्यों के साथ पंक्तियों को अपडेट करें। पूरे तालिका अपडेट करते समय, मैं इस का उपयोग करें:

table.cols.var1[:] = calc_something(rows_array) 

हालांकि, जब मैं तालिका के केवल एक हिस्से को अपडेट करना चाहते हैं, मैं सबसे अच्छा तरीका यह करने के लिए नहीं कर रहा हूँ। मुझे लगता है कि मैं 'कहां' स्थिति को फिर से चला सकता हूं और फिर अपने कैल्स के आधार पर प्रत्येक पंक्ति को अपडेट कर सकता हूं लेकिन यह तालिका को पुन: सहेजने के समय की बर्बादी जैसा लगता है।

आपके सुझावों की सराहना कर रहे हैं ...

धन्यवाद, -e

उत्तर

10

अगर मैं अच्छी तरह से समझते हैं, आगे क्या करना चाहिए कि आप क्या चाहते:

condition = 'Symbol == "abcd"' 
indices = table.getWhereList(condition) # get indices 
rows_array = table[indices] # get values 
new_rows = compute(rows_array) # compute new values 
table[indices] = new_rows # update the indices with new values 

आशा इस मदद करता है

+0

धन्यवाद, फ्रांसेस्क। यह अच्छी तरह से काम करता है। मैं दूसरी कहां अनुमान लगा रहा हूं कि सूची फिर से स्कैन करेगा? मैंने कोड को संशोधित किया ताकि मैं पहले इंडेक्स प्राप्त कर सकूं और फिर इंडेक्स का उपयोग करके तालिका मानों को पढ़ सकूं और इसे फिर से इंडेक्स का उपयोग करके अपडेट कर सकूं। – Ecognium

+0

ओह, निश्चित रूप से। मैंने आपके पिछले उत्तर को आपके सुझाव का पालन करने के लिए संपादित किया है। – FrancescAlted

+0

पंक्ति_arrays के माध्यम से लूपिंग के बजाय, मैं सीधे कॉलम प्राप्त करना चाहता था और मैंने यह कोशिश की: price = table.cols.price [indices]। मुझे यह त्रुटि मिलती है: फ़ाइल "/Library/Python/2.6/site-packages/tables/table.py", लाइन 3063, __getitem__ में "% s 'कुंजी प्रकार इस संदर्भ में मान्य नहीं है"% key) TypeError : '[0 1 2 3 4 5 6 7 8 9 10]' इस संदर्भ में कुंजी प्रकार मान्य नहीं है इंडेक्स से पूरे कॉलम को निकालने के तरीके पर कोई सुझाव? – Ecognium