python - 使用 Pandas 构建天然气远期价格带的时间序列
问题描述
我有一个带有历史天然气远期曲线时间序列的熊猫数据框。IE 在过去的每个日期,我都有接下来 17 个月的每月天然气价格。我有两个不同地点的这些价格。所以每个日期有 34 行数据(2 locs x 17 个月)。
天然气有时以季节性带状形式买卖。冬季地带是 11 月至 3 月(5 个月)。夏季地带是 4 月至 10 月(七个月)。我想将数据框中各个月份的价格平均为条带 - 每个历史日期和每个位置。
以下是一些示例数据:
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
该数据中的前 17 个月相当于三个季节带(两个冬天和一个夏天)。因此,在对这些数据进行平均之后,两个历史日期的两个地点的三个季节性带钢价格。我在每个季节都使用简单的递增价格来保持数字简单。我还需要将前几个月重命名为条带名称。我们将使用 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。如果有办法以公式化的方式做到这一点,那就更好了
感谢您的任何建议或帮助
解决方案
您可以通过创建季节标签然后使用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
推荐阅读
- vue.js - 如果有人尝试在本地存储数据中编辑它不会反映在我的 UI 中,如何将购物车数据存储在本地存储和应用程序中
- javascript - React GET 方法不呈现最新帖子
- sql - PostgreSQL:计算平均处理时间
- php - 另一个项目的 PHP get_declared_classes()
- go - 从嵌入式结构中迭代结构值
- javascript - 为什么底部的代码没有执行?
- javascript - 在 Typescript 中循环遍历数组
- python - 找出 lambda 函数从哪个 IP 运行
- wso2 - WSO2 微积分器向故障序列抛出异常路径
- python - 405 不允许发布方法