每一行代表一年中的一个月,每一列是一个 user_ID,单元格是用户在一个月内花费的美元。
该文件每月更新几次,我并不总是获得上个月(例如 2024 年 6 月)的数据,直到有时直到一个月后(例如 7 月底)。
使用 Pandas 计算所有用户总体支出同比变化的最佳方法是什么?上一年期间(例如 2023 年 5 月)没有任何支出的用户以及当前期间(例如 2024 年 5 月)没有数据的用户应被排除在外。在此示例中,我想计算第二季度的同比变化,因此这意味着仅包括用户 2、3、5,但也包括 2024 年 5 月,这意味着用户 2、3、 4, 5.
使用 psycopg2 将其添加到 PSQL 数据库中会更容易吗?
这是我迄今为止尝试过的:
import datetime
import pandas as pd
# import psycopg2
def open_file(path):
df = pd.read_excel(path, skiprows=53,
nrows=140, usecols="M:CCL")
users = df.columns[1:-1]
cur_month_vals = []
prev_month_vals = []
cur_month = '2024-05-01'
prev_month = '2023-05-01'
for user in df[1:-1]:
try:
if cur_month in df.columns and prev_month in df.columns:
cur_spend = df.loc[cur_month, facility]
print(user, cur_month, cur_spend)
prev_spend = df.loc[pre_month, facility]
print(cur_spend/prev_spend)
except:
print("user not in", user)
你可以尝试pd.shift:
import pandas as pd
data = {1: [None, None, 1, 2,3,4,5,6,7,8,9,10,11,12,13,14],
2: [None, 5, 1, 2,3,4,5,6,7,8,9,10,11,12,13,14],
3: [None, 1, 1, 2,3,4,5,6,7,8,9,10,11,None,None,None],
'date': [f'{y}-{m:02}' for y in [2023,2024] for m in range(1,13)][0:16]
}
df = pd.DataFrame(data).set_index('date')
(df - df.shift(12)).sum(axis=1)
输入:
1 2 3
date
2023-01 NaN NaN NaN
2023-02 NaN 5.0 1.0
2023-03 1.0 1.0 1.0
2023-04 2.0 2.0 2.0
2023-05 3.0 3.0 3.0
2023-06 4.0 4.0 4.0
2023-07 5.0 5.0 5.0
2023-08 6.0 6.0 6.0
2023-09 7.0 7.0 7.0
2023-10 8.0 8.0 8.0
2023-11 9.0 9.0 9.0
2023-12 10.0 10.0 10.0
2024-01 11.0 11.0 11.0
2024-02 12.0 12.0 NaN
2024-03 13.0 13.0 NaN
2024-04 14.0 14.0 NaN
结果:
date
2023-01 0.0
2023-02 0.0
2023-03 0.0
2023-04 0.0
2023-05 0.0
2023-06 0.0
2023-07 0.0
2023-08 0.0
2023-09 0.0
2023-10 0.0
2023-11 0.0
2023-12 0.0
2024-01 0.0
2024-02 7.0
2024-03 24.0
2024-04 24.0
dtype: float64