Итеративное удаление нескольких точек данных для linregress Pandas - PullRequest
0 голосов
/ 01 октября 2018

Сначала набор данных / первый вывод:

Dataset

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

Код, который я использую для удаления только одной точки данных, выглядит следующим образом:

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

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

grouped = df.groupby('TestEvent')
df["slope"] = np.NaN
for test_event, g in grouped:
    print('TestEvent: {}'.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

df.to_excel('trial4.xlsx')

С этим кодом выше (n = 1), я мог попасть на все 10 склонов, так как одна точка данных была удалена за один раз.__ Теперь мне нужно удалить две точки данных (или n> 1), сохраняя одну константу, как показано на рисунке для обеих последовательностей (111 и 112).

Каждая последовательность в конечном итоге даст 90 точек данных наклона (0, .... 9 повторений 9 раз).

Наконец, в выходном кадре данных это будет 90 значений наклона на последовательность.

Во всех окончательных данных будет 180 значений уклонов (для последовательностей 111 и 112)

Спасибо за чтение.Любая помощь по этому вопросу высоко ценится.

1 Ответ

0 голосов
/ 01 октября 2018

Используйте itertools.combinations, чтобы получить список строк, которые должны быть удалены в каждом случае.

import numpy as np
import pandas as pd
from itertools import combinations
...
slopes = pd.DataFrame(columns=["Test Event", "Removed 1", "Removed 2", "Slope"])    
for test_event, g in grouped:
    print('TestEvent: {}'.format(test_event))
    for rows_to_drop in combinations(g.index, 2):
        others = g[["x-axis", "y-axis"]].drop(list(rows_to_drop))
        slope, intercept, r_value, p_value, std_err = stats.linregress(others)
        print ("slope", slope, 'for data without rows', rows_to_drop)
        slopes.append({"Test Event": test_event,
                    "Removed 1": rows_to_drop[0],
                    "Removed 2": rows_to_drop[1],
                    "Slope": slope}])

Обратите внимание, что в последовательности будет только 45 уникальных значений, а не 90, потому что droping (0,1) это то же самое, что и сброс (1, 0).Это сохраняет уклоны в отдельном новом фрейме данных.

...