我是py的初学者。我的问题是我无法在分位数度量上将时间序列的元素与它们各自的组进行比较。 这是DF:
import numpy as np
import pandas as pd
#np.random.seed(444)
df = pd.DataFrame({
'A' : ['foo', 'bar', 'foo', 'bar','foo', 'bar', 'foo', 'foo','foo','bar'],
'B' : ['one', 'one', 'two', 'two','two', 'two', 'one', 'two','one','two'],
'2018-09-28' : np.random.randn(10),
'2018-10-06' : np.random.randn(10),
'2018-10-13' : np.random.randn(10)
})
df.index = ['se0','se1','se2','se3','se4','se5','se6','se7',"se8",'se9']
df.index.name = 'SE'
然后创建2 df,计算上下限
#根据A和B组计算低分位数和高分位数并放入
它在索引级别(se0,...)
df_low = df.groupby(['A','B']).transform(lambda x : x.quantile(0.45))
df_high = df.groupby(['A','B']).transform(lambda x : x.quantile(0.55))
print(df_low)
print(df_high)
#根据评估se0,...,se9与其组分位数的值的测试,创建一个新的df,其中带有标志(1或-1)
f=lambda x : -1 if x<df_low else 1 if x>df_high else 0
transformed=df.iloc[:,2:].apply(f)
那里我有一个错误。我在哪里错了?
答案 0 :(得分:0)
使用x<df_low
返回一个布尔值数据框,其中原始df中大于x的值为True。
这就是为什么会出现错误的原因,因为if语句期望True或False,而是获得一个数据帧。
这应该为您提供所需的数据框:
transformed = pd.DataFrame(0, index=df.iloc[:,2:].index, columns=df.iloc[:,2:].columns)
transformed[df.iloc[:,2:] < df_low] = -1
transformed[df.iloc[:,2:] > df_high] = 1