【问题标题】:Python applying iterative linregress [closed]Python应用迭代linregress [关闭]
【发布时间】:2019-03-06 01:09:57
【问题描述】:

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

数据集优先:

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

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 notebook中,最终需要的输出如下:

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

我需要“没有第 0 对的数据”、...、“没有第 9 对的数据”作为每个事件的输出。

【问题讨论】:

  • 你的代码有什么输出?
  • @Stuart,我添加了使用 Jupyter notebook 获得的输出。
  • @Stuart,从输出图像可以看出,代码只查看第 9 对事件 111 和事件 112。我期待它从第 0 对到第 9 对。跨度>
  • 检查是否为 xy 选择了正确的列 - 请记住编号从 0 开始。它可能应该是 x=np.array(df_np[:,3]...y=np.array(df_np[:,4]...。还要检查你的表格(上面似乎丢失了)
  • 我的意思是上面的代码中没有显示缩进(制表符)。我假设您在实际使用的代码中有缩进。请尝试在上面的代码中添加缩进,使其匹配。这可能是问题的根源。

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


【解决方案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

这也将斜率添加到数据框。

【讨论】:

  • 这个解决方案确实有效。是的,第二个解决方案比我尝试的第一个解决方案要好得多。要编辑哪部分代码,如果现在不是 1 个点,我需要删除两个点并计算其他 8 个点的斜率?
  • 我的意思是对于事件 111,如果我删除点 0,1;0,2;0,3;...;0,9 那么我得到 10 个斜坡。 1,2;1,3;1,4...1,9 也需要进行类似的操作。如果这超出了当前问题的范围,我将创建一个新问题。
  • 使用进一步的嵌套循环for j in g.index:,或使用例如itertools.combinations(g.index, len(g.index)-2)) 获取所有索引组合,每次删除两个点。如果您需要更多详细信息,请提出新问题。
  • 是的,我在问一个新问题,因为在这里解释可能会很长。再次感谢所有帮助!
  • 提出了新问题。
猜你喜欢
  • 2019-03-06
  • 1970-01-01
  • 2016-06-04
  • 2014-06-30
  • 2019-08-20
  • 2014-09-23
  • 1970-01-01
  • 2012-10-30
  • 1970-01-01
相关资源
最近更新 更多