Appearance
一、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页面,刷新即可看到自定义处理后的数据。