Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过移动n个数据点寻找最低值_Python_Python 3.x_Pandas - Fatal编程技术网

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