我有一个熊猫数据框,其中包含历史天然气正向曲线的时间序列。 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。如果有办法以公式化的方式做到这一点,那会更好
感谢任何建议或帮助
答案 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