python вычитает dicts с несовпадающими ключами

#python #matplotlib #plot #line

#python #matplotlib #график #строка

Вопрос:

У меня есть две строки (x, y), сохраненные как dicts:

 # DICT = { time : voltage }
line1 = { 1.2 : 500, 1.4 : 600, 1.6 : 700}
line2 = { 1.3 : 550, 1.5 : 650, 1.7 : 750}
  

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

 plt.plot(line1.keys(), line1.values())
plt.plot(line2.keys(), line2.values())
plt.show()
  

Масштаб таков, что незначительные различия между строками не видны. Я хотел бы вычесть строки друг из друга, чтобы создать 3-ю строку, которая представляет эти различия. Если ключи совпадают идеально, я мог бы сделать что-то вроде:

 line3={}
for k in line1.keys():
    line3[k] = line1[k] - line2[k]
  

К сожалению, ключи (x-значения) не совпадают в обоих dicts. Как мне следует вычитать эти две строки друг из друга?

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

1. Если вы используете python3.7 , то ключи dict сохраняют порядок вставки, что может помочь с тем, что вы хотите ?.

Ответ №1:

В основном у вас есть x1, y1 и x2, y2. Чтобы выполнить значимое вычитание, вам нужно будет иметь общий x. Практика заключается в повторной выборке одного из сигналов в соответствии с другими x.

numpy.interp может это сделать. Например

 new_y2 = np.interp(x1, x2, y2)
d = new_y2 - y1 # both over x1
  

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

1. Я новичок np.interp() , но, основываясь на моем понимании того, что происходит в этой теме, я считаю, что было бы более целесообразно переименовать new_y2 as new_y1 , поскольку это, вероятно, значения, основанные на интерполяции y , для значений, x которые находятся внутри x1 . Или я все неправильно понял в этом потоке?

2. Нет. Мы передискретизируем y2 на x1. Пожалуйста, взгляните numpy.org/doc/stable/reference/generated/numpy.interp.html

Ответ №2:

Для меня это звучит так, как будто у вас есть данные с разной частотой дискретизации / отметками времени.

В зависимости от имеющихся у вас данных вы можете попытаться использовать их относительную временную метку из первого элемента — если они имеют одинаковую частоту дискретизации:

 #with 1.2, 1.3 == value of your first timestamp
d1_rel = {key - 1.2: value for key, value in d1.items()}
d2_rel = {key - 1.3: value for key, value in d2.items()}
  

в противном случае, если ваши данные имеют другую частоту дискретизации:

Библиотека «pandas» может быть вашим другом. Взгляните на метод повторной выборки: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas .DataFrame.resample.html#pandas-dataframe-resample