Примечание:
Пост выглядит длиннее, чем следовало бы из-за строк документации и массива, состоящего из 40 datetime.
У меня есть данные временных рядов. Для примера, скажем, у меня есть три параметра, каждый из которых состоит из 40 точек данных: datetime (задается dts
), скорость (задается vobs
) и истекший час (задается els
), которые объединяются по ключу в словарь data_dict
.
dts = np.array(['2006/01/01 02:30:04', '2006/01/01 03:30:04', '2006/01/01 03:54:04'
,'2006/01/01 05:30:04', '2006/01/01 06:30:04', '2006/01/01 07:30:04'
,'2006/01/01 08:30:04', '2006/01/01 09:30:04', '2006/01/01 10:30:04'
,'2006/01/01 11:30:04', '2006/01/01 12:30:04', '2006/01/01 13:30:04'
,'2006/01/01 14:30:04', '2006/01/01 15:30:04', '2006/01/01 16:30:04'
,'2006/01/01 17:30:04', '2006/01/01 18:30:04', '2006/01/01 19:30:04'
,'2006/01/01 20:30:04', '2006/01/01 21:30:04', '2006/01/01 21:54:05'
,'2006/01/01 23:30:04', '2006/01/02 00:30:04', '2006/01/02 01:30:04'
,'2006/01/02 02:30:04', '2006/01/02 03:30:04', '2006/01/02 04:30:04'
,'2006/01/02 05:30:04', '2006/01/02 06:30:04', '2006/01/02 07:30:04'
,'2006/01/02 08:30:04', '2006/01/02 09:30:04', '2006/01/02 10:30:04'
,'2006/01/02 11:30:04', '2006/01/02 12:30:04', '2006/01/02 13:30:04'
,'2006/01/02 14:30:04', '2006/01/02 15:30:04', '2006/01/02 16:30:04'
,'2006/01/02 17:30:04'])
vobs = np.array([158, 1, 496, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
, 1, 1, 823, 1, 1, 1, 1, 303, 1, 1, 1, 1, 253, 1, 1, 1, 408, 1
, 1, 1, 1, 321])
els = np.array([i for i in range(len(vobs))])
data_dictionary = {'datetime' : dts, 'values' : vobs, 'elapsed' : els}
У меня есть функция, которая принимает словарь в качестве входных данных и выводит единственное скалярное значение type <float>
или type <int>
. Функция, приведенная ниже, проще, чем мой фактический пример использования, и приведена для примера.
def get_z(dictionary):
""" This function returns a scalar value. """
return np.sum(dictionary['elapsed'] / dictionary['values'])
Я бы хотел посмотреть, как меняется выход этой функции при изменении временного интервала. Итак, я создал функцию, которая принимает словарь в качестве входных данных и выводит новый словарь, значения массива которого нарезаны по индексам ввода для каждого из ключей во входном словаре. Обратите внимание, что прошедшие часы могут служить показателями.
def subsect(dictionary, indices):
""" This function returns a dictionary, the array values
of which are sliced at the input indices. """
return {key : dictionary[key][indices] for key in list(dictionary.keys())}
Чтобы убедиться, что вышеуказанные функции работают, можно запустить цикл for, содержащий функцию read_dictionary(...)
ниже.
def read_dictionary(dictionary):
""" This function prints the input dictionary as a check. """
for key in list(dictionary.keys()):
print(" .. KEY = {}\n{}\n".format(key, dictionary[key]))
print("\nORIGINAL DATA DICTIONARY\n")
read_dictionary(data_dictionary)
# for i in range(1, 38):
# mod_dictionary = subsect(data_dictionary, indices=slice(i, 39, 1))
# print("\n{}th MODIFIED DATA DICTIONARY\n".format(i))
# read_dictionary(mod_dictionary)
Моя проблема в том, что мне нужен контурный сюжет. Ось X будет содержать нижнюю границу интервала дата-время (первая запись mod_dictionary[i]
), а ось Y будет содержать верхнюю границу интервала дата-время (последняя запись mod_dictioary[i]
). Обычно при построении контурного графика имеется массив значений (x,y)
, которые превращаются в сетку (X,Y)
через numpy.meshgrid
. Поскольку моя фактическая функция (не та, что в примере) не векторизована, я могу использовать X.copy().reshape(-1)
и изменить свой результат обратно, используя (...).reshape(X.shape)
.
Моя точная проблема в том, что я не знаю, как создать сетку с различными параметрами, используя один словарь в качестве входных данных для функции, которая выводит одно скалярное значение. Есть ли способ сделать это?