मैं सोच रहा हूं कि एक निश्चित श्रृंखला के साथ पायथन में चल रहे सहसंबंध को करने का कोई तेज़ तरीका है या नहीं? मैंने पंडों का उपयोग करने की कोशिश की है और उदाहरण के लिए: df1.rolling(4).corr(df2)। हालाँकि, इसके लिए समान लंबाई के दो डेटाफ़्रेम की आवश्यकता होती है। क्या उपरोक्त पंडों के उदाहरण के समान करने का कोई तरीका है, लेकिन एक डेटाफ़्रेम को ठीक किया जा रहा है?

स्पष्ट करने के लिए, मैं नीचे df2 और df1 में मानों के बीच सहसंबंध गुणांक की गणना करना चाहता हूं।

उदाहरण: df2 और df1.loc के बीच पहला सहसंबंध [0:3] df2 और df1.loc के बीच दूसरा सहसंबंध [1:4]

आदि।

मैंने लूप बनाकर ऐसा करने में कामयाबी हासिल की है। हालांकि, बड़े डेटाफ्रेम के साथ काम करते समय मुझे यह अक्षम लगता है।

df1 = pd.DataFrame([1,3,2,4,5,6,3,4])
df2 = pd.DataFrame([1,2,3,2])
2
Vichtor 16 जुलाई 2020, 23:22

1 उत्तर

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

आप pandas.DataFrame.rolling< का इस्तेमाल कर सकते हैं /a>जो लौटता है pandas.core.window.Rolling जिसमें लागू करें विधि। फिर आप apply() किसी भी फ़ंक्शन को पास कर सकते हैं जो आपके इच्छित सुधार की गणना करता है।

उदाहरण

import pandas as pd
from scipy.stats import pearsonr 
import numpy as np 


df1 = pd.DataFrame([1,3,2,4,5,6,3,4,1,2,3,2,2,3,2,5,1,2,1,2,8,8,8,8,8,8,8])
df2 = pd.DataFrame([1,2,3,2])

CORR_VALS = df2[0].values
def get_correlation(vals):
    return pearsonr(vals, CORR_VALS)[0]

df1['correlation'] = df1.rolling(window=len(CORR_VALS)).apply(get_correlation)

  • ध्यान दें कि df1.rolling() में window तर्क की लंबाई उसी सरणी के समान होनी चाहिए, जिसके विरुद्ध आप सहसंबंध की गणना कर रहे हैं।

यह आउटपुट

In [5]: df1['correlation'].values
Out[5]:
array([        nan,         nan,         nan,  0.31622777,  0.31622777,
        0.71713717,  0.63245553, -0.63245553, -0.39223227, -0.63245553,
       -0.63245553,  1.        ,  0.        , -0.70710678,  0.81649658,
        0.        ,  0.47809144, -0.23570226, -0.64699664,  0.        ,
        0.        ,  0.7570333 ,  0.76509206,  0.11043153, -0.77302068,
       -0.11043153,  0.86164044])

जो इस तरह दिखेगा:

enter image description here

1
np8 17 जुलाई 2020, 00:36