我有一個包含四列的資料框:
- 客戶編號
- 日期
- 資產
- 流動
并非所有客戶都有完整日期集的資料。在這種情況下,行會丟失。換句話說,我沒有為每個客戶提供相同數量的行。
我想計算以下內容并添加其他列:
- 超過 12m 和 3m 的資產的絕對和相對變化
- 超過 12m 和 3m 的流量總和
當無法計算統計資訊時(即前 11m),該列應使用 nan 填充。
我已經嘗試過使用 group,但是無法找到解決每個客戶端的資料長度不同這一事實的方法。
這是我的資料(前 4 列)和希望結果(最后 4 列)的示例,在 Excel 中完成: 在此處輸入影像描述
uj5u.com熱心網友回復:
如果您對每月更改感興趣,您可以添加列“months_since”,這將等于自某個日期以來的月數。
df.pivot("months_since", "Client ID", "Assets")
獲取資料的矩陣表示。如果某個客戶缺少觀察,他將有一個 nan 值。
然后很容易使用 df.rolling(12).sum() 或 df.diff(12) 計算總和/增量
uj5u.com熱心網友回復:
import pandas as pd
df_data = pd.read_excel('sample2.xlsx')
df_result_change_assets_3m = df_data.pivot_table(values = 'Assets', index = ['Client ID','Date']).unstack(['Client ID']).pct_change(3).unstack(['Date'])['Assets'].reset_index().rename(columns = {0:'Change Assets 3m (%)'})
df_result_change_assets_12m = df_data.pivot_table(values = 'Assets', index = ['Client ID','Date']).unstack(['Client ID']).pct_change(12).unstack(['Date'])['Assets'].reset_index().rename(columns = {0:'Change Assets 12m (%)'})
df_result_change_usd_assets_3m = df_data.pivot_table(values = 'Assets', index = ['Client ID','Date']).unstack(['Client ID'])
df_result_change_usd_assets_3m = df_result_change_usd_assets_3m - df_result_change_usd_assets_3m.shift(3)
df_result_change_usd_assets_3m = df_result_change_usd_assets_3m.unstack(['Date'])['Assets'].reset_index().rename(columns = {0:'Change Assets 3m (USD)'})
df_result_change_usd_assets_12m = df_data.pivot_table(values = 'Assets', index = ['Client ID','Date']).unstack(['Client ID'])
df_result_change_usd_assets_12m = df_result_change_usd_assets_12m - df_result_change_usd_assets_12m.shift(12)
df_result_change_usd_assets_12m = df_result_change_usd_assets_12m.unstack(['Date'])['Assets'].reset_index().rename(columns = {0:'Change Assets 12m (USD)'})
df_data = df_data.merge(df_result_change_assets_3m, how = 'left', on = ['Client ID','Date'])
df_data = df_data.merge(df_result_change_assets_12m, how = 'left', on = ['Client ID','Date'])
df_data = df_data.merge(df_result_change_usd_assets_3m, how = 'left', on = ['Client ID','Date'])
df_data = df_data.merge(df_result_change_usd_assets_12m, how = 'left', on = ['Client ID','Date'])
df_data
uj5u.com熱心網友回復:
我建議你把問題分成兩部分:首先你計算資產的同比增長,然后你可以專注于流量。對于第一個任務,您可以創建兩個新列以使用自聯接合并資料。您可以使用以下方法創建新列pd.tseries.offsets.MonthEnd:
data_df['date_12MonthsAfter'] = data_df['date'] pd.tseries.offsets.MonthEnd(12)
data_df['date_3MonthsAfter'] = data_df['date'] pd.tseries.offsets.MonthEnd(3)
您可以將資料與計算所需數量的兩個自聯接合并。有幾種方法可以做到這一點,我是這樣做的:
data_merged_12Months = (data_df.merge(data_df[['clientId', 'date_12MonthsAfter', 'assets']],
left_on = ['clientId', 'date'],
right_on = ['clientId', 'date_12MonthsAfter'],
how = 'left',
suffixes=['', '_prevYear'])).drop(['date_12MonthsAfter',
'date_3MonthsAfter',
'date_12MonthsAfter_prevYear'], axis = 1)
data_merged_3Months = (data_df.merge(data_df[['clientId', 'date_3MonthsAfter', 'assets']],
left_on = ['clientId', 'date'],
right_on = ['clientId', 'date_3MonthsAfter'],
how = 'left',
suffixes=['', '_prevQuarter'])).drop(['assets',
'flow',
'date_12MonthsAfter',
'date_3MonthsAfter',
'date_3MonthsAfter_prevQuarter'], axis = 1)
data_merged_assets = data_merged_12Months.merge(data_merged_3Months, on = ['clientId', 'date'])
data_merged_assets['perc yoy'] = (data_merged_assets['assets'] - data_merged_assets['assets_prevYear'])/data_merged_assets['assets_prevYear']
data_merged_assets['perc qoq'] = (data_merged_assets['assets'] - data_merged_assets['assets_prevQuarter'])/data_merged_assets['assets_prevQuarter']
對于流量計算,你必須用零替換黑色單元格,你可以用方法來做,.str.replce('', '0')而不是你必須在int. 為了計算過去 12 個月和 3 個月的總和,我找到了這個解決方案
data_merged_assets['flow'] = (data_merged_assets.str.replace('', '0')).astype(int)
data_flow_12Months = data_merged_assets.groupby(['clientId']).rolling(on = 'date', window=12, min_periods=12)["flow"].sum().reset_index()
data_flow_3Months = data_merged_assets.groupby(['clientId']).rolling(on = 'date', window=3, min_periods=3)["flow"].sum().reset_index()
data_flow = data_flow_12Months.merge(data_flow_3Months, on = ['clientId', 'date'], suffixes = ['_sumLast12Months', '_sumLast3Months'])
最后,我合并了兩個資料集。
data_merged = data_merged_assets.merge(data_flow, on = ['clientId', 'date'])
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/482318.html
上一篇:附加熊貓列資料
下一篇:連續洗掉重復的熊貓
