用熊猫建立天然气远期价格带的时间序列

时间:2018-06-29 20:12:41

标签: python pandas

我有一个熊猫数据框,其中包含历史天然气正向曲线的时间序列。 IE在过去的每个日期中,我都有以下17个月的天然气月度价格。我有两个不同地点的价格。因此,每个日期都有34行数据(2个位置x 17个月)。

有时以季节性条带形式买卖天然气。冬季是11月至3月(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

此数据中的前十七个月相当于三个季节性条带(两个冬天和一个夏天)。因此,在对这些数据进行平均后,两个地点的两个历史日期将出现三个季节性带钢价格。为了使数字保持简单,我在每个季节都使用了简单的升序价格。我还需要将前几个月重命名为脱衣舞女孩的名字。我们将在夏季使用JV,在相应的年份使用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 :(得分:0)

只需创建季节标签,然后将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