StyleFrame row_index AttributeError: 'int' object has no attribute 'value'
StyleFrame row_index AttributeError: 'int' object has no attribute 'value'
我正在尝试以编程方式创建一个电子表格来存储一些 AWS 数据,方法是采用 Excel 模板并向其中添加新数据。我决定为此使用 StyleFrame 来保留格式。我已经设法以我想要的格式将数据连接在一起,但是当我尝试将其写入 Excel 文件时,我将 运行 保留在索引问题中。
堆栈跟踪的相关部分是:
File "/Users/jaybailey/PycharmProjects/CostReports/lambdas/build_cost_reports/build_cost_reports.py", line 143, in create_organisation_cost_report
org_report.to_excel(create_report_name(organisation)).save()
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/styleframe/style_frame.py", line 421, in to_excel
export_df.index = [row_index.value for row_index in export_df.index]
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/styleframe/style_frame.py", line 421, in <listcomp>
export_df.index = [row_index.value for row_index in export_df.index]
AttributeError: 'int' object has no attribute 'value'
我尝试将数据类型更改为“对象”,重置索引,然后手动将其重置到位。我也尝试过使用调试器,这让我意识到我的错误——我影响的是数据框,而不是样式框。我发现 StyleFrame 上的 row_indexes 属性是由整数组成的元组,这使得错误更有意义。我试图手动更改它,但该属性是只读的。
鉴于 row_indexes 属性无法更改,来自 StyleFrame,并且缺少 StyleFrame 本身要求的值,所以我决定在这里询问。这是我正在查看的代码部分。
org_report = styleframe.StyleFrame.read_excel(f'{organisation.type}{TEMPLATE_SUFFIX}')
report_data = transform_aws_service_costs_to_excel_rows(organisation_costs)
report_data = pandas.DataFrame(report_data)
# Used to make sure the data concatenates properly.
report_data.columns = org_report.columns
org_report.data_df = concat([org_report.data_df.iloc[:4], report_data,
org_report.data_df.iloc[5:]], axis=0).reset_index(drop=True)
org_report.to_excel(create_report_name(organisation)).save() # Error occurs here.
我知道辅助函数很难完全理解。 create_report_name 只是创建一个类型为“YYYY-MM-DD-Organisation_Name_Cost_Report.xlsx”的字符串。 report_data 产生以下输出:
TOTAL SPEND ... Monthly Change
0 Amazon Relational Database Service ... -4.38%
1 Amazon Elastic Compute Cloud - Compute ... -3.65%
2 EC2 - Other ... 1.25%
3 AWS Premium Support ... -100.0%
4 AmazonCloudWatch ... -2.36%
5 Amazon Detective ... -0.45%
6 Amazon Simple Storage Service ... 6.38%
7 AWS CloudTrail ... -7.46%
8 Amazon Elastic Load Balancing ... -6.34%
9 AWS Lambda ... -2.3%
10 Other ... 255.49%
org_report 在我尝试将其写入 Excel 文件之前看起来像这样,大部分仍然填充了虚拟数据。
TOTAL SPEND 2 mo.ago Last Month Monthly Change
0 Total Organisational Spend 5.0 6.0 0.2
1 nan nan nan nan
2 AWS SERVICES nan nan nan
3 Total 5.0 6.0 0.2
4 Amazon Relational Database Service 196994 188361 -4.38%
5 Amazon Elastic Compute Cloud - Compute 106007 102134 -3.65%
6 EC2 - Other 72467.6 73373.5 1.25%
7 AWS Premium Support 40442.2 0 -100.0%
8 AmazonCloudWatch 32248.8 31488.9 -2.36%
9 Amazon Detective 20903.7 20809.1 -0.45%
10 Amazon Simple Storage Service 19415.6 20655.3 6.38%
11 AWS CloudTrail 12135.8 11230 -7.46%
12 Amazon Elastic Load Balancing 10617.6 9944.26 -6.34%
13 AWS Lambda 8258.99 8069.12 -2.3%
14 Other 21762.7 77363.8 255.49%
15 SUBCATEGORIES nan nan nan
16 DIRECTORS nan nan nan
17 Total 5.0 6.0 0.2
18 nan nan nan nan
19 SHARED PRODUCTS nan nan nan
20 Total 5.0 6.0 0.2
21 nan nan nan nan
22 Subcategory Total 5.0 6.0 0.2
23 Subcategory Cost Coverage 1.0 1.0 0.0
如有任何建议,我们将不胜感激!
问题主要出在这一行:
org_report.data_df = concat([org_report.data_df.iloc[:4], report_data,
org_report.data_df.iloc[5:]], axis=0).reset_index(drop=True)
这打破了底层 .data_df
因为 pd.concat
和 .reset_index
return 一个标准的 DataFrame 而 StyleFrame 期望每个“单元格”都包含一个包装器 Container
对象(错误中缺少 .value
属性)。
最佳做法是尽可能多地处理 pandas 级别的数据,并且仅在准备好开始样式设置和导出时才创建 StyleFrame 对象。
org_report = pd.read_excel(f'{organisation.type}{TEMPLATE_SUFFIX}')
report_data = transform_aws_service_costs_to_excel_rows(organisation_costs)
report_data = pandas.DataFrame(report_data)
# Used to make sure the data concatenates properly.
report_data.columns = org_report.columns
org_report= concat([org_report.iloc[:4], report_data,
org_report.iloc[5:]], axis=0).reset_index(drop=True)
sf = styleframe.StyleFrame(org_report)
sf.to_excel(create_report_name(organisation)).save()
我正在尝试以编程方式创建一个电子表格来存储一些 AWS 数据,方法是采用 Excel 模板并向其中添加新数据。我决定为此使用 StyleFrame 来保留格式。我已经设法以我想要的格式将数据连接在一起,但是当我尝试将其写入 Excel 文件时,我将 运行 保留在索引问题中。
堆栈跟踪的相关部分是:
File "/Users/jaybailey/PycharmProjects/CostReports/lambdas/build_cost_reports/build_cost_reports.py", line 143, in create_organisation_cost_report
org_report.to_excel(create_report_name(organisation)).save()
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/styleframe/style_frame.py", line 421, in to_excel
export_df.index = [row_index.value for row_index in export_df.index]
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages/styleframe/style_frame.py", line 421, in <listcomp>
export_df.index = [row_index.value for row_index in export_df.index]
AttributeError: 'int' object has no attribute 'value'
我尝试将数据类型更改为“对象”,重置索引,然后手动将其重置到位。我也尝试过使用调试器,这让我意识到我的错误——我影响的是数据框,而不是样式框。我发现 StyleFrame 上的 row_indexes 属性是由整数组成的元组,这使得错误更有意义。我试图手动更改它,但该属性是只读的。
鉴于 row_indexes 属性无法更改,来自 StyleFrame,并且缺少 StyleFrame 本身要求的值,所以我决定在这里询问。这是我正在查看的代码部分。
org_report = styleframe.StyleFrame.read_excel(f'{organisation.type}{TEMPLATE_SUFFIX}')
report_data = transform_aws_service_costs_to_excel_rows(organisation_costs)
report_data = pandas.DataFrame(report_data)
# Used to make sure the data concatenates properly.
report_data.columns = org_report.columns
org_report.data_df = concat([org_report.data_df.iloc[:4], report_data,
org_report.data_df.iloc[5:]], axis=0).reset_index(drop=True)
org_report.to_excel(create_report_name(organisation)).save() # Error occurs here.
我知道辅助函数很难完全理解。 create_report_name 只是创建一个类型为“YYYY-MM-DD-Organisation_Name_Cost_Report.xlsx”的字符串。 report_data 产生以下输出:
TOTAL SPEND ... Monthly Change
0 Amazon Relational Database Service ... -4.38%
1 Amazon Elastic Compute Cloud - Compute ... -3.65%
2 EC2 - Other ... 1.25%
3 AWS Premium Support ... -100.0%
4 AmazonCloudWatch ... -2.36%
5 Amazon Detective ... -0.45%
6 Amazon Simple Storage Service ... 6.38%
7 AWS CloudTrail ... -7.46%
8 Amazon Elastic Load Balancing ... -6.34%
9 AWS Lambda ... -2.3%
10 Other ... 255.49%
org_report 在我尝试将其写入 Excel 文件之前看起来像这样,大部分仍然填充了虚拟数据。
TOTAL SPEND 2 mo.ago Last Month Monthly Change
0 Total Organisational Spend 5.0 6.0 0.2
1 nan nan nan nan
2 AWS SERVICES nan nan nan
3 Total 5.0 6.0 0.2
4 Amazon Relational Database Service 196994 188361 -4.38%
5 Amazon Elastic Compute Cloud - Compute 106007 102134 -3.65%
6 EC2 - Other 72467.6 73373.5 1.25%
7 AWS Premium Support 40442.2 0 -100.0%
8 AmazonCloudWatch 32248.8 31488.9 -2.36%
9 Amazon Detective 20903.7 20809.1 -0.45%
10 Amazon Simple Storage Service 19415.6 20655.3 6.38%
11 AWS CloudTrail 12135.8 11230 -7.46%
12 Amazon Elastic Load Balancing 10617.6 9944.26 -6.34%
13 AWS Lambda 8258.99 8069.12 -2.3%
14 Other 21762.7 77363.8 255.49%
15 SUBCATEGORIES nan nan nan
16 DIRECTORS nan nan nan
17 Total 5.0 6.0 0.2
18 nan nan nan nan
19 SHARED PRODUCTS nan nan nan
20 Total 5.0 6.0 0.2
21 nan nan nan nan
22 Subcategory Total 5.0 6.0 0.2
23 Subcategory Cost Coverage 1.0 1.0 0.0
如有任何建议,我们将不胜感激!
问题主要出在这一行:
org_report.data_df = concat([org_report.data_df.iloc[:4], report_data,
org_report.data_df.iloc[5:]], axis=0).reset_index(drop=True)
这打破了底层 .data_df
因为 pd.concat
和 .reset_index
return 一个标准的 DataFrame 而 StyleFrame 期望每个“单元格”都包含一个包装器 Container
对象(错误中缺少 .value
属性)。
最佳做法是尽可能多地处理 pandas 级别的数据,并且仅在准备好开始样式设置和导出时才创建 StyleFrame 对象。
org_report = pd.read_excel(f'{organisation.type}{TEMPLATE_SUFFIX}')
report_data = transform_aws_service_costs_to_excel_rows(organisation_costs)
report_data = pandas.DataFrame(report_data)
# Used to make sure the data concatenates properly.
report_data.columns = org_report.columns
org_report= concat([org_report.iloc[:4], report_data,
org_report.iloc[5:]], axis=0).reset_index(drop=True)
sf = styleframe.StyleFrame(org_report)
sf.to_excel(create_report_name(organisation)).save()