如何计算 python 中日期的滚动 window 周期?
How to calculate rolling window periods for dates in python?
我是 python 的新手,非常感谢您的帮助!
我想滚动计算日期期间。
我有如下输入数据:
Date RF1 RF2
01-01-2008 TRUE FALSE
02-01-2008 TRUE FALSE
03-01-2008 FALSE FALSE
04-01-2008 FALSE FALSE
05-01-2008 FALSE FALSE
06-01-2008 FALSE FALSE
07-01-2008 FALSE FALSE
08-01-2008 FALSE FALSE
09-01-2008 FALSE FALSE
10-01-2008 FALSE FALSE
11-01-2008 FALSE FALSE
我想在 20 天的滚动基础上计算 250 天的不同日期期间,然后检查该期间有多少次 False。
例如:我的第一个月经是 2008 年 1 月 1 日+250 天
那么我的第二期应该是从1月21日+250天等等
然后对于每个周期,我需要检查每列出现错误的次数。
请帮忙!!
假设您有如下 data
;
data = [
{'Date': '01-01-2008', 'RF1': True, 'RF2': False},
...
]
然后可以算出false的个数
from itertools import islice
apply_data = [list(islice(data, n, n+250)) for n in range(0, len(data), 20)]
for each_list in apply_data:
rf1_true_count = sum(v['RF1'] for v in each_list)
rf1_false_count = 250 - rf1_true_count
print(rf1_false_count )
rf2_true_count = sum(v['RF2'] for v in each_list)
rf2_false_count = 250 - rf2_true_count
print(rf2_false_count )
您可以使用 rolling
和 sum
,然后 resample
和 first
使用矢量化 Pandas 方法处理数据帧,前提是 Date
列包含真正的 Timestamp
个对象。它包含字符串,您必须首先将它们转换为时间戳:
df['Date'] = pd.to_datetime(df['Date'])
我还将假设 RF1
和 RF2
列包含真布尔值。同样,如果它们是字符串,您应该首先将它们转换为布尔值:
df['RF1'] = df['RF1'] == 'TRUE' # same for RF2
我已经构建了一个与您相近的示例数据框:
np.random.seed(0) # make data reproducible
df = pd.DataFrame({
'Date': pd.date_range('2008-01-01', periods=500, freq='D'),
'RF1': np.random.choice([True, False], 500),
'RF2': np.random.choice([True, False], 500)})
它给出:
Date RF1 RF2
0 2008-01-01 True False
1 2008-01-02 False False
2 2008-01-03 False True
3 2008-01-04 True True
4 2008-01-05 False True
.. ... ... ...
495 2009-05-10 True True
496 2009-05-11 False True
497 2009-05-12 True True
498 2009-05-13 False False
499 2009-05-14 True True
我会首先计算每个 250 天完整周期的真实值的滚动总和,然后每 20 天对结果重新采样:
# compute the sum of True values per periods of 250 days with start and end
result = df.rolling(250, on='Date').sum().dropna().rename(
columns={'Date': 'End'}).assign(Start=df['Date'] - pd.Timedelta(249, 'D'))
# reorder columns
result = result.reindex(columns=['Start', 'End', 'RF1', 'RF2'])
# resample on every 20th day
result.resample('20D', on='Start').first().reset_index(drop=True)
它给出:
Start End RF1 RF2
0 2008-01-01 2008-09-06 126.0 123.0
1 2008-01-21 2008-09-26 124.0 120.0
2 2008-02-10 2008-10-16 126.0 122.0
3 2008-03-01 2008-11-05 127.0 121.0
4 2008-03-21 2008-11-25 121.0 129.0
5 2008-04-10 2008-12-15 122.0 122.0
6 2008-04-30 2009-01-04 120.0 122.0
7 2008-05-20 2009-01-24 120.0 120.0
8 2008-06-09 2009-02-13 119.0 119.0
9 2008-06-29 2009-03-05 118.0 127.0
10 2008-07-19 2009-03-25 112.0 124.0
11 2008-08-08 2009-04-14 114.0 134.0
12 2008-08-28 2009-05-04 113.0 133.0
我是 python 的新手,非常感谢您的帮助! 我想滚动计算日期期间。 我有如下输入数据:
Date RF1 RF2
01-01-2008 TRUE FALSE
02-01-2008 TRUE FALSE
03-01-2008 FALSE FALSE
04-01-2008 FALSE FALSE
05-01-2008 FALSE FALSE
06-01-2008 FALSE FALSE
07-01-2008 FALSE FALSE
08-01-2008 FALSE FALSE
09-01-2008 FALSE FALSE
10-01-2008 FALSE FALSE
11-01-2008 FALSE FALSE
我想在 20 天的滚动基础上计算 250 天的不同日期期间,然后检查该期间有多少次 False。
例如:我的第一个月经是 2008 年 1 月 1 日+250 天
那么我的第二期应该是从1月21日+250天等等
然后对于每个周期,我需要检查每列出现错误的次数。
请帮忙!!
假设您有如下 data
;
data = [
{'Date': '01-01-2008', 'RF1': True, 'RF2': False},
...
]
然后可以算出false的个数
from itertools import islice
apply_data = [list(islice(data, n, n+250)) for n in range(0, len(data), 20)]
for each_list in apply_data:
rf1_true_count = sum(v['RF1'] for v in each_list)
rf1_false_count = 250 - rf1_true_count
print(rf1_false_count )
rf2_true_count = sum(v['RF2'] for v in each_list)
rf2_false_count = 250 - rf2_true_count
print(rf2_false_count )
您可以使用 rolling
和 sum
,然后 resample
和 first
使用矢量化 Pandas 方法处理数据帧,前提是 Date
列包含真正的 Timestamp
个对象。它包含字符串,您必须首先将它们转换为时间戳:
df['Date'] = pd.to_datetime(df['Date'])
我还将假设 RF1
和 RF2
列包含真布尔值。同样,如果它们是字符串,您应该首先将它们转换为布尔值:
df['RF1'] = df['RF1'] == 'TRUE' # same for RF2
我已经构建了一个与您相近的示例数据框:
np.random.seed(0) # make data reproducible
df = pd.DataFrame({
'Date': pd.date_range('2008-01-01', periods=500, freq='D'),
'RF1': np.random.choice([True, False], 500),
'RF2': np.random.choice([True, False], 500)})
它给出:
Date RF1 RF2
0 2008-01-01 True False
1 2008-01-02 False False
2 2008-01-03 False True
3 2008-01-04 True True
4 2008-01-05 False True
.. ... ... ...
495 2009-05-10 True True
496 2009-05-11 False True
497 2009-05-12 True True
498 2009-05-13 False False
499 2009-05-14 True True
我会首先计算每个 250 天完整周期的真实值的滚动总和,然后每 20 天对结果重新采样:
# compute the sum of True values per periods of 250 days with start and end
result = df.rolling(250, on='Date').sum().dropna().rename(
columns={'Date': 'End'}).assign(Start=df['Date'] - pd.Timedelta(249, 'D'))
# reorder columns
result = result.reindex(columns=['Start', 'End', 'RF1', 'RF2'])
# resample on every 20th day
result.resample('20D', on='Start').first().reset_index(drop=True)
它给出:
Start End RF1 RF2
0 2008-01-01 2008-09-06 126.0 123.0
1 2008-01-21 2008-09-26 124.0 120.0
2 2008-02-10 2008-10-16 126.0 122.0
3 2008-03-01 2008-11-05 127.0 121.0
4 2008-03-21 2008-11-25 121.0 129.0
5 2008-04-10 2008-12-15 122.0 122.0
6 2008-04-30 2009-01-04 120.0 122.0
7 2008-05-20 2009-01-24 120.0 120.0
8 2008-06-09 2009-02-13 119.0 119.0
9 2008-06-29 2009-03-05 118.0 127.0
10 2008-07-19 2009-03-25 112.0 124.0
11 2008-08-08 2009-04-14 114.0 134.0
12 2008-08-28 2009-05-04 113.0 133.0