Устранение странных результатов черчения с использованием панд и дат - PullRequest
1 голос
/ 13 июня 2019

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

Это для построения нескольких датчиков с независимыми часами и разными частотами дискретизации Я хочу построить все датчики на одном рисунке для сравнения.

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

Выдержка из типичного файла CSV:

    Timestamp Date Clock DC3 HR DC4
    13 18.02.2019 08:24:00  19,12   61  3
    14 18.02.2019 08:26:00  19,12   38  0
    15 18.02.2019 08:28:00  19,12   52  0
    16 18.02.2019 08:30:00  19,12   230 2
    17 18.02.2019 08:32:00  19,12   32  3

Следующий код вызывает у меня проблему:

import pandas as pd
from scipy.signal import savgol_filter

columns = ['Timestamp', 'Date', 'Clock', 'DC3', 'HR', 'DC4']

data = pd.read_csv('Exampledata.DAT', 
               sep='\s|\t', 
               header=19, 
               names=columns, 
               parse_dates=[['Date', 'Clock']], 
               engine='python')

data['HR'] = savgol_filter(data['HR'], 201, 3) #Smoothing

ax = data.plot(x='Date_Clock', y='HR', label='Test')

Ожидаемый результат должен выглядеть так только с датами вдоль оси x:

Imgur

Фактический результат: Imgur

Пример полного файла данных можно скачать здесь: https://filesender.uninett.no/?s=download&token=ae8c71b5-2dcc-4fa9-977d-0fa315fedf45

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

Ответы [ 2 ]

1 голос
/ 14 июня 2019

Эта проблема решена, если не использовать parse_dates при загрузке файла, а вместо этого создать вектор даты и времени, подобный этому:

import pandas as pd
from scipy.signal import savgol_filter

columns = ['Timestamp', 'Date', 'Clock', 'DC3', 'HR', 'DC4']

data = pd.read_csv('Exampledata.DAT', 
               sep='\s|\t', 
               header=19, 
               names=columns, 
               engine='python')

data['Timestamp'] = pd.to_datetime(data['Date'] + data['Clock'], 
format='%d.%m.%Y%H:%M:%S')

data['HR'] = savgol_filter(data['HR'], 201, 3) #Smoothing

ax = data.plot(x='Timestamp', y='HR', label='Test')

Это создает следующий график:

Imgur

Какой сюжет я хочу.

0 голосов
/ 13 июня 2019

Вы получаете странный график, потому что matplotlib строит одну точку на строке. Если вы хотите, чтобы график был проще для чтения, вы можете использовать функцию resample(), чтобы сгруппировать записи по 1 в день (или 1 в неделю или 1 в месяц, если хотите). Вы два основных варианта при повторной выборке, вы можете либо взять сумму всех записей, или вы можете взять среднее. Я решил произвольно взять среднее.

Вот как это может выглядеть:

#Loading in the csv file
filename = 'data_test.xlsx'
df1 = pd.read_excel(filename, sep=',', index_col=False, header =None)
df1.columns =  ['to_delete', 'Timestamp', 'DC3', 'HR', 'DC4', 'DC5']
df1.drop(columns = 'to_delete', inplace = True)
df1['Timestamp'] = [datetime.strptime(x, '%d.%m.%Y %H:%M:%S') for x in df1['Timestamp']]

# We put the timestamp in the index since it's needed by the resample function
df1 = df1.set_index(["Timestamp"])
# We resample to have one row per day
df1 = df1.resample("1d").mean()

#We plot the graph
x = df1.plot(y='HR', label='Test')

Вот график с передискретизацией:

with_resample

Для сравнения вот график без передискретизации:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...