मैं अजगर में कुछ के साथ संघर्ष कर रहा हूँ ...

मेरे पास एक फ़ंक्शन है कि जब मैं एक तिथि इनपुट करता हूं, तो यह मुझे 30 कीमतों (प्रत्येक पंक्ति में एक) और इंडेक्स 30 नामों के साथ एक कॉलम वापस देता है।

[in] getPrice('14/07/2015')

[out]
apple   10
pear    20
orange  12
banana  23
etc... 

फलों की संख्या समान है। मैं जो करने की कोशिश कर रहा हूं, वह इस फ़ंक्शन को इन फलों की कीमत के साथ एक बड़ी फ़ाइल प्राप्त करने के लिए उन सभी दिनों के लिए है जो मेरे पास सूची में हैं। ज़िप फ़ंक्शन के साथ मैं वास्तव में यह नहीं समझता कि यह कैसे काम कर सकता है और परिशिष्ट फ़ंक्शन के साथ यह कीमत को 'ज़िपिंग' नहीं कर रहा है, जिसका अर्थ है कि यह हर बार इंडेक्स को फिर से बनाता है, आदि। कोई विचार? मेरे पास पहले से ही मेरी सभी तिथियों के साथ एक सूची है और सूचकांक सभी के साथ समान है, कोई अन्य फल प्रकट या गायब नहीं होता है।

यह कुछ ऐसा दिख सकता है

Def Alltogether():
    Alltogether = []
    x = HistoricalDates
    For _ in Historicaldates :
        k = getPrice.... 

और फिर मैं ब्लॉक कर देता हूँ...

मुझे अंत में कुछ पसंद है

print Alltogether

[out]
apple   10 40 60 20 ...
pear    20 20 20 20 ...
orange  12 13 14 29 ...
banana  23 14 41 54 ...
etc... 

मैं पांडा डेटाफ्रेम का उपयोग कर रहा हूं।

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

1
user6457870 30 मार्च 2017, 17:11

2 जवाब

सबसे बढ़िया उत्तर

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

import pandas as pd
def getPrice(date):
    return pd.Series(np.random.randn(5), index=['apple', 'pear', 'orange', 'nanner', 'etc...'])

और फिर हम इसमें कुछ तिथियों के साथ एक पांडा डेटाफ्रेम बना सकते हैं:

df = pd.DataFrame( pd.date_range('1/1/2017', periods=3, freq='D') )
df.columns=['MyDate'] # name the date column

यह हमें 3 तिथियों के साथ एक साधारण df देता है:

      MyDate
0 2017-01-01
1 2017-01-02
2 2017-01-03

पंक्तियों पर पुनरावृति करते समय किसी प्रकार के लागू फ़ंक्शन की तुलना में थोड़ा कम मुहावरेदार है, मुझे लगता है कि यह बहुत पठनीय और समझने में आसान है, बस तारीखों पर पुनरावृति करना, मूल्य प्राप्त करना, फिर उन्हें एक नए डेटाफ़्रेम में धकेलना और कॉलम को समान नाम देना तारीख। आपके प्रश्न को देखते हुए, मुझे संदेह है कि यह आपका वांछित आउटपुट है।

outputDF = pd.DataFrame() ## dump results into this df

for index, row in df.iterrows(): #iterate through every row of the date df
    outputDF[row.MyDate] = getPrice(row.MyDate) #shove values into output

जो हमें इस तरह एक सुंदर df देता है:

        2017-01-01  2017-01-02  2017-01-03
apple     0.150646    0.209668    0.398204
pear      0.131142    0.046473   -0.261545
orange    0.822508    0.456384   -0.774957
nanner   -0.996102   -0.260049   -0.558503
etc...    0.622459   -0.173556   -0.681957

उन स्थितियों को संभालने के बारे में आपकी टिप्पणी के अनुसार जहां तिथि अमान्य है, इसे संभालने के कुछ तरीके हैं। यदि getPrice() फ़ंक्शन खराब दिनांक पास करते समय कोई त्रुटि उत्पन्न करता है, तो आप try/except का उपयोग कर सकते हैं:

try:
    getPrice(date)
except:
    # do something else... return nulls maybe?

यदि खराब तिथियां एक त्रुटि नहीं फेंकती हैं, लेकिन इसके बजाय वे नल या एक खाली सूची लौटाती हैं, तो बस getPrice() पर कॉल करने के बाद उस स्थिति की जांच करें, लेकिन इसे डेटाफ्रेम में डालने से पहले।

0
JD Long 30 मार्च 2017, 18:39

क्या आपको इससे समस्या है? सूचियों की सूची को zip() में पास करने के लिए बस '*' का उपयोग करें। यहाँ एक उदाहरण:

L1=['L1-i1','L1-i2', 'L1-i3', 'L1-i4']
L2=['L2-i1','L2-i2', 'L2-i3', 'L2-i4']
L3=['L3-i1','L3-i2', 'L3-i3', 'L3-i4']

Lalltogether = [L1, L2, L3]

# in Python 3 you should use list() for zip(): 
print( list(zip( *Lalltogether )) )
print( list(zip(  L1, L2, L3   )) )

देता है:

[('L1-i1', 'L2-i1', 'L3-i1'), ('L1-i2', 'L2-i2', 'L3-i2'), ('L1-i3', 'L2-i3', 'L3-i3'), ('L1-i4', 'L2-i4', 'L3-i4')]

'*' के बारे में अधिक जानकारी के लिए देखें पायथन - सूची को फ़ंक्शन पैरामीटर के रूप में उपयोग करें

0
Community 23 मई 2017, 15:34