2017-09-25 256 views
2

我有一个带有日期时间索引的熊猫df。我想根据索引日期值(不同时间段的不同罢工),使用不同的罢工值循环以下代码。这里是我的代码产生我是什么之后在整个时间序列的1个警告:熊猫从日期时间索引组计算列循环

import pandas as pd 
import numpy as np 

index=pd.date_range('2017-10-1 00:00:00', '2018-12-31 23:50:00', freq='30min') 
df=pd.DataFrame(np.random.randn(len(index),2).cumsum(axis=0),columns=['A','B'],index=index) 

strike = 40 
payoffs = df[df>strike]-strike 
mean_payoff = payoffs.fillna(0).mean() 
dist = mean_payoff.describe(percentiles=[0.05,.5,.95]) 

print(dist)  

我想基于时间段(指标值)来使用的strike不同的值。

到目前为止,我试图创建一个分类计算列,意图使用地图或在df上应用行明智。我也玩过创建字典并在df上映射字典。 即使我得到正确的罢工价值的计算列,我不能想到如何从所有其他列减去计算列值(罢工)从上面得到payoffs

我觉得我需要使用for循环,并可能创建一组日期块,这些日期块可以在循环结尾附加在一起,也许可以使用pd.concat。

在此先感谢

+0

请提供一个具体的例子/测试案例可重复码 – chrisckwong821

+0

这是否帮助?干杯 – sjb123

回答

1

我想你需要通过to_period通过dict转换DatetimeIndexquarter时期,再到string和最后一个map

对于comapring需要gtsub

d = {'2017Q4':30, '2018Q1':40, '2018Q2':50, '2018Q3':60, '2018Q4':70} 
strike = df.index.to_series().dt.to_period('Q').astype(str).map(d) 
payoffs = df[df.gt(strike, 0)].sub(strike, 0) 

mean_payoff = payoffs.fillna(0).mean() 
dist = mean_payoff.describe(percentiles=[0.05,.5,.95]) 
+0

这真的很有帮助谢谢!我唯一的问题是我的日期是在YYYY-DD-MM和df.to_period('Q')认为是YYYY-MM-DD,有没有办法传递monthfirst = False或类似的东西?我尝试过pd.to_datetime(pd.Series(df.index.strftime(“%d-%m-%Y”)))。dt.to_period('Q')。astype(str).map(d)出现此错误:无法将类型'时间戳'与类型'int'进行比较 – sjb123

+1

您认为您的真实数据格式为'YYYY-DD-MM'吗?然后需要'(pd.to_datetime(df.index,format =“%Y-%d-%m”))。to_series()。dt.to_period('Q')。astype(str).map(d)' – jezrael

+0

并且需要to_series()不是pd.Series,因为需要datetimeindex – jezrael

0

映射你的数据帧索引字典可以是一个起点。

a = dict() 
a[2017]=30 
a[2018]=40 
ranint = random.choices([30,35,40,45],k=21936) 
#given your index used in example 
df = pd.DataFrame({values:ranint},index=index) 



         values year strick 
2017-10-01 00:00:00  30 2017  30 
2017-10-01 00:30:00  30 2017  30 
2017-10-01 01:00:00  45 2017  30 

df.year = df.index.year 
index.strike = df.year.map(a) 
df.returns = df.values - df.strike 

然后你就可以提取收益是大于0:

df[df.returns>0] 
相关问题