मैं यह समझने की कोशिश कर रहा हूं कि कैसे pandas.rolling_corr वास्तव में रोलिंग सहसंबंधों की गणना करता है। अब तक मैं इसे हमेशा numpy के साथ करता रहा हूं। मैं गति और उपयोग में आसानी के कारण पांडा का उपयोग करना पसंद करता हूं, लेकिन मैं रोलिंग सहसंबंध नहीं प्राप्त कर सकता जैसा कि यह करता था।

मैं दो संख्यात्मक सरणियों से शुरू करता हूं:

c = np.array([1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1])
d = np.array([8,9,8])

अब मैं क्रॉस-सहसंबंध की गणना करना चाहता हूं जिसके लिए मेरी सरणी सी की लंबाई-3-विंडो। मैं एक रोलिंग विंडो फ़ंक्शन को परिभाषित करता हूं:

def rolling_window(a, window):
    shape = a.shape[:-1] + (a.shape[-1] - window + 1, window)
    strides = a.strides + (a.strides[-1],)
    return np.lib.stride_tricks.as_strided(a, shape=shape, strides=strides)

और मेरी प्रत्येक उत्पन्न विंडो और दूसरे मूल डेटासेट के बीच सहसंबंध की गणना करें। यह दृष्टिकोण ठीक काम करता है:

for win in rolling_window(c, len(d)):
    print(np.correlate(win, d))

आउटपुट:

[50]
[75]
[100]
[125]
[150]
[175]
[200]
[209]
[200]
[175]
[150]
[125]
[100]
[75]
[50]

अगर मैं इसे पांडा के साथ हल करने का प्रयास करता हूं:

a = pd.DataFrame([1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1])
b = pd.DataFrame([8,9,8])

कोई फर्क नहीं पड़ता अगर मैं DataFrame रोलिंग_कोर का उपयोग करता हूं:

a.rolling(window=3, center=True).corr(b)

या पांडा रोलिंग_कोर:

pd.rolling_corr(a, b, window=1, center=True)

मुझे बस NaN का एक गुच्छा मिलता है:

      0
0   NaN
1   0.0
2   NaN
3   NaN
4   NaN
5   NaN
6   NaN
7   NaN
8   NaN
9   NaN
10  NaN
11  NaN
12  NaN
13  NaN
14  NaN
15  NaN
16  NaN

क्या कोई मुझे हाथ दे सकता है? मैं पांडा डेटाफ़्रेम को परिवर्तित करने से प्राप्त सुन्न सरणी को समतल करके समस्या को हल करने में सक्षम हूं

a.values.ravel()

हालांकि, मैं पूरी तरह से पांडा के साथ गणना को हल करना चाहता हूं। मैंने प्रलेखन की खोज की है लेकिन मुझे वह उत्तर नहीं मिला है जिसकी मुझे तलाश है। मुझे क्या याद आ रहा है या समझ में नहीं आ रहा है?

पहले से ही बहुत - बहुत धन्यवाद।

डी।

3
mosegui 19 पद 2017, 18:42

1 उत्तर

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

आप जिस गणना को करने का प्रयास कर रहे हैं, उसे निम्न डेटाफ़्रेम पर संचालन के रूप में माना जा सकता है:

pd.concat([a, b], axis=1)
    0   0
0   1   8
1   2   9
2   3   8
3   4 NaN
4   5 NaN
5   6 NaN
6   7 NaN
7   8 NaN
8   9 NaN
9   8 NaN
10  7 NaN
11  6 NaN
12  5 NaN
13  4 NaN
14  3 NaN
15  2 NaN
16  1 NaN

यदि आप विंडो = 3 का उपयोग कर रहे हैं, तो यह b में पहले तीन मानों को a में पहले 3 मानों के साथ जोड़ता है, बाकी को NaN के साथ छोड़ देता है, और मान को केंद्र में रखता है। खिड़की का (केंद्र = सत्य)।

तुम कोशिश कर सकते हो:

pd.rolling_apply(a, window=3, func=lambda x: np.correlate(x, b[0]))

आउटपुट:

      0
0   NaN
1   NaN
2    50
3    75
4   100
5   125
6   150
7   175
8   200
9   209
10  200
11  175
12  150
13  125
14  100
15   75
16   50

आप चाहें तो यहां केंद्र = सत्य भी जोड़ सकते हैं।

(मैं पांडा 0.17.0 का उपयोग कर रहा हूँ)

2
Pretty Speeches 4 फरवरी 2018, 19:52