Python 如何从数据框中找到在至少3个月内销售额增长的所有卖家?

Python 如何从数据框中找到在至少3个月内销售额增长的所有卖家?,python,sql,Python,Sql,这更多的是SQL问题,需要在SQL和Python中实现。我不知道这个的SQL查询 我在python中尝试过这一点,但它似乎不够聪明。有更好的方法吗 df = pd.DataFrame({ 'Seller_id': [121,121,121,121,121, 321,321,321,321,321, 597,597,597,

这更多的是SQL问题,需要在SQL和Python中实现。我不知道这个的SQL查询

我在python中尝试过这一点,但它似乎不够聪明。有更好的方法吗

df = pd.DataFrame({
                    'Seller_id': [121,121,121,121,121,
                                  321,321,321,321,321,
                                  597,597,597,597,597,],
                    'Months': ['Jan', 'Feb', 'Mar', 'Apr', 'May',
                              'Jan', 'Feb', 'Mar', 'Apr', 'May',
                              'Jan', 'Feb', 'Mar', 'Apr', 'May',],
                    'Sales_amount': [100,87,95,105,100,
                                    100,87,95,105,110,
                                    100,105,95,100,110]

})
df.head()
数据提取代码
希望这对python部分有所帮助,但对SQL不太确定

def last_N_consecutive_period_increase(df,period = 3):
    for seller_df in df.groupby("Seller_id"):
        if(sum(seller_df[1].tail(period+1).Sales_amount.diff(periods = 1)>0) == period):
            yield seller_df[0]

for sales_id in last_N_consecutive_period_increase(df,period = 3):
    print(sales_id)


另一种方法可以如下所示,假设您收到日期列或能够在日期列中解析月份

df['months'] = df['months'].apply(lambda x: '01-{}-2019'.format(x))
df['months'] = pd.to_datetime(df['months'])

df['sales_diff'] = df.groupby('seller_id')['sales_amount'].diff(periods=1)
df['sales_diff_sign'] = np.sign(df.sales_diff)

df_sales_3_mo_cnt = df.groupby('seller_id')['sales_diff_sign'].apply(lambda x : (x > 0).sum()).reset_index(name='cnt')
df_sales_3_mo_cnt[df_sales_3_mo_cnt.cnt >2]

您的意思是至少连续三个月?您的表在SQL中是什么样子的?也许我们可以从这个开始,帮助您使用SQLquery@Giorgos实际上,在任何3个月内都会有无数个问题,但在最后3个月内连续获得这些问题会更好。谢谢你[赵永康]写了这么好的解决方案,也给了我连续和任意3个月的选择。很高兴我能帮上忙:)谢谢@VishRajpal,但不幸的是,我得到了错误@
pd.to_datetime(df['months'])
,因为months缩写,但我想一旦得到修复,rest将正常工作。再次感谢!我更新了答案,将日期编码为01年和2019年。正如我所说的,我假设您可以从原始数据本身获得粒度数据,并且它应该可以工作
def any_N_period_increase(df, period = 3):
    for seller_df in df.groupby("Seller_id"):
        if(sum(seller_df[1].Sales_amount.diff(periods = 1)>0) >= period):
            yield seller_df[0]

for sales_id in any_N_period_increase(df, period = 3):
    print(sales_id)
df['months'] = df['months'].apply(lambda x: '01-{}-2019'.format(x))
df['months'] = pd.to_datetime(df['months'])

df['sales_diff'] = df.groupby('seller_id')['sales_amount'].diff(periods=1)
df['sales_diff_sign'] = np.sign(df.sales_diff)

df_sales_3_mo_cnt = df.groupby('seller_id')['sales_diff_sign'].apply(lambda x : (x > 0).sum()).reset_index(name='cnt')
df_sales_3_mo_cnt[df_sales_3_mo_cnt.cnt >2]