如何计算每日数据时间序列的百分比变化

时间:2021-04-06 07:41:27

标签: python pandas percentage

我有一个索引数据的每日时间序列,并希望对其进行每年的 pct 更改。如果我使用 DataFrame.pct_change(periods=...) 我将不得不定义到去年同一天的确切天数,这是不正确的,因为工作日数每年都不同。有谁知道如何从一年前的同一天获取更改?

代码可能如下所示:

import pandas as pd

list=[]
list=[[7.71],[7.79],[6.80],[6.44],[6.46],[6.80]]
df = pd.DataFrame(list, columns=['index'], index=['2016-01-04','2016-01-05','2016-01-06','2017-01-04','2017-01-05','2017-01-06'])

我希望输出如下:

2017-01-04  -16.45%
2017-01-05  -17.10%
2017-01-05    0.00% 

2 个答案:

答案 0 :(得分:0)

首先,一些建议:

  1. 不要使用 list 作为列表名称,因为您会覆盖内置的 list
  2. 不要使用 index 作为列名,因为在 Pandas 中 index 包含行标识。此外,这可能会令人困惑,因为您可以使用 df.column_name 访问列,但在这种情况下这是不可能的,因为 df.index 包含数据帧索引。
  3. 确保在创建日期时间索引时使用 pandas.DateTimeIndex
l = [7.71, 7.79, 6.80, 6.44, 6.46, 6.80] 
index = pd.DatetimeIndex(['2016-01-04', '2016-01-05', '2016-01-06', 
                          '2017-01-04' ,'2017-01-05' ,'2017-01-06'])
df = pd.DataFrame(l, columns=['col'], index = index) 

现在,您可以将 pandas.DataFrame.pct_changepandas.DateOffset 对象一起使用:

do = pd.DateOffset(years = 1)
df.pct_change(freq = do).dropna().mul(100)

输出

                index
2017-01-04 -16.472114
2017-01-05 -17.073171
2017-01-06   0.000000

答案 1 :(得分:-1)

EDIT:从@Pablo C 的好答案开始:鉴于 OP 对 DataFrame 的定义,我们首先需要将索引转换为 DatetimeIndex,否则 @Pablo C 的答案将抛出NotImplementedError: Not supported for type Index

import pandas as pd

list=[]
list=[[7.71],[7.79],[6.80],[6.44],[6.46],[6.80]]
df = pd.DataFrame(list, columns=['index'], index=['2016-01-04','2016-01-05','2016-01-06','2017-01-04','2017-01-05','2017-01-06'])

df.index = pd.to_datetime(df.index)

do = pd.DateOffset(years = 1)
df.pct_change(freq = do).dropna().mul(100)


#               index
# 2017-01-04    -16.472114
# 2017-01-05    -17.073171
# 2017-01-06    0.000000