python - Find target values in pandas dataframe -
i have multilevel dataframe df
. columns, have different "objects" analyze. rows index , have case id lc
, , time t
.
i need find, each case lc
, time t
(ideally interpolated, closest value fine enough) @ each object reached target value.
this target value function of given object @ time t==0
.
import pandas pd print(pd.__version__) 0.16.2
dummy data set example:
data = {1: {(1014, 0.0): 20.25, (1014, 0.0991): 19.08, (1014, 0.1991): 18.43, (1014, 0.2991): 19.03, (1014, 0.3991): 18.71, (1015, 0.0): 20.22, (1015, 0.0991): 19.3, (1015, 0.1991): 18.68, (1015, 0.2991): 18.22, (1015, 0.3991): 17.84, (1016, 0.0): 21.75, (1016, 0.0991): 19.97, (1016, 0.1991): 19.65, (1016, 0.2991): 19.29, (1016, 0.3991): 18.94 }, 2: {(1014, 0.0): 29.11, (1014, 0.0991): 28.68, (1014, 0.1991): 28.27, (1014, 0.2991): 27.46, (1014, 0.3991): 26.96, (1015, 0.0): 29.22, (1015, 0.0991): 28.64, (1015, 0.1991): 28.18, (1015, 0.2991): 27.74, (1015, 0.3991): 27.25, (1016, 0.0): 29.17, (1016, 0.0991): 28.68, (1016, 0.1991): 28.17, (1016, 0.2991): 27.68, (1016, 0.3991): 27.18 }, 3: {(1014, 0.0): 22.01, (1014, 0.0991): 21.5, (1014, 0.1991): 21.18, (1014, 0.2991): 20.58, (1014, 0.3991): 20.21, (1015, 0.0): 21.81, (1015, 0.0991): 21.46, (1015, 0.1991): 21.11, (1015, 0.2991): 20.78, (1015, 0.3991): 20.42, (1016, 0.0): 21.82, (1016, 0.0991): 21.49, (1016, 0.1991): 21.11, (1016, 0.2991): 20.75, (1016, 0.3991): 20.37 }} df = pd.dataframe(data).sort() df.index.names=['case', 't']
dataframe looks like:
1 2 3 case t 1014 0.0000 20.25 29.11 22.01 0.0991 19.08 28.68 21.50 0.1991 18.43 28.27 21.18 0.2991 19.03 27.46 20.58 0.3991 18.71 26.96 20.21 1015 0.0000 20.22 29.22 21.81 0.0991 19.30 28.64 21.46 0.1991 18.68 28.18 21.11 0.2991 18.22 27.74 20.78 0.3991 17.84 27.25 20.42 1016 0.0000 21.75 29.17 21.82 0.0991 19.97 28.68 21.49 0.1991 19.65 28.17 21.11 0.2991 19.29 27.68 20.75 0.3991 18.94 27.18 20.37
target values function of values @ time t==0
. typically, k=0.5 half-time period. current sample,we take k=0.926
since values sorted, ok take first lines each case.
targets = df.groupby(level='case').first() * 0.926 print(targets) 1 2 3 case 1014 18.75150 26.95586 20.38126 1015 18.72372 27.05772 20.19606 1016 20.14050 27.01142 20.20532
now, how build following dataframe, shows time t
@ wich each object reach target value calculated above?
1 2 3 case 1014 0.3991 0.3991 0.2991 1015 0.1991 0.3991 0.3991 1016 0.0991 0.3991 0.3991
these of hack, let's see if there better solutions:
in [36]: targets['t']=0 in [37]: df2 = df.reset_index().set_index('case') - targets in [38]: df3 = df2.groupby(df2.index).transform(lambda x: x.abs()==np.min(x.abs())) in [39]: df4 = pd.dataframe({'1': df2.t[df3[1]], '2': df2.t[df3[2]], '3': df2.t[df3[3]]}) print df4 1 2 3 case 1014 0.3991 0.3991 0.3991 1015 0.1991 0.3991 0.3991 1016 0.0991 0.3991 0.3991
Comments
Post a Comment