मुझे एक्स, वाई, जेड दिशा में कई इकाइयों के लिए डेटाफ्रेम डेटा मिला है, जो समय के साथ इंडेक्स के समान है:

df = pd.DataFrame(index=range(0,10), columns=pd.MultiIndex.from_tuples([("foo","x"),("foo","y"),("foo","z"),("bar","x"),("bar","y"),("bar","z")]), data=np.random.rand(10,6))
        foo                           bar                    
          x         y         z         x         y         z
0  0.972557  0.711319  0.190318  0.134453  0.903132  0.847353
1  0.922516  0.369936  0.940566  0.847049  0.180356  0.925252
2  0.843484  0.817282  0.245280  0.614433  0.959601  0.571053
3  0.409911  0.643583  0.723806  0.652375  0.532277  0.278601
4  0.322778  0.270078  0.822233  0.224622  0.808430  0.786399
5  0.323539  0.009899  0.175882  0.897813  0.287025  0.648503
6  0.180822  0.199223  0.573267  0.739941  0.479798  0.048885
7  0.961212  0.085247  0.092500  0.629304  0.582119  0.788289
8  0.960532  0.558652  0.676768  0.235705  0.255208  0.232676
9  0.213508  0.042688  0.238658  0.685202  0.760240  0.860439

मुझे एक्स, वाई, जेड डेटा को घुमाने और पुराने मानों को नए के साथ बदलने के लिए प्रत्येक इकाई के लिए अलग-अलग रोटेशन मैट्रिक्स का उपयोग करना है। वर्तमान में प्रत्येक इंडेक्स व्यक्ति के लिए ऐसा किया जाता है:

for entity in df.columns.levels[0]:
    R = np.matrix("[-0.70710678,-0.70710678,0.];[0.70710678,-0.70710678,0.];[0.,0.,1.]")
    for row in df.index:
                try:
                    vector = np.array(
                        [[df.loc[row, (entity, x)]], [df.loc[row, (entity, y)]], [df.loc[row, (entity, z)]]])
                    rvector = R.dot(vector)
                    df.loc[row, (entity, x)] = complex(rvector[0])
                    df.loc[row, (entity, y)] = complex(rvector[1])
                    df.loc[row, (entity, z)] = complex(rvector[2])
                except ValueError as e:
                    logger.error(e)
                    logger.debug(f"{vector} {R} {row}")

मैंने एक सरल/तेज दृष्टिकोण के साथ आने की कोशिश की। मुझे १७४ संस्थाओं और १२५५ समय चरणों के साथ एक डेटाफ्रेम मिला है, मेरे वर्तमान कार्यान्वयन के साथ एक इकाई के लिए गणना करने में लगभग १ मिनट का समय लगता है। जहां एक ही समय में छेद तीन स्तंभों पर काम किया जाएगा, लेकिन मैं इसका पता लगा सकता था।

संपादित करें: जोड़ा गया उदाहरण मैट्रिक्स

0
PapaTim68 18 अक्टूबर 2018, 12:09

1 उत्तर

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

तो कुछ और कोशिश करने के बाद समाधान मिला:

    entity_data = df.loc[:, entity]
    data = R.dot(entity_data.transpose()).transpose()
    entity_data_new = pd.DataFrame(data=data, index=entity_data.index,
                                   columns=entity_data.columns)
    df.loc[:, entity] = entity_data_new.values

यह कंप्यूटिंग समय को लगभग रैखिक समय तक कम कर देना चाहिए

1
PapaTim68 18 अक्टूबर 2018, 13:01