2010-11-12 13 views
9

मैं पाइथन के लिए नया हूं और शायद मेरे कोड में डेटा स्टोर करने के 'सर्वश्रेष्ठ' तरीके के बारे में एक बहुत ही बुनियादी सवाल है। कोई सलाह बहुत सराहना की! वर्ष 1961 से 1990 तक चला जाता हैसबसे उपयुक्त डेटा संरचना (पायथन)

Scenario,Year,Month,Value 
1,1961,1,0.5 
1,1961,2,0.7 
1,1961,3,0.2 
etc. 

मेरे परिदृश्य 1 से 100 तक चलाने के मूल्यों, और महीने के 1 से 12. मेरी फ़ाइल इसलिए है को जाता है:

मैं निम्न स्वरूप में एक लंबे csv फ़ाइल है 100 * 2 9 * 12 = 34800 पंक्तियां, प्रत्येक एक संबंधित मूल्य के साथ।

मैं इस फ़ाइल को किसी प्रकार की पायथन डेटा संरचना में पढ़ना चाहता हूं ताकि मैं 'परिदृश्य', 'वर्ष' और 'माह' निर्दिष्ट करके 'मूल्य' तक पहुंच सकूं। कृपया ऐसा करने का सबसे अच्छा तरीका क्या है (या विभिन्न विकल्प क्या हैं)?

मेरे सिर में मैं इस डेटा को परिदृश्य, वर्ष और महीना के लिए अक्ष के साथ 'संख्या क्यूबोइड' के रूप में सोचता हूं, ताकि प्रत्येक मान समन्वय (परिदृश्य, वर्ष, महीना) पर स्थित हो। इस कारण से, मैं इन मानों को 3 डी numpy सरणी में पढ़ने और सूचकांक के रूप में परिदृश्य, वर्ष और महीने का उपयोग करने का प्रयास करने के लिए प्रेरित हूं। क्या यह एक समझदार बात है?

मुझे लगता है कि मैं भी एक शब्दकोश कर सकता है जहां कुंजी

str(Scenario)+str(Year)+str(Month) 

की तरह कुछ इस बेहतर होगा रहे हैं? क्या अन्य विकल्प हैं?

('बेहतर' से मुझे लगता है कि मेरा मतलब है 'पहुंचने के लिए तेज़', हालांकि यदि एक विधि किसी अन्य की तुलना में बहुत कम स्मृति गहन है तो उसे इसके बारे में जानना अच्छा होगा)।

बहुत बहुत धन्यवाद!

+0

वाह - क्या एक शानदार साइट है! मूल प्रश्न लिखने के लिए मुझे 5 लोगों ने मुझे कम समय में महान जवाब दिए। धन्यवाद! – JamesS

उत्तर

8

मैं टुपल्स के एक नियम का उपयोग करता हूं। सरल, तेज़, और एक हैश-टेबल लुक-अप एक एकल मान पुनर्प्राप्त करने के लिए:

import csv 

reader = csv.reader(open('data.csv', 'rb')) 
header = reader.next() 
data = {} 

for row in reader: 
    key = tuple([int(v) for v in row[:-1]]) 
    val = row[-1] 
    data[key] = float(val) 

# Retrieve a value 
print data[1, 1961, 3] 
+0

धन्यवाद फमार्क। मैंने आपके कोड की प्रतिलिपि बनाई और चिपकाया और यह शानदार ढंग से काम किया। मैं किसी के लिए अपना कोड लिखने की उम्मीद नहीं कर रहा था, लेकिन आपने इसे वैसे भी किया :-) – JamesS

+2

पाइथन में एक साधारण समाधान लिखना हमेशा खुशी है :) – fmark

4

मैं डिस्क पर डेटा संग्रहीत करने के लिए sqlite3 का उपयोग करूंगा। आप SQL क्वेरी के माध्यम से पूर्ण डेटा सेट या सबसेट में पढ़ने में सक्षम होंगे। फिर आप उस डेटा को एक numpy सरणी या अन्य पायथन डेटा संरचना में लोड कर सकते हैं - जो भी कार्य के लिए सबसे सुविधाजनक है।

यदि आप एसक्लाइट का उपयोग करना चुनते हैं, तो यह भी ध्यान दें कि स्क्लाइट में TIMESTAMP डेटा प्रकार है। वर्ष और महीने को एक TIMESTAMP में जोड़ना एक अच्छा विचार हो सकता है। जब आप Python में TIMESTAMPs पढ़ते हैं, sqlite3 को स्वचालित रूप से TIMESTAMPs को datetime.datetime ऑब्जेक्ट्स में कनवर्ट करने के लिए कहा जा सकता है, जो कुछ बॉयलरप्लेट कोड को कम करेगा जो आपको अन्यथा लिखना होगा। इससे SQL क्वेरी बनाने में भी आसान हो जाएगा जो दो पंक्तियों के बीच सभी पंक्तियों के लिए पूछता है।

+0

चीयर्स unutbu, यह एक अच्छा विकल्प की तरह लगता है। मैं कुछ पढ़ूंगा और देख सकता हूं कि यह मेरी वर्तमान क्षमताओं में है या नहीं। इस बीच मैं नीचे से फ़मार्क के सुझाव का उपयोग करूंगा। – JamesS

+0

@ जेम्स: कोई समस्या नहीं। एसओ में आपका स्वागत है! – unutbu

0

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

2

sqlite एक अच्छा विकल्प है यदि आप प्रत्येक बार विभिन्न मानकों द्वारा अपने मूल्यों तक पहुंचने जा रहे हैं।

यदि ऐसा नहीं है, और आप हमेशा इस ट्रिपल (परिदृश्य, वर्ष, महीने) तक पहुंच पाएंगे, तो आप अपनी कुंजी के रूप में एक टुपल (अपरिवर्तनीय सूची) का उपयोग कर सकते हैं, और मूल्य आपके मूल्य के रूप में उपयोग कर सकते हैं।

कोड में यह दिखाई देगा:

d = {} 
d[1, 1961, 12] = 0.5 

या अधिक सामान्य पाश कोड में:

d[scenario, year, month] = value 

आप पर बाद में बस के साथ उपयोग कर सकते हैं:

print d[scenario, year, month] 

अजगर होगा स्वचालित रूप से आपके लिए टुपल बनाएं।

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