计算pandas中列中单个单元格的线性回归的问题

时间:2017-07-07 14:35:32

标签: python pandas

我正在尝试根据列中的先前数据为单个空单元格实现线性回归计算。由于我不懂如何使用python库,我按步骤编写了整个计算。

这是我的数据框:

index   value    delta
-52       0      42517
-51       0      42524
-50      216     42531
-49      345     42538
-48      237     42545
...
 -2      367     42862
 -1      310     42869
  0      226     42876
  1      NaN     42883
  2      NaN     42890
...
 49      NaN     43213
 50      NaN     43220
 51      NaN     43227
 52      NaN     43234

index = 0及更低的值始终为52。上面可能有不同的数字,但我事先知道,在这个例子中他们是52。 未知值始终从index = 1开始。

对于单个值,我正在计算(这里我计算列delta dd = 42883中的值):

x = dftest['delta']
y = dftest['value']
x_mean= np.mean(x)
y_mean = np.mean(y)
x_std = np.std(x)
y_std = np.std(y)
corr = np.corrcoef(y, x)[1,0]
slope = corr * y_std / x_std
intercept = y_mean - slope * x_mean
n_vl = intercept + slope * dd

所以他计算,但我不明白如何编写一个循环,以便他为所有空单元格(从index = 1开始)执行此操作,同时考虑先前计算的值。

我尝试使用第一个响应here中的代码并对其进行更改,但它不起作用。

部分代码:

vl = dftest['value'].values
delta =  dftest['delta'].values
for index in range(0, vl.shape[0]):
    if np.isnan(vl[index]):
        x = delta.take(range(index-52,index+1),mode='wrap')
        y = vl.take(range(index-52,index+1),mode='wrap')
        y1 = np.nanmean(vl.take(range(index-52,index+1),mode='wrap'))
        y2 = np.nanstd(vl.take(range(index-52,index+1),mode='wrap'))
        x1 = np.nanmean(delta.take(range(index-52,index+1),mode='wrap'))
        x2 = np.nanstd(delta.take(range(index-52,index+1),mode='wrap'))
        corr = np.corrcoef(y, x)[1,0] 
        slope = corr * y2 / x2
        intercept = y1 - slope * x1
        n_vl = intercept + slope * dd
print (y)
print (x)        
print (y1)
print (y2)
print (x1)
print (x2)
print (corr)
print (slope)
print (intercept)
print (n_vl)

但它的值低于index = 0,而不是高于[ 226. nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan nan] [42876 42883 42890 42897 42904 42911 42918 42925 42932 42939 42946 42953 42960 42967 42974 42981 42988 42995 43002 43009 43016 43023 43030 43037 43044 43051 43058 43065 43072 43079 43086 43093 43100 43107 43108 43115 43122 43129 43136 43143 43150 43157 43164 43171 43178 43185 43192 43199 43206 43213 43220 43227 43234] 226.0 0.0 43055.8490566 104.701263481 nan nan nan nan 。我不知道如何更改它以及如何编写它以便它为每个空单元格计数。

这就是我在输出中得到的一个值(来自我的循环代码)。

CHECK

我已经坚持了很长时间,不能前进,我真的需要帮助。

2 个答案:

答案 0 :(得分:0)

只做

dftest['value'].fillna(52)

将填充NaN列中编号为value的所有52。 如果您需要更加确定仅在NaN(换句话说,您希望在index <= 0列中NaN}填写value时才填写index > 0&#39} dftest.loc[index <= 0, 'value'].fillna(52) )然后做:

 import xmltodict

#from xml.dom import minidom

#doc = minidom.parse("staff.xml")



data = """<Azimuth>
      <COL_STEP unit="m">5000</COL_STEP>
      <ROW_STEP unit="m">5000</ROW_STEP>
      <Values_List>
        <VALUES>59.9563 53.0871 44.4595 33.8743 21.5482 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES>
        <VALUES>58.4469 51.1869 42.099 31.0545 18.418 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES>
        <VALUES>56.8537 49.1809 39.623 28.139 15.2538 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES>
        <VALUES>55.1672 47.0649 37.0345 25.1409 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES>
        <VALUES>53.3851 44.8373 34.3343 22.0718 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES>
        <VALUES>51.5013 42.4952 31.5308 18.9484 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES>
        <VALUES>49.5128 40.0378 28.6308 15.7878 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES>
        <VALUES>47.4157 37.4668 25.6447 12.609 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES>
        <VALUES>45.2056 34.7844 22.5855 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES>
        <VALUES>42.8812 31.9968 19.4688 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES>
        <VALUES>40.442 29.1107 16.3121 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES>
        <VALUES>37.8884 26.1373 13.134 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES>
        <VALUES>35.2231 23.0883 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES>
        <VALUES>32.4513 19.9792 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES>
        <VALUES>29.5804 16.8268 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES>
        <VALUES>26.6194 13.6499 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES>
        <VALUES>23.5805 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES>
        <VALUES>20.479 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES>
        <VALUES>17.3318 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES>
        <VALUES>14.1568 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES>
        <VALUES>NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES>
        <VALUES>NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES>
        <VALUES>NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN</VALUES>
      </Values_List>
    </Azimuth>"""

data = xmltodict.parse(data, encoding='utf-8')
p=data['Azimuth']['Values_List']
print(type(p))

import dict_digger

print(dict_digger.dig(data, 'Values_List'))

请记住,如果您觉得需要在Pandas中使用循环,那么您很可能做错了。

答案 1 :(得分:0)

因此,我决定使用基于已知数据的线性回归填充列中的空单元格。

import statsmodels.formula.api as smf
#Here I choose the known data and fit the model
smresults = smf.ols('value ~ delta', df.iloc[:53]).fit()
smresults.summary()
#Here I fill empty cells using the model
df.value[53:] = smresults.predict(df.iloc[53:])

这是我设法获得的最佳解决方案。