#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)
Если у вас есть лучший метод, мы будем только рады.