Результаты линейной регрессии в столбцах для разных строк - PullRequest
0 голосов
/ 14 декабря 2018

Моя цель - сделать регрессионный анализ для нескольких строк и сохранить результаты в отдельных столбцах, прикрепленных к моему фрейму данных, в который я загружаю.

Итак, я нашел следующий код, который дает мне результаты с однимx и одна переменная y.

import pandas as pd
import numpy as np
import scipy.stats
df = pd.read_excel("Directory\File.xlsx")
x = df.iloc[0,:]
y= df.iloc[1,:]
scipy.stats.linregress(x,y)

Это дает мне следующие результаты:

result

Исходный кадр данных для этого примера содержит3 строки и 24 столбца.

[1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24];

[100 10 61 5529 77 61 42 70 73 98 62 25 86 49 68 68 26 35 62 100 56 10 97];

[57 89 25 89 48 56 67 17 98 10 25 90 17 52 85 56 18 20 74 97 82 8263 45 87]

Нулевой строкой всегда является ось X: независимая переменная.Строки 1 и 2 являются зависимой переменной, таким образом, у-ось.Теперь я хочу выполнить этот регрессионный анализ, и для каждой строки (начиная со строки 1) он должен рассчитать результаты и добавить их в кадр данных.Таким образом, в конце у нас будет 5 дополнительных столбцов с наклоном, перехватом, значением r, значением p и stderr на строку.

Я попытался перебрать каждую строку с этим фрагментом кода (это создает новый фрейм данныхчто тоже нормально):

def linreg(row):
z = scipy.stats.linregress(x,y)
linreg_df = pd.DataFrame(z)
return(linreg_df)

full_dataframe = None

for index,row in df.iterrows():
z = linreg(index)
if full_dataframe is None: 
    full_dataframe = z.T
else: 
    full_dataframe = full_dataframe.append([z.T])


full_dataframe.to_excel('Directory\\File.xlsx')

Но это дает мне следующую ошибку:

error

Есть кто-нибудь, кто мог бы сказатьмне, что я делаю неправильно и что такое правильное решение?

Спасибо,

Стивен

1 Ответ

0 голосов
/ 14 декабря 2018

Используйте метод _asdict для преобразования результатов линейного перехода в OrderedDictionary, а затем вы можете использовать этот словарь в конструкторе для кадра данных pandas:

Вот MCVE:

import pandas as pd
import scipy.stats


X = [1,2,3,4,7]
y = [2,4,6,9,13]

r = scipy.stats.linregress(X,y)

df = pd.DataFrame(r._asdict(), index=[0])
print(df)

Вывод:

      slope  intercept    rvalue    pvalue   stderr
0  1.858491   0.481132  0.989413  0.001306  0.15739

Обновлено:

from io import StringIO
import pandas as pd
import scipy.stats

txt = StringIO("""1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
100 10 61 55 29 77 61 42 70 73 98 62 25 86 49 68 68 26 35 62 100 56 10 97
57 89 25 89 48 56 67 17 98 10 25 90 17 52 85 56 18 20 74 97 82 63 45 87""")
df = pd.read_csv(txt, sep='\s', header=None, engine='python')

fullll_dataframe = pd.DataFrame()

for i,row in df.iloc[1:,:].iterrows():
    r = scipy.stats.linregress(df.iloc[0, :], row)
    full_dataframe = pd.concat([full_dataframe,pd.DataFrame(r._asdict(), index=[i])])

print(full_dataframe)

Вывод:

      slope  intercept    rvalue    pvalue    stderr
1  0.083478  58.123188  0.021827  0.919366  0.815204
2  0.399565  51.963768  0.096415  0.654034  0.879439
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...