मैंने कुछ व्यापारिक रणनीतियों के लिए यह नेस्टेड डिक्शनरी बनाई है, कहते हैं:

{'Strategy1' :{'AAPL':'Strategy1_APPLE', 'MSFT':'Strategy1_MICROSOFT'}, 'Strategy2' :{'AAPL': 'Strategy2_APPLE', 'MSFT':'Strategy2_MICROSOFT'}}

मैंने पहले से ही रणनीति 1 या रणनीति 2 से संबंधित ट्रेडों की सूची के साथ एक डेटाफ्रेम बनाया है और उस जानकारी के साथ एक कॉलम बनाया है। फिर मैं जो करने की कोशिश कर रहा हूं वह शीर्ष स्तर की कुंजी (यानी रणनीति 1 या रणनीति 2) और नेस्टेड कुंजी (यानी एएपीएल या एमएसएफटी) दोनों के आधार पर एक नए कॉलम में मूल्यों को मैप कर रहा है। ताकि हर एक ट्रेड अपनी सही रणनीति और डेटाफ्रेम की एक ही पंक्ति में टिकर के साथ हो।

तो स्ट्रैटेजी 1 और एएपीएल के साथ डेटाफ्रेम में एक पंक्ति को नए कॉलम में स्ट्रैटेजी 1_एपीपीएलई का मान मिलता है, लेकिन स्ट्रैटेजी 2 और एएपीएल को स्ट्रैटेजी 2_एपीएलई मिलती है।

मैं दोनों मानचित्र() और लैम्ब्डा कार्यों के समूह के साथ खेल रहा हूं लेकिन मैं इसे काम पर नहीं ला सकता। मुझे लगता है कि यह बदसूरत छोरों का एक गुच्छा किए बिना संभव है और अगर बयान और मैं वास्तव में कुछ मदद का उपयोग कर सकता हूं कि यहां कैसे करना है।

संपादित करें: उदाहरण

तो यह वर्तमान में ऐसा दिखता है

  ticker Strategies
1   AAPL  Strategy1
2   MSFT  Strategy1
3   MSFT  Strategy2
4   AAPL  Strategy1
5   MSFT  Strategy2

और वांछित परिणाम यह है

  ticker Strategies          substrategy
1   AAPL  Strategy1      Strategy1_APPLE
2   MSFT  Strategy1  Strategy1_MICROSOFT
3   MSFT  Strategy2  Strategy2_MICROSOFT
4   AAPL  Strategy1      Strategy1_APPLE
5   MSFT  Strategy2  Strategy2_MICROSOFT

ध्यान दें कि तारों को जोड़ना या ऐसा कुछ मेरी वास्तविक समस्या के लिए काम नहीं करता है जहां सबस्ट्रेटी नाम बहुत अधिक जटिल होते हैं

4
wj wj 2 फरवरी 2020, 03:37

4 जवाब

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

एक विधि का प्रयोग करें:

def get_substrategy(t,s):    
    v = mydict[s][t] 
    return v

और एक लैम्ब्डा लागू करने से:

df['substrategy'] = df.apply(lambda x: foo(x['ticker'], x['Strategies']), axis=1)

वांछित परिणाम

   ticker   Strategies  substrategy
1   AAPL    Strategy1   Strategy1_APPLE
2   MSFT    Strategy1   Strategy1_MICROSOFT
3   MSFT    Strategy2   Strategy2_MICROSOFT
4   AAPL    Strategy1   Strategy1_APPLE
5   MSFT    Strategy2   Strategy2_MICROSOFT

नोट: रणनीति/टिकर मौजूद नहीं होने की स्थिति में अपने फ़ंक्शन में पकड़ने का प्रयास करना सुनिश्चित करें

नोट 2: फ़ंक्शन के बिना:

df['substrategy'] = df.apply(lambda x: mydict[x['Strategies']][x['ticker']], axis=1)

लेकिन आपको ऐसे परिदृश्य पर विचार करना होगा जहां रणनीति/टिकर मौजूद नहीं है।

1
adhg 2 फरवरी 2020, 05:29

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

import pandas as pd

# input nested dict in OP
source_dict = {'Strategy1' :{'AAPL':'Strategy1_APPLE', 'MSFT':'Strategy1_MICROSOFT'}, 'Strategy2' :{'AAPL': 'Strategy2_APPLE', 'MSFT':'Strategy2_MICROSOFT'}}
tmp_rows = []

# convert nested-dict to pandas friendly input format
for strategy in source_dict.keys():
    for ticker in source_dict[strategy].keys():
        substrategy = source_dict[strategy][ticker]
        tmp_rows.append({'ticker': ticker, 'Strategies': strategy, 'substrategy': substrategy})

# create output dataframe
output_dataframe = pd.DataFrame(tmp_rows)

print(output_dataframe.head(10))
0
Mike Mulhearn 2 फरवरी 2020, 05:32

यहां, पांडा का उपयोग करने का एक और तरीका। डेटाफ्रेम कन्स्ट्रक्टर, रीशेपिंग और merge के साथ:

d1 = (pd.DataFrame(d).rename_axis(index='ticker',columns='Strategies')
                     .stack()
                     .rename('substrategy')
                     .reset_index())
df.merge(d1)

आउटपुट:

|    | ticker   | Strategies   | substrategy         |
|---:|:---------|:-------------|:--------------------|
|  0 | AAPL     | Strategy1    | Strategy1_APPLE     |
|  1 | AAPL     | Strategy1    | Strategy1_APPLE     |
|  2 | MSFT     | Strategy1    | Strategy1_MICROSOFT |
|  3 | MSFT     | Strategy2    | Strategy2_MICROSOFT |
|  4 | MSFT     | Strategy2    | Strategy2_MICROSOFT |
1
Scott Boston 2 फरवरी 2020, 06:44

मैं reindex + MultiIndex का उपयोग करूंगा, d यहां आपका dict है

df['New']=pd.DataFrame(d).stack().reindex(pd.MultiIndex.from_frame(df)).values
df
  ticker Strategies                  New
1   AAPL  Strategy1      Strategy1_APPLE
2   MSFT  Strategy1  Strategy1_MICROSOFT
3   MSFT  Strategy2  Strategy2_MICROSOFT
4   AAPL  Strategy1      Strategy1_APPLE
5   MSFT  Strategy2  Strategy2_MICROSOFT
3
BENY 2 फरवरी 2020, 05:45