首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当半衰期已知时,如何为药物的不规则时间序列填充is /缺失值

当半衰期已知时,如何为药物的不规则时间序列填充is /缺失值
EN

Stack Overflow用户
提问于 2016-07-15 02:07:38
回答 1查看 252关注 0票数 2

我有一个dataframe (df),其中A列是药物单位,在时间点由时间戳给出。我想用药物的半衰期(180分钟)来填充缺失值(NaN)。我在为熊猫的密码而挣扎。会很感激你的帮助和洞察力。提前感谢

代码语言:javascript
运行
复制
df
                       A     
Timestamp                                                      
1991-04-21 09:09:00   9.0        
1991-04-21 3:00:00   NaN       
1991-04-21 9:00:00   NaN       
1991-04-22 07:35:00  10.0      
1991-04-22 13:40:00   NaN        
1991-04-22 16:56:00   NaN    

给出一半-life的药物是180分钟。我想用药物经过的时间和半衰期的函数来填充值。

就像这样

代码语言:javascript
运行
复制
Timestamp             A     

1991-04-21 09:00:00   9.0  
1991-04-21 3:00:00   ~2.25   
1991-04-21 9:00:00   ~0.55   
1991-04-22 07:35:00  10.0  
1991-04-22 13:40:00   ~2.5   
1991-04-22 16:56:00   ~0.75  
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-15 06:13:31

您的时间戳没有排序,我猜这是一个错误。我把它修好了。

代码语言:javascript
运行
复制
import pandas as pd
import numpy as np
from StringIO import StringIO

text = """TimeStamp                    A     
1991-04-21 09:09:00   9.0        
1991-04-21 13:00:00   NaN       
1991-04-21 19:00:00   NaN       
1991-04-22 07:35:00  10.0      
1991-04-22 13:40:00   NaN        
1991-04-22 16:56:00   NaN  """

df = pd.read_csv(StringIO(text), sep='\s{2,}', engine='python', parse_dates=[0])

这是魔法密码。

代码语言:javascript
运行
复制
# half-life of 180 minutes is 10,800 seconds
# we need to calculate lamda (intentionally mis-spelled)
lamda = 10800 / np.log(2)

# returns time difference for each element
# relative to first element
def time_diff(x):
    return x - x.iloc[0]

# create partition of non-nulls with subsequent nulls
partition = df.A.notnull().cumsum()

# calculate time differences in seconds for each
# element relative to most recent non-null observation
# use .dt accessor and method .total_seconds()
tdiffs = df.TimeStamp.groupby(partition).apply(time_diff).dt.total_seconds()

# apply exponential decay
decay = np.exp(-tdiffs / lamda)

# finally, forward fill the observations and multiply by decay
decay * df.A.ffill()

0     9.000000
1     3.697606
2     0.924402
3    10.000000
4     2.452325
5     1.152895
dtype: float64
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38386835

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档