Python 函数获取从今天开始的月份值N-(x)';数据帧中的月份
我花了数小时试图编写一个函数,通过获取今天之前的过去4个月的数据来检测时间序列中的趋势。我用dt.month整理了我的月度数据,但问题是如果今天是1月,我就无法得到上一年的第12个月。以下是一个玩具数据集:Python 函数获取从今天开始的月份值N-(x)';数据帧中的月份,python,pandas,Python,Pandas,我花了数小时试图编写一个函数,通过获取今天之前的过去4个月的数据来检测时间序列中的趋势。我用dt.month整理了我的月度数据,但问题是如果今天是1月,我就无法得到上一年的第12个月。以下是一个玩具数据集: data1 = pd.DataFrame({'Id' : ['001','001','001','001','001','001','001','001','001', '002','002','002','002','002','
data1 = pd.DataFrame({'Id' : ['001','001','001','001','001','001','001','001','001',
'002','002','002','002','002','002','002','002','002',],
'Date': ['2020-01-12', '2019-12-30', '2019-12-01','2019-11-01', '2019-08-04', '2019-08-04', '2019-08-01', '2019-07-20', '2019-06-04',
'2020-01-11', '2019-12-12', '2019-12-01','2019-12-01', '2019-09-10', '2019-08-10', '2019-08-01', '2019-06-20', '2019-06-01'],
'Quantity' :[3,5,6,72,1,5,6,3,9,3,6,7,3,2,5,74,3,4]
})
为了获得所需的格式,我的数据清理如下:
data1['Date'] =pd.to_datetime(data1['Date'], format='%Y-%m')
data2 = data1.groupby('Id').apply(lambda x: x.set_index('Date').resample('M').sum())['Quantity'].reset_index()
data2['M'] =pd.to_datetime(data2['Date']).dt.month
data2['Y'] =pd.to_datetime(data2['Date']).dt.year
data = pd.DataFrame(data2.groupby(['Id','Date','M','Y'])['Quantity'].sum())
data = data.rename(columns={0 : 'Quantity'})
我的函数如下所示:
def check_trend():
today_month = int(time.strftime("%-m"))
data['n3-n4'] = data['Quantity'].loc[data['M']== (today_month - 3)]-data['Quantity'].loc[data['M']== (today_month - 4)]
data['n2-n3'] = data['Quantity'].loc[data['M'] == (today_month - 2)] - data['Quantity'].loc[data['M'] == (today_month - 3)]
data['n2-n1'] = data['Quantity'].loc[data['M'] == (today_month - 2)] - data['Quantity'].loc[data['M'] == (today_month - 1)]
if data['n3-n4'] < 0 and data['n2-n3'] <0 and data['n2-n1'] <0:
elif data['n3-n4'] > 0 and data['n2-n3'] > 0 and dat['n2-n1'] >0:
data['Trend'] = 'Yes'
else:
data['Trend'] = 'No'
print(check_trend)
这将为数据集的每一行返回相同的值,就像它只对第一行进行计算一样,如何确保为每个Id值计算它?我认为您不需要
检查趋势()
有用于此的内置函数:
让我知道这是否满足您的需要:
data2 = data1.groupby('Id').apply(lambda x: x.set_index('Date').resample('M').sum())
for k,g in data2.groupby(level='Id'):
print(g.tail(4)['Quantity'].is_monotonic_increasing)
print(g.tail(4)['Quantity'].is_monotonic_decreasing)
这是由g.tail(4)
返回的内容:
谢谢这个功能正是我所需要的,谢谢你安排我的代码!不客气!祝您的代码顺利。我刚刚注意到for语句为我的实际数据集中的所有Id返回相同的值,您认为可能会发生什么?@LeLionJaune:我不确定那里发生了什么。当我运行此命令时,我会为每个Id
获取不同的数据。
data2 = data1.groupby('Id').apply(lambda x: x.set_index('Date').resample('M').sum())
for k,g in data2.groupby(level='Id'):
print(g.tail(4)['Quantity'].is_monotonic_increasing)
print(g.tail(4)['Quantity'].is_monotonic_decreasing)
Quantity
Id Date
001 2019-10-31 0
2019-11-30 72
2019-12-31 11
2020-01-31 3
Quantity
Id Date
002 2019-10-31 0
2019-11-30 0
2019-12-31 16
2020-01-31 3