簡體   English   中英

一段時間內的累計總和

[英]cumulative sum over time period

我的數據框具有以下結構:

 date_today = dt.datetime.now()
 size=20
 df = pd.DataFrame({"usd": pd.Series(np.random.randint(1,100,size))*10,
               "sent": dt.datetime.now(),
               "temp":np.random.randint(0,15, size=size)
              })
df.sent += df.temp.map(dt.timedelta)
df.temp = np.random.randint(10,25, size=size)
df["reminder"] = df.sent + df.temp.map(dt.timedelta)
df.temp = np.random.randint(1,65, size=size)
df["completed"] = df.reminder + df.temp.map(dt.timedelta)
df.loc[df['temp']%3 == 0, ['reminder']] = [""]
df.loc[df['temp']%2 == 0, ['completed']] = [""]
df=df[["usd", "sent", "reminder", "completed"]]

usd是我請求的錢(數字),其他列是日期時間(當我請求時,何時發送提醒以及何時收到錢;最后兩個可為空)。 我還創建了以下每個月的季度列表:

date_index = []
previous_date=""
for m in range(0,14):
    month = (m%12)+1
    year = m//12
    current_date = dt.date(2019+year, month, 1)
    if previous_date:
        timedelta = current_date-previous_date
        date_index.append(previous_date+1*timedelta/4)
        date_index.append(previous_date+2*timedelta/4)
        date_index.append(previous_date+3*timedelta/4)
    date_index.append(current_date)
    previous_date = current_date

我想獲得一個具有以下結構的數據框:

df_result = pd.DataFrame(columns=["date","sent_amount","reminder_amount","completed_amount"])

其中df_result.date列是從上一點開始的date_index序列,send_amount是df.sent列小於df_result.date的記錄的df.amount列的總和,hinter_amount是df記錄的df.amount列的總和。提醒欄為<df_result.date。 我可以通過循環來實現,但是我很想學習如何使代碼更苗條。 如果您對創建隨機數據幀或一個月的季度列表有任何建議,也非常歡迎。

您可以將DataFrame meltcut日期切成date_index日期范圍,然后按變量(已完成/提醒/發送)+ date的組合進行分組,對usd金額sum ,然后將其拆散回到列中並cumsum以獲得累計總和:

x = df.melt('usd', value_name='date')
x['date'] = pd.cut(x['date'], pd.to_datetime(date_index)).apply(lambda x: x.right)
x['variable'] += '_amount'

df_result = x.dropna().groupby(['variable', 'date'])['usd'].sum().unstack(0, 0).sort_index().cumsum()

print(df_result)

輸出:

variable    completed_amount  reminder_amount  sent_amount
date                                                      
2019-03-16                 0                0         3180
2019-03-24                 0                0         8840
2019-04-01                 0             1700        10350
2019-04-08                 0             3230        10350
2019-04-16                 0             6200        10350
2019-04-23               320             6860        10350
2019-05-01              1170             6860        10350
2019-05-16              2300             6860        10350
2019-06-01              5130             6860        10350
2019-06-08              5710             6860        10350

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM