Skip to content

一、Python安装

1、访问Python官网:

打开浏览器,访问Python的官方网站:https://www.python.org/

2、选择下载页面:

在官网首页,找到并点击“Downloads”按钮,进入下载页面。

3、选择操作系统和版本:

根据你的操作系统(Windows、macOS等)选择对应的下载链接。

对于Windows系统,建议选择64位版本的Python安装包。

选择 3.12.7 版本(Stable Releases)

4、下载安装包:

在选择好操作系统和版本后,点击对应的下载链接开始下载Python安装包。

安装包通常以.exe(Windows)或.pkg(macOS)等文件格式提供。

5、安装Python

(1). 运行安装包:

双击下载好的Python安装包,开始安装过程。

(2). 选择安装选项:

对于Windows系统,在安装过程中会出现多个选项。

建议选择“Customize installation”进行自定义安装,以便更灵活地选择需要安装的组件和安装路径。

在自定义安装界面中,勾选“Add Python to PATH”选项,把Python的安装路径添加到系统的环境变量中,方便在命令行中直接运行Python。

(3). 设置安装路径:

选择一个合适的安装路径来存放Python文件。

通常建议避免将Python安装在C盘的系统目录下,而是选择一个专门的文件夹进行安装。

(4). 开始安装:

点击“Install”按钮开始安装过程。安装时间可能因计算机性能和安装包大小而异,请耐心等待。

(5). 安装完成:

当安装程序显示“successful”或类似提示时,表示Python已经成功安装到计算机上。

6、验证安装

(1). 打开命令行:

对于Windows系统,可以按下Win+R组合键打开运行窗口,输入cmd后回车打开命令行窗口。

(2).检查Python版本:

在命令行窗口中输入python --version(或python -V)命令,并回车。如果Python安装成功且环境变量设置正确,命令行将显示已安装的Python版本号。

(3).测试pip安装:

pip是Python的包管理工具,用于安装和管理Python库。

在命令行窗口中输入pip命令,并回车。

如果pip安装成功且环境变量设置正确,命令行将显示pip的帮助信息和使用方法。

二 、pycharm 安装

1. 官方网站下载地址

https://www.jetbrains.com/pycharm/

2. 选择版本:

选择社区版(Community)后点击 “Download” 按钮进行下载。

3. 安装(以 Windows 系统为例):

(1). 双击安装包:找到下载好的安装程序(通常是.exe 格式的文件),双击运行它。

(2). 选择安装路径:

在安装向导的界面中,会提示你选择 PyCharm 的安装位置。建议不要将其安装在系统盘(通常是 C 盘),可以选择一个有足够空间的其他磁盘分区,然后点击 “Next”。

(3). 配置选项:

接下来会有一些配置选项,例如创建桌面快捷方式、关联文件类型等,你可以根据自己的需求进行勾选,然后点击 “Next”。

(4). 开始安装:

确认安装设置无误后,点击 “Install” 按钮开始安装。安装过程可能需要一些时间,请耐心等待。

(5). 完成安装:

安装完成后,会出现 “Finish” 按钮,点击它完成安装。此时,你可以选择是否立即启动 PyCharm。

6.首次启动配置(以社区版为例):

(1).同意协议:

首次启动 PyCharm 时,会弹出用户协议等相关提示,勾选 “我同意此协议的条款” 等类似选项,表示你同意 PyCharm 的使用条款和隐私政策,然后点击 “Continue”。

(2).选择主题:

接下来可以选择 PyCharm 的界面主题风格,例如浅色主题或深色主题等,选择后点击 “Next”。如果你不确定,可以选择默认的主题。

(3).创建项目:

进入主界面后,点击 “Create New Project” 创建一个新的项目。

在弹出的窗口中,你需要指定项目的名称、位置和 Python 解释器等信息。

如果你已经安装了 Python,PyCharm 通常会自动检测到并显示在 Python 解释器的下拉菜单中。选择好后点击 “Create” 即可创建项目。

4. 下载依赖包

终端执行

SHELL
pip install pandas == 2.2.3

三、自定义脚本编写

以sales_report 需求为例:加一列占比、降序排列

PYTHON
import pandas as pd

# 设置选项,以显示所有列
pd.set_option('display.max_columns', None)
# 设置选项,以显示所有行
pd.set_option('display.max_rows', None)
# 设置显示宽度为无限制
pd.set_option('display.width', None)

# pandas输出不使用科学计数法
pd.options.display.float_format = '{:.4f}'.format

# 定义一个函数,用于在值后添加百分号(如果值不是NaN)
def add_percent(value):
    if pd.isna(value):
        return value
    else:
        return f"{value:.1f}%"


# 定义一个函数,用于在值后添加千分位和货币符(如果值不是NaN)
def format_currency(value, currency_symbol='$'):
    if pd.isna(value):
        return value
    else:
        return f"{currency_symbol}{value:,.2f}"


#  定义加粗样式/背景色
def bold_rows(df):
    return ['background-color:#CCDBFC;font-weight: bold' if (df[('groupingid', '')] == 3)|(df[('groupingid', '')] == 1) else '' for data in df]

def convert(dataframe):

    """基于透视后的数据进行二次加工,如加行加列等"""

    # 默认所有字段均为字符串类型,如需进行计算,需要将计算列转为数值类型 ,无法转换的值被设置为 NaN
    for col in dataframe.columns:
        dataframe[col] = pd.to_numeric(dataframe[col], errors='coerce')

    # 重置索引
    dataframe = dataframe.reset_index()

    # 将Location Name为空的填充为Unknown
    dataframe[('Location Name','')] = dataframe[('Location Name','')].fillna('Unknown')

    # 填充nan 值为''
    dataframe[['Location Name','Customer Name']] = dataframe[['Location Name','Customer Name']].fillna('')

    # 将 小计/总计 的行 打上标签 【groupingid 最大的一行代表是总计,等于0是原始数据,其他的是小计】
    dataframe.loc[dataframe['groupingid'] == 1, 'Customer Name'] = 'Sub Total'
    dataframe.loc[dataframe['groupingid'] == 3, 'Location Name'] = 'Grand Total'

    # 计算每组的最大值,并赋值给每组的所有行
    dataframe[('Grand Total','max_value')] = dataframe.groupby([('Location Name','')])[[('Grand Total','Amount')]].transform('max')

    # 按每组最大值 、Location Name、groupingid 和 每组原始值 降序排序
    dataframe = dataframe.sort_values(by=[('Grand Total','max_value'),('Location Name',''),('groupingid',''),('Grand Total','Amount')], ascending=False)

    # 找到行总计,即groupingid最大的那条
    num = dataframe['groupingid'].max()

    # 加列:占比(比率)
    dataframe['% Sales'] = ((dataframe[('Grand Total', 'Amount')] / dataframe[dataframe['groupingid']==num][('Grand Total','Amount')][0]) * 100).map("{:.2f}%".format)

    # 应用该函数到指定的列上(这里需要遍历多级索引)
    for date, label in dataframe.columns:
        if label == 'MoM':
            dataframe[(date, label)] = dataframe[(date, label)].apply(add_percent)

    # 应用该函数到指定的列上(这里需要遍历多级索引)
    for date, label in dataframe.columns:
        if label == 'Amount':
            dataframe[(date, label)] = dataframe[(date, label)].apply(format_currency)


    # 重置索引为['Location Name', 'Customer Name'],这样显示的时候可能合并单元格和加粗
    dataframe = dataframe.set_index(['Location Name', 'Customer Name'])

    # 删掉无用的列
    dataframe = dataframe.drop(columns=[('Grand Total','max_value'),('rn','')])

    # 将nan处理成''
    dataframe = dataframe.fillna('')

    # 应用样式
    dataframe = dataframe.style.apply(bold_rows, axis=1)
    # 实现对齐就必须不是索引列
    # dataframe = (
    #     dataframe.style.apply(bold_rows, axis=1)
    #     .set_properties(**{'text-align': 'left'}, subset=['Location Name', 'Customer Name'])  # 字符串列左对齐
    #     .set_properties(**{'text-align': 'right'}, subset=[('2023-09','Amount'),('2023-09','MoM'),('2023-10','Amount'),('2023-10','MoM'),('2023-11','Amount'),('2023-11','MoM'),('2023-12','Amount'),('2023-12','MoM'),('2024-01','Amount'),('2024-01','MoM'),('2024-02','Amount'),('2024-02','MoM'),('2024-03','Amount'),('2024-03','MoM'),('2024-04','Amount'),('2024-04','MoM'),('2024-05','Amount'),('2024-05','MoM'),('2024-06','Amount'),('2024-06','MoM'),('2024-07','Amount'),('2024-07','MoM'),('2024-08','Amount'),('2024-08','MoM'),('2024-09','Amount'),('2024-09','MoM')])  # 数字列右对齐
    #     # .applymap(lambda x: 'color: red;' if x > 10000 else 'color: green;', subset=[])  # 正数红色,负数绿色
    # )
    # 表头(th)和单元格(td)添加黑色边框
    dataframe = dataframe.set_table_styles(
        [{'selector': 'th', 'props': [('border', '1px solid black')]},
         {'selector': 'td', 'props': [('border', '1px solid black')]}]
    )

    return dataframe


if __name__ == '__main__':

    # 读出df数据
    dataframe = pd.read_pickle(r"C:\Users\mheqi\Downloads\61baaef519c42ba2ac566e6808e5aac38645a1c71a8104e1ff0966b04f59d517000r.pkl")

    # 用自定义函数处理数据
    dataframe = convert(dataframe)

    # 打印看下数据
    # print(dataframe)

    # 由于直接打印 styled_df 在某些环境中可能不会显示所有样式,我们可以将其转换为 HTML 并查看
    html = dataframe.to_html()
    # print(html)

    # # 如果你想要保存为 HTML 文件,可以使用以下代码:
    with open('styled_df.html', 'w') as f:
        f.write(html)
    # 可导出csv文件查看数据
    # dataframe.to_csv('convert_file.csv')

如果需要使用自定义样式的方法(dataframe.style),需要安装:

shell
 pip install jinja2 == 3.1.4

四、 脚本存放

脚本命名规则:Reportid.py

暂行方式:将脚本发给我们

后续正式方式:自行上傳到指定位置即可

s3路径:以 Reportid 为 YTD_Loc&Cus_Hi-Lo_(D) 举例

s3://unis-olap/backend/prod_olap_custom_script/Accounting/ar/Cube_sales_invoice/YTD Loc&Cus Hi-Lo (D).py

五、 查看Report

脚本放到指定位置后,再次返回Report页面,刷新即可看到自定义处理后的数据。