Python应用迭代linregress

时间:2018-09-30 21:34:38

标签: python python-3.x pandas numpy jupyter-notebook

我正在努力获得以下输出。

首先设置数据集:

enter image description here

我一直在使用以下代码来获取输出,但是每次都失败:

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

df=pd.read_excel('I:/Python/Data/Copy.xlsx')

grouped = df.groupby('Test Event')

for test_event, g in grouped:
    print('Test Event: {}'.format(test_event))
df_np=np.array(g)

x=np.array(df_np[:,3],dtype=float)
y=np.array(df_np[:,4],dtype=float)

for i, pair in enumerate(zip(x, y)):

    slope, intercept, r_value, p_value, std_err = stats.linregress(np.delete(x,i),np.delete(y,i))

    print('slope', slope, 'for data without pair', i, ':', pair) 

这是需要的:对于每个测试事件,都有一个唯一的ID。对于每个唯一ID,都有一个斜率。图像的“注释”部分中提到了获得坡度的方式。

我该如何解决这个问题?

在jupyter笔记本中,所需的最终输出如下:

它只为测试事件111和112提供“不带对的数据9”的输出。

我需要“无对数0的数据”,...,“无对数9的数据”作为每个事件的输出。 Output

1 个答案:

答案 0 :(得分:1)

您需要按以下方式缩进代码,以确保循环中存在循环:

for test_event, g in grouped:
    # loop over the groups
    print('Test Event: {}'.format(test_event))
    df_np=np.array(g)
    x=np.array(df_np[:,3],dtype=float)
    y=np.array(df_np[:,4],dtype=float)
    for i, pair in enumerate(zip(x, y)):
        # loop over the rows within each group
        slope, intercept, r_value, p_value, std_err = stats.linregress(np.delete(x,i),np.delete(y,i))
        print('slope', slope, 'for data without pair', i, ':', pair)

一种更简单的方法(无需转换为数组和zip)将是:

grouped = df.groupby('Test Event')
df["slope"] = np.NaN
for test_event, g in grouped:
    print('Test Event: {}'.format(test_event))
    for i in g.index:
        others = g.loc[g.index != i, ["x-axis", "y-axis"]]
        slope, intercept, r_value, p_value, std_err = stats.linregress(others)
        print ("slope", slope, 'for data without pair', i)
        df.loc[i, "slope"] = slope

这还将斜率添加到数据框中。