2017-09-25 255 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] 
相關問題