Python 通过移动n个数据点寻找最低值
我有以下数据帧:Python 通过移动n个数据点寻找最低值,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有以下数据帧: num Out[89]: Date 2015-07-06 33 2015-07-07 20 2015-07-08 4 2015-07-09 3 2015-07-10 8 .. 2020-06-29 14 2020-06-30 13 2020-07-01 18 2020-07-02 20 2020-07-03 28 Length: 1228, dtype: int64 我想每n天在移
num
Out[89]:
Date
2015-07-06 33
2015-07-07 20
2015-07-08 4
2015-07-09 3
2015-07-10 8
..
2020-06-29 14
2020-06-30 13
2020-07-01 18
2020-07-02 20
2020-07-03 28
Length: 1228, dtype: int64
我想每n天在移位的基础上应用num.lt5之类的东西。例如,如果它能够找到5,但第二天的值较低,为4,然后为3,那么每隔3天它就会记录值3。因此,基本上应该发生的是小于5,但最小值在未来3天内最低。我该怎么做
例如:
Date
2015-07-06 33
2015-07-07 20
2015-07-08 4
2015-07-09 3
2015-07-10 8
在2015年7月8日,该值为4,如果我使用lt5,则该值为真,但第二天为3。我希望它记录3,而不是4和3,因为3是最低值。每隔3天检查一次。因此,如果在2015年7月8日开始检查状况,则应在2015年7月11日之前的3天内检查最低值。你能告诉我这是可以做到的吗
编辑:
因此,只要lt5为真,就将是起点,接下来的3天是需要找到最低值的地方。搜索应该只在lt5的下一个起点的间隔结束时开始,这就是您要查找的吗
import pandas as pd
df = pd.DataFrame(
columns=['Date', 'X'],
data=[['2015-07-06', 33],
['2015-07-07', 20],
['2015-07-08', 4],
['2015-07-09', 3],
['2015-07-10', 8]],
)
df = df.sort_values('Date', ascending=False)
df['rolling_min'] = df.X.rolling(window=3, min_periods=0).min().astype(int)
df = df.sort_values('Date', ascending=True)
返回
Date X rolling_min
2015-07-06 33 4
2015-07-07 20 3
2015-07-08 4 3
2015-07-09 3 3
2015-07-10 8 8
如果您只想修改值小于5的日期,可以使用以下方法:
df['X'] = df.apply(lambda x: x['X'] if x['X'] > 5 else x['rolling_min'], axis=1)
我猜你需要索引。一旦你得到了这些,你就可以随心所欲地操作数据了
df = pd.DataFrame(data = {
"data":[3, 2, 77, 655, 4, 5, 444, 5, 444, 5, 456, 456, 45, 34, 34, 88]
})
a = 0
increment = 3
b = increment
l = []
while b<df.shape[0]:
a = df.iloc[a:b, 0].idxmin() + 1
l.append(a)
b = a + increment
print(l)
[2, 5, 6, 8, 10, 13] #for increment =3
不确定是否准确理解,在2015-07-08的情况下,由于该值小于5,您希望在未来3天内检查。因为在接下来的3天里会有一个3,也就是说会小到4,你想用3来代替4吗?您只想在原点值低于5的情况下执行此操作,或者您想在所有日期执行此操作?@Ben.T仅适用于原点值低于5的情况。因此,在lt5起始点之后找到的最小值。在起始点之后,是否要找到接下来3天的最小值?它是否包括起始点,即从检测到值小于5的点算起4天?@kait感谢您的回答。在日期'2015-07-09'达到3,该日期低于4,因此仅显示3以及该日期。下一个最低值将在2015-07-10至2015-07-13的未来3天内,这将显示该时间间隔内的最低值。低于5是起点,但是从起点开始的未来3天内的最低值。我不确定我是否理解您想要的逻辑。你能为样本数据发布所需的输出吗?我已经添加了我正在尝试做的事情的图像,谢谢!
data = {
'date': pd.date_range('2015-07-06', periods=20, freq='D'),
'value': [2, 3, 10, 20, 33, 20, 4, 3, 8, 9, 2, 3, 4, 1, 4, 7, 4, 5, 7, 20]
}
df = pd.DataFrame(data)
df['log'] = df['value']
increment = 4
i = 0
while i < df.shape[0]:
# Start find the lowest value in the range
if df.loc[i, 'log'] < 5:
# Find lowest the range
lowest = df.loc[i, 'log']
for j in range(1, increment):
if df.loc[i+j, 'log'] > 5:
break
if lowest > df.loc[i+j, 'log']:
lowest = df.loc[i+j, 'log']
# Update value to the lowest value in the range
df.loc[i, 'log'] = lowest
for j in range(1, increment):
if df.loc[i+j, 'log'] < 5:
df.loc[i+j, 'log'] = lowest
i += increment
else:
i += 1
date value log
0 2015-07-06 2 2
1 2015-07-07 3 2
2 2015-07-08 10 10
3 2015-07-09 20 20
4 2015-07-10 33 33
5 2015-07-11 20 20
6 2015-07-12 4 3
7 2015-07-13 3 3
8 2015-07-14 8 8
9 2015-07-15 9 9
10 2015-07-16 2 1
11 2015-07-17 3 1
12 2015-07-18 4 1
13 2015-07-19 1 1
14 2015-07-20 4 4
15 2015-07-21 7 7
16 2015-07-22 4 4
17 2015-07-23 5 5
18 2015-07-24 7 7
19 2015-07-25 20 20
import pandas as pd
import numpy as np
df = pd.DataFrame(columns=['date', 'number'],
data=[['2020-01-01', 3],
['2020-01-02', 2],
['2020-01-03', 77],
['2020-01-04', 655],
['2020-01-05', 4],
['2020-01-06', 5],
['2020-01-07', 444],
['2020-01-08', 5],
['2020-01-09', 444],
['2020-01-10', 5],
['2020-01-11', 456],
['2020-01-12', 456],
['2020-01-13', 45],
['2020-01-14', 34],
['2020-01-15', 34],
['2020-01-16', 88],
['2020-01-17', 2]])
new_df = []
interval = 3
interval_temp = 0
for index, row in df.iterrows():
if row[1] <= 5 and index >= interval_temp:
lowest = row[1]
for i, row in df[index:index+interval+1].iterrows():
if row[1] <= lowest:
lowest_temp = [row[0], row[1]]
lowest = row[1]
new_df.append(lowest_temp)
interval_temp = index + interval
new_df = pd.DataFrame(columns=['date', 'number'], data= new_df)
date number
0 2020-01-02 2
1 2020-01-05 4
2 2020-01-10 5
3 2020-01-17 2