Неправильный вывод в кадре данных: копирование расчета для каждой строки отдельно - PullRequest
0 голосов
/ 08 декабря 2018

Я ищу модификацию функции ниже, чтобы вычисление автокорреляции выполнялось для каждой строки, а не только для первой строки.

Ниже приводится функция, которую я использую:

import pandas as pd
import numpy as np
df = pd.read_excel("directory\\file.xlsx")

def autocorr(x, t):
     y = np.corrcoef(np.array([x[0:len(x)-t], x[t:len(x)]]))
     return y

df1 = df.copy(deep=True) 

for index,row in df1.iterrows():
     df1["output1"] = autocorr(df.T[0], 1)[0, 1]
     df1["output2"]= autocorr(df.T[0], 2)[0, 1]
     df1["output3"]= autocorr(df.T[0], 3)[0, 1]
     df1["output4"]= autocorr(df.T[0], 4)[0, 1]
     df1["output5"]= autocorr(df.T[0], 5)[0, 1]
     df1["output6"]= autocorr(df.T[0], 6)[0, 1]
     df1["output7"]= autocorr(df.T[0], 7)[0, 1]
     df1["output8"]= autocorr(df.T[0], 8)[0, 1]
     df1["output9"]= autocorr(df.T[0], 9)[0, 1]
     df1["output10"]= autocorr(df.T[0], 10)[0, 1]
     df1["output11"]= autocorr(df.T[0], 11)[0, 1]
     df1["output12"]= autocorr(df.T[0], 12)[0, 1]



df1

Но он продолжает давать следующий результат (таким образом, результат для первой строки, скопированный во второй, третий, .. ряд):

result

Я пробовал все, но не могу сделать это для каждого ряда отдельно.

1 Ответ

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

Вы пытались использовать встроенную функцию автокорра от Pandas?

https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.autocorr.html

import pandas as pd
import numpy as np
df = pd.DataFrame(np.array([np.arange(1,10), np.arange(10, 1, -1)]), index=['a', 'b'])
     df
    0  1  2  3  4  5  6  7  8
a   1  2  3  4  5  6  7  8  9
b  10  9  8  7  6  5  4  3  2
df.loc['a'].autocorr(lag=1)

ИЛИ df.T['a'].autocorr(lag=1)

В вашем коде похоже, что вы посылаете одну и ту же строку каждый раз.

df.loc[0] == df.T[0]  # The first row of the DataFrame

Вы перебираете строки DataFrame, но не используете свои итераторы

autocorr(df.T[0], 1)[0, 1]

Если вы предпочитаете использовать свою функцию, попробуйте изменить ее на

autocorr(row, 1)[0, 1]

, вместо этого вы можете использовать:

row.autocorr(lag=t)

Поскольку вы выполняете итерации по строкам DataFrame, переменная index будет содержать индекс строки из DF, а переменная row будет содержать тип Series всей строки.

Другая проблема:

df1['outpu1'] = value

Таким образом, вы присваиваете значение всему столбцу.
Если столбец уже существует, вы можете использовать loc:

df.loc[row_index, col_index] = value

Если столбец не существует, вы можете сначала вычислить весь столбец и сохранить его как серию, а затем назначить его всему списку или просто добавить его перед запуском цикла

df.insert(loc=0, column='output1' value='np.nan')
...