使用 Pandas 从 Excel 文件获取逐年变化

问题描述 投票:0回答:1

我有一个看起来像这样的 Excel 文件:excel file example

每一行代表一年中的一个月,每一列是一个 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)
python pandas psycopg2
1个回答
0
投票

你可以尝试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
© www.soinside.com 2019 - 2024. All rights reserved.