如何在Python中找到增减趋势

时间:2019-05-22 15:30:18

标签: python pandas numpy

我正在尝试逐行比较数据框的不同列

for (i= startday to endday)
    if(df[i]<df[i+1])
    counter=counter+1
    else
    i=endday+1

目标是发现增加(或减少)趋势(需要连续) 我的数据看起来像这样

df= 1 2 3 0 1 1 1
    1 1 1 1 0 1 2
    1 2 1 0 1 1 2 
    0 0 0 0 1 0 1 

(在此示例中,开始日期到结束日期为7,但实际上这两个值不稳定)

因此,我希望找到这个{2,0,1,0},由于我的数据很大(120万),因此我需要它能够快速运行。由于时间限制,我尝试不使用循环(例如,如果有的话)

我尝试了下面的代码,但是在条件为假的情况下找不到停止计数的方法

import math
import numpy as np
import pandas as pd

df1=df.copy()   
df2=df.copy()
bool1 = (np.less_equal.outer(startday.startday, range(1,13)) 
            & np.greater_equal.outer(endday.endday, range(1,13))
            )

bool1= np.c_[np.zeros(len(startday)),bool1].astype('bool')

bool2 = (np.less_equal.outer(startday2.startday2, range(1,13)) 
            & np.greater_equal.outer(endday2.endday2, range(1,13))
            )

bool2= np.c_[bool2, np.zeros(len(startday))].astype('bool')


df1.insert(0, 'c_False',math.pi)
df2.insert(12, 'c_False',math.pi)
#df2.head()
arr_bool = (bool1&bool2&(df1.values<df2.values))

df_new = pd.DataFrame(np.sum(arr_bool , axis=1), 
                        index=data_idx, columns=['coll'])

df_new.coll= np.select( condlist = [startday.startday > endday.endday],
                         choicelist = [-999], 
                         default = df_new.coll)

1 个答案:

答案 0 :(得分:1)

在末尾添加零,然后使用np.diff,然后使用argmin得到第一个“非正数”:

(np.diff(np.hstack((df.values, np.zeros((df.values.shape[0], 1)))), axis=1) > 0).argmin(axis=1)
>> array([2, 0, 1, 0], dtype=int64)