Временные ряды строительства ценовых полос природного газа с пандами - PullRequest
0 голосов
/ 29 июня 2018

У меня есть кадр данных панд с временным рядом исторических кривых движения природного газа. Т.е. на каждую дату в прошлом у меня есть месячная цена на природный газ на следующие 17 месяцев. У меня есть эти цены для двух разных мест. Таким образом, каждая дата имеет 34 строки данных (2 местоположения x 17 месяцев).

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

Вот некоторые примеры данных:

Location    Month   Date    Price
a   11/1/2017   11/1/2017   1
a   12/1/2017   11/1/2017   1
a   1/1/2018    11/1/2017   1
a   2/1/2018    11/1/2017   1
a   3/1/2018    11/1/2017   1
a   4/1/2018    11/1/2017   2
a   5/1/2018    11/1/2017   2
a   6/1/2018    11/1/2017   2
a   7/1/2018    11/1/2017   2
a   8/1/2018    11/1/2017   2
a   9/1/2018    11/1/2017   2
a   10/1/2018   11/1/2017   2
a   11/1/2018   11/1/2017   3
a   12/1/2018   11/1/2017   3
a   1/1/2019    11/1/2017   3
a   2/1/2019    11/1/2017   3
a   3/1/2019    11/1/2017   3
b   11/1/2017   11/1/2017   4
b   12/1/2017   11/1/2017   4
b   1/1/2018    11/1/2017   4
b   2/1/2018    11/1/2017   4
b   3/1/2018    11/1/2017   4
b   4/1/2018    11/1/2017   5
b   5/1/2018    11/1/2017   5
b   6/1/2018    11/1/2017   5
b   7/1/2018    11/1/2017   5
b   8/1/2018    11/1/2017   5
b   9/1/2018    11/1/2017   5
b   10/1/2018   11/1/2017   5
b   11/1/2018   11/1/2017   6
b   12/1/2018   11/1/2017   6
b   1/1/2019    11/1/2017   6
b   2/1/2019    11/1/2017   6
b   3/1/2019    11/1/2017   6
a   11/1/2017   11/2/2017   7
a   12/1/2017   11/2/2017   7
a   1/1/2018    11/2/2017   7
a   2/1/2018    11/2/2017   7
a   3/1/2018    11/2/2017   7
a   4/1/2018    11/2/2017   8
a   5/1/2018    11/2/2017   8
a   6/1/2018    11/2/2017   8
a   7/1/2018    11/2/2017   8
a   8/1/2018    11/2/2017   8
a   9/1/2018    11/2/2017   8
a   10/1/2018   11/2/2017   8
a   11/1/2018   11/2/2017   9
a   12/1/2018   11/2/2017   9
a   1/1/2019    11/2/2017   9
a   2/1/2019    11/2/2017   9
a   3/1/2019    11/2/2017   9
b   11/1/2017   11/2/2017   10
b   12/1/2017   11/2/2017   10
b   1/1/2018    11/2/2017   10
b   2/1/2018    11/2/2017   10
b   3/1/2018    11/2/2017   10
b   4/1/2018    11/2/2017   11
b   5/1/2018    11/2/2017   11
b   6/1/2018    11/2/2017   11
b   7/1/2018    11/2/2017   11
b   8/1/2018    11/2/2017   11
b   9/1/2018    11/2/2017   11
b   10/1/2018   11/2/2017   11
b   11/1/2018   11/2/2017   12
b   12/1/2018   11/2/2017   12
b   1/1/2019    11/2/2017   12
b   2/1/2019    11/2/2017   12
b   3/1/2019    11/2/2017   12

Семнадцать последующих месяцев в этих данных эквивалентны трем сезонным полосам (две зимы и одна летняя). Таким образом, после того, как эти данные будут усреднены, появятся три сезонные цены на полосы для двух местоположений на две исторические даты. Я использовал простые возрастающие цены в каждом сезоне, чтобы цифры были простыми. Мне также нужно будет переименовать месяцы в названия полос. Мы будем использовать СП для лета и XH для зимы с соответствующим годом - таким образом, нашим примером будет XH1718, JV18, XH1819, для зимы, начинающейся в 17, заканчивающейся 18, летом 18, зимой, начинающейся в 18 и заканчивающейся в 19 .

Средние цены на полосы с новыми названиями будут выглядеть примерно так:

Loc        A          A       A       B      B         B
Season    XH1718    JV18    XH1819  XH1718  JV18    XH1819
11/1/2017   1         2        3       4      5        6
11/2/2017   7         8        9       10     11       12

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

Формат вывода не очень важен, это может быть просто фрейм данных с новыми усредненными полосами или сводная таблица.

В двух словах я пытаюсь:

- Построить средние цены за каждый исторический день в столбце «Дата» (в выборочных данных их две)

- Построить средние цены для каждого местоположения (в выборочных данных их два)

- усреднить цены, используя даты в столбце «Месяц» данных (есть 17 месяцев, но три сезона - две зимы по пять месяцев каждая, одно лето в семь месяцев)

-Переименуйте новые средние цены XH1718, JV18, XH1819. Если бы был способ сделать это в формальной форме, это было бы еще лучше

Спасибо за любые предложения или помощь

1 Ответ

0 голосов
/ 30 июня 2018

Вы можете делать то, что вы хотите, просто создав метку сезона, а затем используя pd.pivot_table() со средним значением для функции агрегирования.

import numpy as np
import pandas as pd

conds = [df.Month.dt.month<=3, df.Month.dt.month.between(4,10), df.Month.dt.month > 10]
choices = [(df.Month.dt.year-1).astype(str).str[2:] + df.Month.dt.year.astype(str).str[2:],
           df.Month.dt.year.astype(str).str[2:],
           (df.Month.dt.year).astype(str).str[2:] + (df.Month.dt.year+1).astype(str).str[2:]]

df['syear'] = np.select(conds, choices)
df['Season'] =  df.Month.dt.month.between(4,10).map({False: 'XH', True: 'JV'}) + df.syear

На данный момент df выглядит следующим образом:

print(df.head(7))
#  Location      Month       Date  Price syear  Season
#0        a 2017-11-01  11/1/2017      1  1718  XH1718
#1        a 2017-12-01  11/1/2017      1  1718  XH1718
#2        a 2018-01-01  11/1/2017      1  1718  XH1718
#3        a 2018-02-01  11/1/2017      1  1718  XH1718
#4        a 2018-03-01  11/1/2017      1  1718  XH1718
#5        a 2018-04-01  11/1/2017      2    18    JV18
#6        a 2018-05-01  11/1/2017      2    18    JV18

Теперь просто pivot_table, чтобы получить желаемый результат.

df2 = pd.pivot_table(df, index=['Date'], columns=['Location', 'Season'], 
                     values='Price', aggfunc='mean')
df2.index.name=None

df2 сейчас:

Location     a                  b              
Season    JV18 XH1718 XH1819 JV18 XH1718 XH1819
11/1/2017    2      1      3    5      4      6
11/2/2017    8      7      9   11     10     12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...