Панды применяют полифит к ряду по отношению к значению ряда

#python #pandas #dataframe #numpy

Вопрос:

Я новичок в мире Панд, и мне было трудно перестать думать последовательно.

У меня есть Series такой:

 df['sensor'].head(30)
0     6.8855
1     6.8855
2     6.8875
3     6.8885
4     6.8885
5     6.8895
6     6.8895
7     6.8895
8     6.8905
9     6.8905
10    6.8915
11    6.8925
12    6.8925
13    6.8925
14    6.8925
15    6.8925
16    6.8925
17    6.8925
Name: int_price, dtype: float64
 

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

Функция:

 def linear_trend(a,b):
    return np.polyfit([1,2],[a,b],1)

 

Приложение:

 a =  pd.Series(df_plot['sensor'].iloc[0] for x in range(len(df_plot.index))) 
df['ref'] = df_plot['sensor'].apply(lambda df_plot: linear_trend(a,df['sensor']))
 

Это возвращается TypeError: No loop matching the specified signature and casting was found for ufunc lstsq_m .

или это:

 a =  df_plot['sensor'].iloc[0]
df['ref'] = df_plot['sensor'].apply(lambda df_plot: linear_trend(a,df['sensor']))
 

Это возвращает ValueError: setting an array element with a sequence.

Как я могу решить эту проблему?

Комментарии:

1. Не могли бы вы объяснить свой желаемый результат немного подробнее? Я не совсем понимаю, как «вычислить полиномиальное соответствие первого значения всем остальным для поиска и усреднения».

2. Я хочу, чтобы средний наклон линий был результатом сопоставления первого значения со всеми остальными рядами, поэтому для X у меня всегда будет [1,2], а в : [5,1,2,3] я рассчитаю наклон (numpy.polyfit), предполагая, что [5, 1] равно Y, затем то же самое, но вместо [5, 1] я буду использовать [5, 2], а затем [5, 3], наконец, я хочу иметь среднее значение результата каждого наклона. Надеюсь, я выразился достаточно ясно 😉

Ответ №1:

Я смог решить свою проблему, выполнив следующие действия:

 a = pd.Series(data=(df_plot['sensor'].iloc[0] for x in range(len(df_plot.index))), name='sensor_ref')
df_poly = pd.concat([a,df_plot['sensor']],axis=1)
df_plot['slope'] = df_poly[['sensor_ref','sensor']].apply(lambda df_poly: linear_trend(df_poly['sensor_ref'],df_poly['sensor']), axis=1)

 

Если у вас есть лучший метод, мы будем только рады.