Arhn - архитектура программирования

Панды Сравнение почасовых данных за несколько лет на одном графике

Итак, у меня есть фреймворк pandas, называемый годом, в этой форме:

                           discharge (m^3/s)  
date                                                                   
2016-01-01 00:00:00           17.6930
2016-01-01 01:00:00           17.3247
2016-01-01 02:00:00           17.2436
2016-01-01 03:00:00           17.5696
2016-01-01 04:00:00           16.4074
2016-01-01 05:00:00           17.5696
2016-01-01 06:00:00           17.0420            
....
2017-12-31 20:00:00           10.5911           
2017-12-31 21:00:00           10.5620          
2017-12-31 22:00:00           10.7374          
2017-12-31 23:00:00           10.5620 

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

До сих пор я пытался извлечь нужные месяцы и просто нанести их друг на друга. Но это не работает, как вы можете видеть на этой картинке:

Попытка заговора 1

Мой код для этого был:

# Comparison full months
def plotmonthdischarge(month, years, number_of_years):
    df = pd.read_csv('resources\FinVannføringEidsfjordvatn.csv', encoding = 'ISO-8859-1',sep=';')
    df['date'] = pd.to_datetime(df['date'],dayfirst=True)
    df = df.set_index(df['date'])
    df['Day Of Year'] = df['date'].dt.dayofyear
    df = df.drop(['date'], axis = 1)
    df = df.replace(to_replace='-9999', value = np.NaN)


    fig, ax = plt.subplots()

    # For a starting year 2016 and a 1 following year
    # Call example:
    # plotmonthdischarge(1,[2016],2)
    if len(years) == 1:
        start_year = years[0]
        for i in range(number_of_years):
            year = df['{0}-{1}-01 00:00:00'.format(start_year+i,month):'{0}-{1}-31 23:59:59'.format(start_year+i,month)]
            ax.plot(year['discharge (m^3/s)'], label = 'Year {}'.format(start_year+i))

    # Just for plotting(ignore)
    formatted_list = ['{:>3}' for i in range(number_of_years)] 
    string_of_years = ', '.join(formatted_list).format(*[start_year+i for i in range(number_of_years)])
    plt.title('Comparison plot of years {}'.format(string_of_years))

    # Specific years  2006 and 2017
    # Call example:
    # plotmonthdischarge(1,[2006,2017],1)
    if len(years) > 1:
        number_of_years = 1
        for item in years:
            year = df['{0}-{1}-01 00:00:00'.format(item,month):'{0}-{1}-31 23:59:59'.format(item,month)]
            ax.plot(year['Day Of Year'],year['discharge (m^3/s)'], label = 'Year {}'.format(item))

    # Just for plotting(ignore)
    formatted_list = ['{:>3}' for item in years] 
    string_of_years = ', '.join(formatted_list).format(*years)
    plt.title('Comparison plot of years {}'.format(string_of_years))
    print(year)

    plt.suptitle(r'Discharge $m^{3}s^{-1}$')
    plt.ylabel(r'Discharge $m^{3}s^{-1}$')
    plt.legend()
    plt.grid(True)

plotmonthdischarge(1,[2015,2016],1)

Моя следующая попытка была с тем, что я нашел в других сообщениях

df['Day Of Year'] = df['date'].dt.dayofyear

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

 ax.plot(year['Day Of Year'],year['discharge (m^3/s)'], label = 'Year {}'.format(item))

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

Попытка заговора 2

Также попытался удалить год из datetime (мой индекс) и построить график по индексу datetime только с месяцем, днем ​​и часами, но без реального успеха.

ИЗМЕНИТЬ:

Пример графика того, как будет выглядеть график одного года (2015, январь).

Правильный сюжет, полученный мной всего за один год

05.05.2018

Ответы:


1

Если в ваших данных нет пропущенных значений (NaN), я бы предложил вырезать желаемые годы из DataFrame с помощью .loc и построить базовые массивы numpy с помощью .values:

fig, ax = plt.subplots()
for yr in ['2016', '2017']:
    ax.plot(df.loc[yr].values, label = 'Year {}'.format(yr))

Более гибкий способ - вручную вычислить час года, а не день года, и перейти оттуда:

df['hourofyear'] = 24 * (df.index.dayofyear - 1) + df.index.hour
fig, ax = plt.subplots()
for yr, g in df.groupby(df.index.year):
    g.plot('hourofyear', 'discharge (m^3/s)', label='Year {}'.format(yr), ax=ax)
05.05.2018
  • Я реализовал первый способ, и он вроде работает. Этот конкретный набор данных не содержит NaN, но я хотел бы, чтобы он работал с наборами данных, которые содержат NaN. Одно из ваших решений работает лучше, чем другое с NaN? 05.05.2018
  • @JohanR, да, я бы выбрал второй подход. 05.05.2018
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..