我有财务数据,试图计算两个连续thursday
之间的值变化百分比。有时,由于假日在Thursday
上,本周的每周数据不存在,所以我想从Thursday
到Wednesday
计算该周的pct_change
,因为数据帧中不存在Thursday
数据。
可复制代码-
# !pip install investpy
import pandas as pd
import investpy
from datetime import datetime
df = investpy.get_index_historical_data(index="Nifty 50",country="India",from_date=("23/03/2022"),to_date= "23/04/2022")
df['weekday'] = df.index.day_name()
df = df.loc[:, ['Close', 'weekday']]
df.tail(10)
输出-
Close weekday
Date
2022-04-07 17639.55 Thursday
2022-04-08 17784.35 Friday
2022-04-11 17674.95 Monday
2022-04-12 17530.30 Tuesday
2022-04-13 17475.65 Wednesday
2022-04-18 17173.65 Monday
2022-04-19 16958.65 Tuesday
2022-04-20 17136.55 Wednesday
2022-04-21 17392.60 Thursday
2022-04-22 17171.95 Friday
在df.tail(10)
中,缺少14-Apr-2022
日期,因为它是holiday
,所以在这种情况下,我想计算Thursday
到Wednesday
之间的pct_change
。
我以前用来计算pct_return 的代码
weekly_pct_change = df.loc[df['weekday'] == 'Thursday']
weekly_pct_change['pct_change']= np.log(1+weekly_pct_change['Close'].pct_change())*100
weekly_pct_change
输出-
Close weekday pct_change
Date
2022-03-24 17222.75 Thursday NaN
2022-03-31 17464.75 Thursday 1.395338
2022-04-07 17639.55 Thursday 0.995898
2022-04-21 17392.60 Thursday -1.409871
Onde的想法是通过DataFrame.asfreq
和method='ffill'
添加缺少的日期时间,然后通过DatetimeIndex.day_name
:重新分配日期名称
df1 = df.asfreq('B', method='ffill')
df1['weekday'] = df1.index.day_name()
print (df1.tail(10))
Close weekday
Date
2022-04-11 17674.95 Monday
2022-04-12 17530.30 Tuesday
2022-04-13 17475.65 Wednesday
2022-04-14 17475.65 Thursday
2022-04-15 17475.65 Friday
2022-04-18 17173.65 Monday
2022-04-19 16958.65 Tuesday
2022-04-20 17136.55 Wednesday
2022-04-21 17392.60 Thursday
2022-04-22 17171.95 Friday
weekly_pct_change = df1.loc[df1['weekday'] == 'Thursday'].copy()
weekly_pct_change['pct_change']= np.log(1+weekly_pct_change['Close'].pct_change())*100
print(weekly_pct_change)
Close weekday pct_change
Date
2022-03-24 17222.75 Thursday NaN
2022-03-31 17464.75 Thursday 1.395338
2022-04-07 17639.55 Thursday 0.995898
2022-04-14 17475.65 Thursday -0.933506
2022-04-21 17392.60 Thursday -0.476366