微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何检查一个数据帧中多个时间序列设置是否全部为NaN? 最快的方式

如何解决如何检查一个数据帧中多个时间序列设置是否全部为NaN? 最快的方式

我有一系列时间指标Ts一个包含多列df的数据框。

Ts.index是启动窗口的启动,Ts['end']是窗口的结尾。 Ts的每个时间值都在df.index中。

但是df包含NaN。 因此,我需要找出哪个“时间窗口” (== Ts.index[i]Ts['end']) 在至少df的一列中是'all-NaN ,然后将这些索引放在Ts中。

注意:开始和结束的时间窗口距离没有规律性/频率。 (但这是真的:end> =开始,结束总是在以后)

可重现的样本:(实际上有50列x 1百万行->我们需要速度)

import numpy as np,pandas as pd 
Ts=pd.DataFrame({"end":pd.to_datetime(np.asarray([ '2019-08-20 10:23:00','2019-08-20 10:24:00','2019-08-20 10:25:00','2019-08-20 10:26:00','2019-08-20 10:27:00','2019-08-20 10:28:00','2019-08-20 10:29:00','2019-08-20 10:30:00','2019-08-20 10:31:00','2019-08-20 10:32:00','2019-08-20 10:33:00','2019-08-20 10:34:00','2019-08-20 10:35:00','2019-08-20 10:36:00','2019-08-20 10:37:00','2019-08-20 10:38:00','2019-08-20 10:39:00','2019-08-20 10:40:00','2019-08-20 10:41:00','2019-08-20 10:42:00','2019-08-20 10:43:00','2019-08-20 10:44:00','2019-08-20 10:45:00','2019-08-20 10:46:00','2019-08-20 10:47:00','2019-08-20 10:48:00','2019-08-20 10:49:00','2019-08-20 10:50:00','2019-08-20 10:51:00','2019-08-20 10:52:00','2019-08-20 10:53:00','2019-08-20 10:54:00','2019-08-20 10:55:00','2019-08-20 10:56:00','2019-08-20 10:57:00','2019-08-20 10:58:00','2019-08-20 10:59:00','2019-08-20 11:00:00','2019-08-20 11:01:00','2019-08-20 11:02:00','2019-08-20 11:03:00','2019-08-20 11:04:00','2019-08-20 11:05:00','2019-08-20 11:06:00','2019-08-20 11:07:00','2019-08-20 11:08:00','2019-08-20 11:09:00','2019-08-20 11:10:00','2019-08-20 11:11:00','2019-08-20 11:12:00','2019-08-20 11:13:00','2019-08-20 11:14:00','2019-08-20 11:15:00','2019-08-20 11:16:00','2019-08-20 11:17:00','2019-08-20 11:18:00','2019-08-20 11:19:00','2019-08-20 11:20:00','2019-08-20 11:21:00','2019-08-20 11:22:00','2019-08-20 11:23:00','2019-08-20 11:24:00','2019-08-20 11:25:00','2019-08-20 11:26:00','2019-08-20 11:27:00','2019-08-20 11:28:00','2019-08-20 11:29:00','2019-08-20 11:30:00','2019-08-20 11:31:00','2019-08-20 11:32:00','2019-08-20 11:33:00','2019-08-20 11:34:00','2019-08-20 11:35:00','2019-08-20 11:36:00','2019-08-20 11:37:00','2019-08-20 11:38:00','2019-08-20 11:39:00','2019-08-20 11:40:00','2019-08-20 11:41:00','2019-08-20 11:42:00','2019-08-20 11:43:00','2019-08-20 11:44:00','2019-08-20 11:45:00','2019-08-20 11:46:00','2019-08-20 11:47:00','2019-08-20 11:48:00','2019-08-20 11:49:00','2019-08-20 11:50:00','2019-08-20 11:51:00','2019-08-20 11:52:00','2019-08-20 11:53:00','2019-08-20 11:54:00','2019-08-20 11:55:00','2019-08-20 11:56:00','2019-08-20 11:57:00','2019-08-20 11:58:00','2019-08-20 11:59:00','2019-08-20 12:00:00']))},index = pd.DatetimeIndex(['2019-08-20 10:21:00','2019-08-20 10:22:00','2019-08-20 10:23:00','2019-08-20 11:58:00']))

df_ix = index_ = pd.DatetimeIndex(['2019-08-20 10:21:00','2019-08-20 12:00:00'],dtype='datetime64[ns]',freq=None)

df = pd.DataFrame( {"A":np.random.uniform(low=0.5,high=13.3,size=(len(df_ix),)),"B":np.random.uniform(low=0.5,"C":np.random.uniform(low=0.5,"D":np.random.uniform(low=0.5,"E":np.random.uniform(low=0.5,))},index = df_ix)

for col in df:
    ori_rat = df[col].isna().mean()

    if ori_rat >= 0.2: continue

    add_miss_rat = (0.2 - ori_rat) / (1 - ori_rat)
    vals_to_nan = df[col].dropna().sample(frac=add_miss_rat).index
    df.loc[vals_to_nan,col] = np.NaN
             start                  end
2019-08-20 10:21:00 2019-08-20 10:23:00
2019-08-20 10:22:00 2019-08-20 10:24:00
2019-08-20 10:23:00 2019-08-20 10:25:00
2019-08-20 10:24:00 2019-08-20 10:26:00
2019-08-20 10:25:00 2019-08-20 10:27:00
                                ...
2019-08-20 11:54:00 2019-08-20 11:56:00
2019-08-20 11:55:00 2019-08-20 11:57:00
2019-08-20 11:56:00 2019-08-20 11:58:00
2019-08-20 11:57:00 2019-08-20 11:59:00
2019-08-20 11:58:00 2019-08-20 12:00:00

[98 rows x 1 columns]
                             A          B          C          D         E
2019-08-20 10:21:00   8.035600   4.453110   6.595318   0.626946       NaN
2019-08-20 10:22:00   9.496972   8.551003        NaN   1.524396  9.528287
2019-08-20 10:23:00   6.696175   4.877189   4.741549  11.229296  0.895824
2019-08-20 10:24:00  12.416047        NaN   3.716054   3.250250  7.841599
2019-08-20 10:25:00        NaN  11.980202  11.012225   6.537954       NaN
                       ...        ...        ...        ...       ...
2019-08-20 11:56:00        NaN        NaN  10.528517        NaN  5.378760
2019-08-20 11:57:00   6.535326        NaN   9.437784  12.542822       NaN
2019-08-20 11:58:00        NaN  12.730569        NaN   7.565673  2.653956
2019-08-20 11:59:00        NaN   7.047969   3.072487   8.413695  4.314163
2019-08-20 12:00:00  10.486452   1.269555   9.090241   2.446426  3.004084


编辑:添加了可视化功能+修复了示例错误

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。