使用 Python 自动化数据透视表(创建、过滤和提取)
使用 PyWin32 实现自动化
自动化数据透视表并从过滤后的数据透视表中提取数据。省点时间喝杯茶吧。
在使用 Python 自动化 Excel中,包含对象、属性、方法和事件的 Excel 对象模型的概念是共享的。用 Python pywin32
库访问 Excel 中的对象、属性和方法的技巧也用例子进行了解释。
现在,让我们用透视表来利用 Excel 报表的自动化,这是 Excel 中最精彩的功能之一!
为什么选择 PyWin32?
你可能会好奇为什么我们不用pandas
库中的pandas.DataFrame.pivot
或pandas.DataFrame.pivot_table
来代替呢?这是一个内置的库,我们甚至不需要安装它。
嗯,上面提到的两个pandas
函数可以很容易地创建数据透视表,但是如果你正在准备一个其他域用户可以访问的 Excel 报表,创建的硬编码数据透视表可能不适合他们,因为他们不能修改数据透视表字段。
数据透视表字段。图片作者。
上图显示了 Excel 中数据透视表的数据透视表字段,数据透视表根据游戏类型显示了不同地区的视频游戏销售额。使用交互式 Excel 数据透视表,领域用户可以自由选择任意数量的国家显示在数据透视表中,而由pandas
创建的硬编码数据透视表不能这样做。
在下面的例子中,使用的数据集是来自 Kaggle 的 PS4 游戏销售数据。那么,用来创建数据透视表的脚本就是参考 Trenton McKinney 创建的笔记本,如何用 Python win32com 模块在 Excel 中创建数据透视表。在 McKinney 的笔记本中,他定义了用 Python 创建综合数据、数据透视表和 Excel com 对象的函数(他还展示了如何用 Excel VBA 实现)。
他很好地优化了脚本,因此,在下面的例子中,McKinney 的脚本将用于在 Excel 中创建数据透视表。然后,我将解释如何访问数据透视表的组件,修改数据透视表的过滤器,并使用 Python 提取过滤后的数据以供进一步分析。
为了更清楚地描述我们在下面的例子中要做的事情,让我解释一下这个例子的输入和输出。输入是 CSV 格式的 PS4 游戏销售额,如下图所示。
数据快照。作者创建的图像。
这些属性包括游戏的名称、出版年份、游戏类型、出版商以及游戏在北美、欧洲、日本、世界其他地区的销量和全球销量。基于这些数据,我们将创建一个数据透视表,根据游戏类型来展示 PS4 游戏在每个地区的总销售额。下图显示了我们将使用 Python pywin32
库创建的数据透视表。
在 Excel 中创建的数据透视表。作者创建的图像。
创建数据透视表并用 pywin32 操作它
以下部分有五个部分:
- 导入库
- 读取和处理数据集
- 创建数据透视表
- 访问数据透视表的方法和属性
- 修改数据透视表的过滤器并提取过滤后的数据
导入库
import win32com.client as win32
import pandas as pd
import numpy as np
from pathlib import Path
import re
import sys
win32c = win32.constants
读取和处理数据集
df = pd.read_csv("PS4_GamesSales.csv", encoding = 'unicode_escape', engine ='python')# remove null values
df = df.dropna()# write the csv file to xlsx File to create Pivot Table
df.to_excel("PS4_GamesSales.xlsx", sheet_name = 'Sales', index = False)
由于数据集中存在特殊字符,在读取 CSV 文件时需要定义encoding
。有兴趣的话,这里有编码的参考。
需要注意的一点是,当我们导出以后要用来创建透视表的数据时,我们必须设置index = False
。如果没有,我们可能会在创建数据透视表时遇到问题,因为该函数无法判断哪一行是标签行还是标题行。
创建数据透视表
创建数据透视表的脚本修改自 McKinney 的笔记本。脚本包含三个函数,分别是 pivot_table()
、run_excel()
和main()
。
pivot_table()
函数用于将数据字段分配到各自的透视表字段中(过滤器、列、行和值)。
该函数的最后一部分用于修改 Excel 对象模型的透视表对象的属性“行总计”和“列总计”值的可见性,其他属性请参见此处的。
下一个功能是run_excel()
。该函数用于创建 Excel 对象,然后为透视表创建新的工作表。将添加到数据透视表字段的数据字段(筛选器、列、行和值)将在此定义。
透视表创建后,wb.Save()
将保存 Excel 文件。如果不包含这一行,创建的数据透视表将会丢失。如果您正在运行此脚本以在后台或计划的作业中创建数据透视表,您可能希望分别通过wb.Close(True)
和excel.Quit()
关闭 Excel 文件并退出 Excel 对象。这样,您就不需要在作业完成后手动关闭 Excel 文件。或者,您可以设置excel.Visible = False
,那么 Excel 文件将不会从头开始打开。
main()
函数为主函数,它会调用run_excel()
函数,然后run_excel()
函数会执行pivot_table()
函数。
如果您运行该函数两次,将会出现错误,因为数据透视表被编程为在名为“pivot_table”的工作表中创建,而该工作表已在第一次运行中创建,您可以更改 pt_name 或删除在第一次执行中创建的工作表。
错误消息。作者创建的图像。
访问数据透视表的属性
可以通过操作数据透视表对象(数据透视表对象引用)的两个方法和五个属性来研究或修改数据透视表:
方法
- 清除所有过滤器
- 透视项目
性能
- 当前页面(分组在数据透视字段对象下)
- 页面范围
- 行字段
- 列字段
- 表格范围 1
数据透视表的属性。作者创建的图像。
上图显示了数据透视表的 CurrentPage、PageRange 和 TableRange1。数据透视表字段的行字段和列字段如下图所示。
数据透视表属性。作者创建的图像。
上面提到的数据透视表方法和属性将在示例中使用,以提取过滤后的数据透视表的数据并保存到 DataFrame 中。
首先,创建 Excel 对象。虽然 Excel 对象是在创建数据透视表的过程中创建的,但我们仍然需要再次创建它,因为 Excel 对象是在函数中创建的,不能结转。
f_path = Path.cwd()
f_name = 'PS4_GamesSales.xlsx'
filename = f_path / f_name
# create excel object
excel = win32.gencache.EnsureDispatch('Excel.Application')# excel can be visible or not
excel.Visible = True # False
wb = excel.Workbooks.Open(filename)
pvtTable = wb.Sheets("pivot_table").Range("A3").PivotTable
页面范围和当前页面属性,清除所有过滤器方法
页范围指的是透视表的筛选字段(字段名和值),如下图所示。
PageRange 和 CurrentPage。作者创建的图像。
CurrentPage 是指过滤器的值,用于设置一个过滤器的值,而 Page Range 返回当前过滤器及其值。
下面的脚本打印页面范围,然后清除所有过滤器。
page_range_item = []
for i in pvtTable.PageRange:
page_range_item.append(str(i))
print(page_range_item)pvtTable.PivotFields("Year").ClearAllFilters()
为了提供更清晰的信息,下面的 GIF 显示了运行上面脚本的结果。我在开始时手动设置过滤器,然后打印页面范围。之后,脚本清除了所有过滤器,然后再次打印页面范围。GIF 还展示了pywin32
有多棒,因为我们可以立即看到对 Excel 的更改。
作者创建的 GIF。
pvtTable.PivotFields("Year").CurrentPage = "2020"
page_range_item = []
for i in pvtTable.PageRange:
page_range_item.append(str(i))
print(page_range_item)
现在,让我们使用当前页面的透视字段属性来修改过滤器。
作者创建的 GIF。
因为我们必须在修改当前页面时指定 Pivot 字段,所以它只能用于一次修改一个过滤器的值。
在本例中,我们仅使用一个值进行过滤。过滤多个值的方法显示在最后一个示例中,这也是修改数据透视表过滤器然后提取过滤数据的完整示例。
行字段/列字段
行字段和列字段将列出创建透视表时透视表字段中添加到行字段或列字段的所有字段。
row_fields_item = []
for i in pvtTable.RowFields:
row_fields_item.append(str(i))
print(row_fields_item)column_fields_item = []
for i in pvtTable.ColumnFields:
column_fields_item.append(str(i))
print(column_fields_item)
在我们的例子中,行字段是“类型”,而列字段是自动生成的“值”。但是,我们可以用下面的脚本禁用它。
wb.Sheets("pivot_table").PivotTables("example").DisplayFieldCaptions = False
下面的 GIF 说明了上面脚本的结果。
作者创建的 GIF。
“值”和“行标签”是字段标题,而不是数据字段。脚本与下面的操作相同。
作者创建的 GIF。
表格范围 1
TableRange1 打印不带页范围的数据,如果还想打印页字段,可以参考透视表的 TableRange2 属性。
table_data = []
for i in pvtTable.TableRange1:
#print(i)
table_data.append(str(i))
print(table_data)
表区域 1 属性以列表形式返回结果。
要将列表转换成数据帧,我们需要知道数据透视表的实际维度。通过在创建透视表的脚本中添加pt_fields
并为行项目的列添加 1,可以很容易地确定列的数量。在本例中,pt_fields
中有五个项目,“北美总销售额”、“欧洲总销售额”、“日本总销售额”、“世界其他地区总销售额”、“全球总销售额”。所以有了number of columns = 5 + 1 = 6
。
复杂的部分是确定行数。在本文的示例中,有三行是根据列字段标题(“值”)、数据透视表字段行(“北美总销售额”、“欧洲总销售额”、“日本总销售额”、“世界其他地区总销售额”、“全球总销售额”)和列的总计构建的。其他行是经过过滤后的行字段中的项。****
我通过使用 RegEx 删除列字段(" Values “)和pt_fields
项、其他标签(如"行标签”、“列标签”、“总计"和"无”)以及数据透视表中的所有数值,获得了行字段中的项数。
在获得数据透视表的列数和行数之后,可以将表范围 1 中的列表整形为 DataFrame。
将列表重塑为作者创建的数据帧图像。
在这个阶段,数据帧不能检测到正确的标题,即表格的第二行。因此,我们将第二行(row index = 1)设置为 header,然后删除前两行。有多种方法可以做到这一点,您可以重命名该列,然后删除前两行。
df.columns=df.iloc[1]
df = df.drop(index = 0)
df = df.drop(index = 1)
修改数据透视表的过滤器并提取过滤后的数据
现在,让我们将所有内容结合起来,根据条目列表修改过滤器,然后提取过滤后的数据透视表数据并将其保存为 DataFrame。
# Find all items in Year
year_items = []
for item in pvtTable.PivotFields("Year").PivotItems():
year = str(item)
year_items.append(year)year_to_include = ['2013','2014','2015']
year_to_exclude = [x for x in year_items if x not in year_to_include]
在我们修改过滤器之前,知道过滤器中包含的项目的确切数量是很重要的。在我们的例子中,过滤器是“年”。这一步可以通过使用 Pivot Table 方法来完成,Pivot Items()如上面的脚本所示。
下面是修改过滤器的完整函数,然后将过滤后的数据透视表提取为 DataFrame。
让我们在下面的 GIF 中见证这一点。
作者创建的 GIF
额外收获:创建不同数据透视表的多个工作表
收到关于如何创建不同数据透视表的多个工作表的询问。我们可以修改run_excel()
函数来实现。
我们只需要复制脚本中设置和调用pivot_table()
函数的部分。记得根据需要修改细节。最重要的是,我们需要更改保存新工作表标题和新工作表对象的变量名。如果没有,您可能想知道为什么在工作簿中只创建了一个数据透视表。😂我在下面的代码中加粗了您可能需要注意的变量名。
# Setup second pivot table and call pivot_table**ws3_name** = 'pivot_table_2'
wb.Sheets.Add().Name = **ws3_name**
**ws3** = wb.Sheets(**ws3_name**)pt_name = 'example' # must be a string
pt_rows = ['expense'] # must be a list
pt_cols = ['products'] # must be a list
pt_filters = ['date'] # must be a list# [0]: field name [1]: pivot table column name [3]: calulation method [4]: number format
pt_fields = [['price', 'price: mean', win32c.xlAverage, '$#,##0.00']] # must be a list of listspivot_table(wb, ws1, **ws3**, **ws3_name**, pt_name, pt_rows, pt_cols, pt_filters, pt_fields)
谢谢你读到这里,这是我知道的一篇长文。这之后还有一点,如果你想在工作中使用pywin32
,这是必不可少的。
你可能面临的错误
错误。作者图片
在执行创建数据透视表的脚本时,我遇到过几次这样的错误。幸运的是,我在栈溢出上找到了解决方案。解决办法很简单。我们只需要删除下面脚本返回的路径中的文件夹标题“00020813–0000–0000–C000–00000000046 x 0x 1 x 9”。
import win32com
print(win32com.__gen_path__)
由于这是一个周期性(不是每天)出现的重复问题,我建议您运行以下脚本,在显示错误时直接删除文件夹。
import win32com
import shutil
path = win32com.__gen_path__
shutil.rmtree(path)
边注
如果你对 Excel 对象模型的对象、方法和属性感到困惑,或者想知道如何将 Excel VBA 的脚本翻译成 Python,可以看看用 Python 自动化 Excel。
如果您有兴趣使用 Python 创建图表或数据透视图,并将其自动导出为图像,请使用 Python 自动制作 Excel 图表。
如果你有兴趣知道如何使用pywin32
访问 Microsoft Outlook 邮件和下载附件,你可以参考这篇文章“用 Python 自动下载邮件附件”。
如果您的工作使用 Google Sheet 而不是 Microsoft Excel,您可以参考这篇文章“自动化 Google Sheet Report”以了解可能的自动化。
保持联系
在 YouTube上订阅
参考
祝贺并感谢你阅读到最后。希望你喜欢这篇文章。 ☺️
亚历山大·莱多戈罗夫在 Unsplash 上的照片
5 分钟内自动完成谷歌表单报告
每月自动将报告发送给你的老板,无需担心
您是否曾经使用 google sheets 收集数据,与您组织中的每个人共享这些数据,以便输入他们的每周、每月数据,如绩效报告、库存报告或 KPI 数据报告?之后,你将不得不每月提取数据来进行编译。
如果这些重复的行为可以自动化,并且最终报告可以每月通过电子邮件发送给相关人员(比如你的老板),那该有多好?是的,这篇文章可以帮助你实现这个目标!
自动化流程的图示。作者图片
场景:贵公司希望每月有一定数量的客户在贵公司的 40 多家零售店中查询特定产品的信息。
1.数据收集和报告生成
根据您的偏好设置您的数据收集表,例如,下图:
数据收集电子表格。作者图片
注意,最后一行是用户输入的最新数据,它是使用 google sheet 公式捕获的,如下所示:
=INDEX(B1:B13,Max(MATCH("zzz",B1:B13),Match(143^143,B1:B13)))
此公式自动捕获用户在特定区域(在本例中为列)的最新输入,公式中的数据用于绘制下图:
报告中所需的图表。作者图片
在这一步结束时,您已经有了最新的报告和每月报告的图表。
2.设置 Google 应用程序脚本
设置 Google 企业应用套件脚本。作者图片
进入工具 → 脚本编辑器打开并授权 Google Apps 脚本,你会注意到一个名为 Code.gs 的文件在你屏幕的左侧,代码区在你屏幕的右侧。
Google Apps 脚本的接口。作者图片
将以下代码粘贴到内部:
function sendEmails() {// Get the sheet where the data is, in sheet 'system'
var sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Sheet1")// Get the data of particular cell, in this case, i need only the total cell (F14)
var data = sheet.getRange('F14').getValues();// Get all the chart in the sheets
const chartBlobs = new Array();
const emailImages = {};
const charts = sheet.getCharts();
charts.forEach(function(chart, i){
chartBlobs[i] = chart.getAs("image/png");
emailImages["chart"+i] = chartBlobs[i];
});// Send email
MailApp.sendEmail({
to: "you@gmail.com,"yourboss@gmail.com"",
subject: "Customer Enquiries as of " + new Date(),
htmlBody: "Customer Enquiries Data: <br>" +
"Total: " + data + "<br>",
inlineImages:emailImages
});
}
通过保存并单击顶部的 Run 按钮来测试代码。您将收到一封电子邮件,如下所示:
电子邮件报告。作者图片
根据您的偏好定制您的报告,并使其符合您组织的格式。
3.安排每月电子邮件
太好了,现在你有一个很好的报告生成功能,可以在你按下时触发。接下来,我们将设置爆破功能的触发器。Google App Script 根据用户需求提供了几种类型的触发器,分别是:
- 事件驱动,如表单被编辑、打开或表单提交
- 时间驱动、每小时、每周或每月
- 按日期排列的日历
功能触发。作者图片
在我的情况下,我希望有一个每月计时器,它将在每月 6 日自动触发该功能(如下图),因为我已经告诉所有分行经理在每月 4 日前更新信息。
设置我的每月功能触发器。作者图片
最后,保存触发器,你就有了你的自动邮件报告系统,它将在 5 分钟内每月发送给你的老板,而不需要任何额外的步骤!
最后的话:
我经常发现,由于缺乏知识,在大多数组织中,资源被花费在可以自动化的任务上。因此,我决定在接下来的文章中写更多对组织有益的生产力技巧,这将包括使用多种编码语言,如 pythons 和 Google Apps 脚本。
我的其他生产力文章:
最后,感谢您花时间阅读我的文章!
参考资料:
[## 使用 Python 自动化 Excel
towardsdatascience.com](/automate-excel-with-python-7c0e8c7c6256) https://aryanirani123.medium.com/send-charts-in-email-using-google-apps-script-d652dc752468 https://www.benlcollins.com/apps-script/google-apps-script-beginner-guide/
针对具有远视的多个模型的自动超参数调整
犯错是人之常情,随机犯错在统计学上是神圣的
由 Unsplash 上的 Katarzyna Pe 拍摄
在我以前的博客中,我讨论了如何创建一个定制的 sklearn 转换器来自动化数据处理。如果你还没看过那篇文章,你可以在这里看看。让我们向前行驶吧!
本文将创建一个自动化的超参数调优模块,它与 sklearn 的 transformer 管道协同工作。我将在这个过程中使用远视。
Hyperopt 被设计为适应基于高斯过程和回归树的贝叶斯优化算法。
总之是一定要比 Sklearn 的原生版 GridSearchCV 快。
资料组
如果我的第一篇文章是 TL;博士,我找到你了!
数据帧头
我实现的转换后的管道会处理丢失的值、异常值整理任务和规范化。简而言之,一旦您 fit_transform ,您的数据就为模型训练做好了准备!
定义搜索空间
现在,你知道超参数(你当然知道!这就是你在这里的原因!).任何最大似然优化函数将试图最小化在某些模型参数上定义的损失函数。但是,这并没有改变算法本身的框架。我们在超参数的帮助下实现了这一点!简单。
第一步是定义一个 搜索空间 。简单地说,列出你的模型应该迭代的所有可能的超参数范围。例如,我已经为我将要考虑的 6 种不同算法定义了搜索空间。它们是:
- KNearestNeighbors 基于实例
- 逻辑回归—线性算法
- SVC —基于内核
- XGBClassifier —增强集成
- QDA:基于歧视
同样,你可以插入任何与 sklearn API :p 兼容的型号
搜索空间定义
我选择了这些算法来涵盖主要类型。他们不打算赢得卡格尔比赛!
如何选择包含哪个参数?
答案是,这完全取决于您和您的用例。所以,我建议你了解这些算法是如何工作的,以及它们重要的可控参数。
注意:有一个特定的符号来定义搜索空间。它应该解决管道中步骤的顺序问题。例如,我们的模型管道(见下文)被标记为’模型,'制作我们的符号’模型 _ _ 参数名称。'同样,如果您将管道命名为’clf,‘它将是’clf _ _ param _ name’
远视者的骨骼
远视有两个基本组成部分:
- 我们有一个试图优化的 optimize()函数:P
定义目标函数
2.我们有 fmin 函数,它将使用搜索空间中定义的一组超参数迭代调用优化函数。
定义控制器功能
这是仅有的两个基本步骤。如果你想了解更多关于远视,请随时查看他们的网页。(或者,谷歌一下)
就差一句台词了!
我们通过这个简单的访问从我们的小实验中获得了最好的模型:
best_params['model']SVC(C=0.15499999999999997, degree=2, gamma=391.91004869541047)
最后,我们检查我们的分类报告。
模型验证
就是这样!!现在,为您的用例即插即用您的模型。建议广泛研究你的超参数!!
结论
本文粗略浏览了使用超点为多个模型创建自动化超参数调优。我们已经使用 Sklearn 的 transformer 管道在一个步骤中预处理数据。由于 hyperopts 是模型不可知的,我们可以通过定义目标函数和控制器 fmin 函数来即插即用任何具有交叉验证和参数装饰的模型。很简单!
点击 可以访问 的完整代码。
布雷特·乔丹在 Unsplash 上拍摄的照片
作者不是蝙蝠侠!
感谢您的支持!希望有帮助:)
如果你想得到一些想法,你可以通过 Linkedin 联系我!
使用 Python 自动化 Microsoft Excel 和 Word
将 Excel 与 Word 集成,无缝生成自动化报告
艾萨克·史密斯在 Unsplash 上拍摄的照片
毫无疑问,微软的 Excel 和 Word 是公司和非公司领域使用最广泛的两个软件。它们实际上是“工作”这个术语本身的同义词。通常,没有一个星期我们不把这两者结合起来,并以这样或那样的方式利用它们的优点。虽然对于一般的日常目的来说,不会要求自动化,但有时自动化是必要的。也就是说,当您有大量的图表、数字、表格和报告要生成时,如果您选择手动方式,这可能会成为一项非常乏味的工作。嗯,不一定非要那样。事实上,有一种方法可以在 Python 中创建一个管道,您可以无缝地将两者集成在一起,在 Excel 中生成电子表格,然后将结果传输到 Word 中,几乎即时生成报告。
Openpyxl
认识一下 Openpyxl,它可以说是 Python 中最通用的绑定之一,它使得与 Excel 的交互简直就像在公园里散步。有了它,您可以读写所有当前和传统的 excel 格式,即 xlsx 和 xls。Openpyxl 允许你填充行和列,执行公式,创建 2D 和 3D 图表,标记轴和标题,以及大量其他可以派上用场的功能。然而,最重要的是,这个包使您能够在 Excel 中迭代无数的行和列,从而将您从以前必须做的所有讨厌的数字计算和绘图中解救出来。
Python-docx
然后出现了 Python-docx——这个包对于 Word 就像 Openpyxl 对于 Excel 一样。如果你还没有研究过他们的文档,那么你或许应该看一看。毫不夸张地说,自从我开始使用 Python 以来,Python-docx 是我使用过的最简单、最容易理解的工具包之一。它允许您通过自动插入文本、填写表格和将图像渲染到您的报告中来自动生成文档,而没有任何开销。
事不宜迟,让我们创建自己的自动化管道。继续启动 Anaconda(或您选择的任何其他 IDE)并安装以下软件包:
pip install openpyxlpip install python-docx
Microsoft Excel 自动化
首先,我们将加载一个已经创建的 Excel 工作簿(如下所示):
workbook = xl.load_workbook('Book1.xlsx')
sheet_1 = workbook['Sheet1']
图片由作者提供。
随后,我们将迭代电子表格中的所有行,通过将电流乘以电压来计算并插入功率值:
for row in range(2, sheet_1.max_row + 1):
current = sheet_1.cell(row, 2)
voltage = sheet_1.cell(row, 3)
power = float(current.value) * float(voltage.value)
power_cell = sheet_1.cell(row, 1)
power_cell.value = power
完成后,我们将使用功率的计算值来生成一个折线图,该折线图将插入到指定的单元格中,如下所示:
values = Reference(sheet_1, min_row = 2, max_row = sheet_1.max_row, min_col = 1, max_col = 1)
chart = LineChart()
chart.y_axis.title = 'Power'
chart.x_axis.title = 'Index'
chart.add_data(values)
sheet_1.add_chart(chart, 'e2')
workbook.save('Book1.xlsx')
自动生成的 Excel 电子表格。图片由作者提供。
提取图表
现在我们已经生成了图表,我们需要将其提取为图像,以便在 Word 报告中使用。首先,我们将声明 Excel 文件的确切位置,以及输出图表图像应该保存的位置:
input_file = "C:/Users/.../Book1.xlsx"
output_image = "C:/Users/.../chart.png"
然后使用以下方法访问电子表格:
operation = win32com.client.Dispatch("Excel.Application")
operation.Visible = 0
operation.DisplayAlerts = 0
workbook_2 = operation.Workbooks.Open(input_file)
sheet_2 = operation.Sheets(1)
随后,您可以迭代电子表格中的所有图表对象(如果有多个图表对象),并将它们保存在指定位置,如下所示:
for x, chart in enumerate(sheet_2.Shapes):
chart.Copy()
image = ImageGrab.grabclipboard()
image.save(output_image, 'png')
passworkbook_2.Close(True)
operation.Quit()
Microsoft Word 自动化
现在我们已经生成了图表图像,我们必须创建一个模板文档,它基本上是一个普通的 Microsoft Word 文档。docx)完全按照我们希望的方式来制定我们的报告,包括字体、字体大小、格式和页面结构。然后,我们需要做的就是为我们的自动化内容创建占位符,即表格值和图像,并用变量名声明它们,如下所示。
Microsoft Word 文档模板。图片由作者提供。
任何自动化内容都可以在一对双花括号{{ variable_name }}中声明,包括文本和图像。对于表,您需要创建一个包含所有列的带有模板行的表,然后您需要用下面的符号在上面和下面各添加一行:
第一排:
{%tr for item in *variable_name* %}
最后一排:
{%tr endfor %}
在上图中,变量名为
- table_contents 用于存储表格数据的 Python 字典
- 字典关键字的索引(第一列)
- 字典值的功率、电流和电压(第二、第三和第四列)
然后,我们将模板文档导入 Python,并创建一个存储表值的字典:
template = DocxTemplate('template.docx')
table_contents = []for i in range(2, sheet_1.max_row + 1):
table_contents.append({
'Index': i-1,
'Power': sheet_1.cell(i, 1).value,
'Current': sheet_1.cell(i, 2).value,
'Voltage': sheet_1.cell(i, 3).value
})
接下来,我们将导入之前由 Excel 生成的图表图像,并创建另一个字典来实例化模板文档中声明的所有占位符变量:
image = InlineImage(template,'chart.png',Cm(10))context = {
'title': 'Automated Report',
'day': datetime.datetime.now().strftime('%d'),
'month': datetime.datetime.now().strftime('%b'),
'year': datetime.datetime.now().strftime('%Y'),
'table_contents': table_contents,
'image': image
}
最后,我们将呈现带有值表和图表图像的报告:
template.render(context)
template.save('Automated_report.docx')
结果
这就是自动生成的 Microsoft Word 报表,其中包含在 Microsoft Excel 中创建的数字和图表。这样,您就有了一个完全自动化的管道,可以根据您的需要创建尽可能多的表格、图表和文档。
自动生成的报告。图片由作者提供。
源代码
如果您想了解更多关于数据可视化和 Python 的知识,请随时查看以下(附属链接)课程:
使用 Streamlit 开发 Web 应用程序:
使用 Python 实现数据可视化:
面向所有人的 Python 专业化:
GitHub 资源库:
https://github.com/mkhorasani/excel_word_automation
☕喜欢这个教程?在这里随意给我捐一杯咖啡。
新到中?您可以在此订阅并解锁无限文章。
使用 Google Sheets 和 Apps 脚本将多个 CSV 文件自动转换为 BigQuery 管道
将一些简单的数据放入 BigQuery,而不必使用大量工具或复杂的工作流
https://unsplash.com/photos/JKUTrJ4vK00
想要将 CSV 文件的多个管道自动加载到不同的 BigQuery 项目/数据集/表,并从单个 Google Sheet 控制它们吗?什么事?那么这篇文章就送给你了。
这个过程甚至允许您配置是否希望自动化在每次向 BigQuery 表中截断或追加数据。不错吧?
背景
不久前,我写了一个使用 Google Apps 脚本将 CSV 文件加载到 BigQuery 的过程。这个过程在代码中使用了检测到的 CSV 文件类型的定义、BigQuery 的加载模式以及其他一些东西。我意识到对于入门者来说,这可能是多余的,需要他们自己写太多的代码。因此,我重写了这个过程,使之更加简单,使用一个 Google Sheet 作为管道管理器。
先决条件
- 谷歌账户
- 谷歌应用程序脚本—【script.google.com
- 谷歌大查询项目、数据集、表—console.cloud.google.com
- 此谷歌表单的副本
- 要加载到 BigQuery 的 CSV 文件
- 来自这个仓库的代码
Google 工作表和驱动设置
首先,将 google sheet 复制到你自己的 google 账户中。然后创建一些 Google Drive 文件夹来存放您的 CSV 文件。
您将需要一个谷歌驱动器“源”文件夹为每一个不同类型的 CSV。如果你愿意,你可以有多个“已处理”文件夹,或者如果你希望所有的东西都在同一个地方,你可以有同一个“已处理”文件夹。这真的取决于你。
然后,您将在适当的列中用 Google Drive ID 更新 Google 工作表。在浏览器中使用 Google Drive 时,ID 位于 URL 的末尾。例如:如果 Google Drive 文件夹的 URL 是https://Drive . Google . com/Drive/u/0/folders/1-zfa 8 svucirp xf J2 Cun 31 a,那么 Drive 文件夹的 ID 就是“1-zfa 8 svucirp xf J2 Cun 31 a”,这就是你要放入 Google Sheet 的列中的内容。
BigQuery 设置
对于要加载的每种 CSV 类型,您都需要一个 BigQuery 表。如果你有 4 种不同的 CSV 文件,那么你需要 4 个不同的表格。这些可以跨任意数量的 BigQuery 项目和数据集进行拆分,但是最终每个 CSV 类型都需要一个表。
如果您已经设置了 BigQuery 表,那么您需要做的就是用适当的信息(项目 ID、数据集 ID、表 ID)更新 Google 工作表
如果您需要创建一个新的 BigQuery 表,最简单的方法(无需编写任何代码)是通过 BigQuery 控制台上传一个 CSV,并使用 Autodetect 为您设置模式。然后,该类型 CSV 的每个后续加载将保证工作。
上传 CSV 以创建 BigQuery 表:
- 【https://console.cloud.google.com/bigquery 号
- 单击左侧导航栏上的项目名称
- 单击 3 点菜单并创建一个新数据集
- 点击数据集名称,然后点击创建表
当您的表被创建时,将它的 ID 与项目 ID 和数据集 ID 一起放入 Google Sheet。
创建您的应用程序脚本项目并配置代码
到目前为止,您应该已经有了一个 Google Sheet,其中填充了许多关于您的 Google Drive 文件夹、您的 BigQuery 项目/数据集/表的详细信息,现在剩下要做的就是将代码放入适当的位置,使它们一起工作。
在 Google 表单中,打开脚本编辑器。在撰写本文时,如果你使用的是个人 gmail.com 账户,这将通过工具- >脚本编辑器菜单项实现。如果您使用的是组织/学校帐户,这将通过扩展- >应用程序脚本菜单项实现。
这将打开应用程序脚本编辑器。
从这个 github 存储库中复制 code.gs 文件内容,并粘贴到现有的 Code.gs 文件中。
单击+图标添加一个新的 HTML 文件,并将其命名为“email ”,这样您的文件列表如下所示:
从同一个 github 存储库中复制 email.html 文件内容,并将其粘贴到 Apps 脚本中的 email.html 文件中。
使用左侧服务菜单旁边的+图标添加 BigQuery 和 Drive 服务(因此您的服务列表看起来也像上面的截图)。
打开 Code.gs 文件并更新文件顶部的变量。您可以在这里设置诸如工作表标签名称(如果您已经从原始模板中更改了它们)以及该流程也可以发送的电子邮件通知中的信息。
就是这样。这就是你需要做的所有设置。
让这东西跑起来,好吗?
- 将适当类型的 CSV 文件放入 Google 工作表指定的 Google Drive 文件夹中
- 在应用程序脚本中,单击顶部的运行按钮,运行列出的唯一函数
- 当你第一次运行这个程序时,谷歌会询问你是否确定,以一些安全/批准提示的形式。这是正常的…这是您授权访问您的应用程序脚本项目,以便能够使用您的 Google Drive、BigQuery 和 Gmail 内容/服务。这是不允许谷歌或其他任何人对你的帐户做事情。只要确保你不与其他人分享谷歌表单,他们可能会用它来做一些邪恶的事情(因为他们也可以看到和编辑这些代码)。
- 这些提示看起来有点像这样:
- 之后…脚本将第一次运行。
- 检查 Google Sheet 的日志选项卡,看看它是否做了什么。
- 现在,为了好玩,再放几个 CSV 到文件夹中,然后再次运行该函数。看…成功了!
- 接下来,您将希望设置一个触发器来按计划自动运行该功能。只需使用应用程序脚本项目左侧的触发器菜单来设置触发器,如下所示:
现在…真的是这样。简单吧?
您可以在 BigQuery 控制台中看到自动化作业的结果——在 BigQuery 中查看作业,然后查看数据集和表,您应该会很快看到表中的数据。如果你改变了这个网址中的 id…这就是你应该去查看的地方:https://console.cloud.google.com/bigquery?project=id&page =乔布斯(这也在谷歌表单日志中)。
万岁!
希望这比的原始文章/方法更容易理解,并且不需要使用很多工具或复杂的工作流程就可以将一些简单的数据导入 BigQuery。
我知道这个过程可以通过从 CSV 文件中自动检测模式来改进,以创建初始表,并且应该有更多的错误处理…但是…这是为了后面的提交和拉请求:-)
下面是代码:https://github . com/usaussie/app script-multiple-big query-pipelines-Google-sheet
这篇文章大概贴在techupover.com和techupover.medium.com上。也可以在 Twitter 上关注我 @techupover
原载于 2021 年 10 月 28 日【https://www.techupover.com】。
使用 Python 自动重命名和组织文件
学习使用 Python 重命名和自动化您的文件组织!
使用 Python 自动重命名和组织文件!(来源:Nik Piepenbreier)
你知道你每天收到的那些销售报告吗?标有East-Sales-01Jan2021.xlsx
、East-Sales-01Jan2021.xlsx
等的?说你希望他们被称为2021–01–01 — East Sales
。
您可以手动逐个重命名它们。或者您可以使用 Python 的魔力!
在本文中,您将学习如何使用pathlib
库来:
- 根据模式重命名文件,以及
- 将文件组织到逻辑文件夹中
如果你想跟随视频教程,请点击这里查看我的视频:
我们开始吧!
要加载我将在本教程中使用的示例文件,您可以从这个链接下载它们。只要解压它们,把文件夹放在你喜欢的任何地方。
现在,让我们加载我们将使用的两个库:
我们将使用datetime
来捕获和转换文件名中的日期。我们还将使用pathlib
来重命名文件并将其移动到逻辑文件夹中。
Python 的 pathlib 是如何工作的?
Python 的pathlib
是一个面向对象的框架,用于处理和操作文件路径。它是在 Python 3.4 中引入的,因此任何 3.4 或更高版本都可以使用本教程。
Pathlib 允许我们创建具有许多不同属性和方法的 path 对象,我们可以使用它们来深入了解我们的文件或操纵它们。
让我们创建一个 path 对象,并检查该路径的一些属性。将你保存文件夹的目录加载到our_files
变量中。(注意:如果你正在使用 Windows,通过在你的字符串前面放置一个r
,把你的字符串变成一个原始字符串以防止转义反斜杠。)
我们在上面的代码中所做的是创建一个Path
对象,并将其赋给一个名为our_files
的变量。这样做的好处是,我们现在可以访问这两个属性,并对该对象应用方法。
例如,我们已经检查了路径代表的是文件(False)还是目录(True)。我们还打印出了父路径、路径的词干和后缀(在本例中是空白的)。
用 Pathlib 重命名文件
使用 Pathlib 提供的面向对象的方法,我们可以轻松地访问路径的元素并进行修改。
.iterdir()
方法返回存储在该目录中的所有项目的生成器对象。让我们打印出这些项目,以确保它正确地捕获了我们的文件:
这样做的好处是,我们现在可以对目录中的每个文件进行迭代和操作!解决了这个问题,让我们开始修改文件名结构。
这里还有一点要解开,让我们一步步来看:
- 我们使用
.iterdir()
方法遍历目录中的每个文件 - 然后,我们创建两个有用的变量来存储每个文件的目录和扩展名
- 我们将旧文件名(使用
.stem
属性创建的)解包成有意义的名称(区域、报告类型和旧日期) - 因为我们想要更改日期格式,所以我们将日期字符串转换成 datetime 对象,然后再转换回具有我们想要的输出格式的字符串。(注:我们先用
.strptime()
,再用.strftime()
。 - 最后,我们创建一个 new_name 变量,它使用 f 字符串将其他字符串连接成一个文件名。(如果您要打印出一个新的 _name,它会是这样的:
/Users/nikpi/Desktop/Files/2021–01–01 — East — Sales.xlsx
) - 要重命名文件,我们调用文件本身的
.rename()
方法,传入目录和新名称的连接。
唷!好的,太棒了!你已经走到这一步了。如果您满足于仅仅重命名文件,现在可以自由运行您的代码了。它会立即做出改变(Mac OS 和 Windows 不允许你点击“撤销”——所以要小心!).
如果你也想把每个月的文件组织到文件夹中,请继续阅读。
用 Pathlib 移动文件
因为我们可以访问 Pathlib 对象的许多不同元素,所以我们可以使用这些元素将我们的文件组织到有意义的文件夹中。
自动移动文件到不同的文件夹!资料来源:Nik Piepenbreier
例如,如果您想将您的文件组织到它们所属的每个月的文件夹中,我们可以使用 Pathlib 来自动完成这项工作。
我将在这里重复一些早期的代码,以便当您想要立即运行它时,它们都在那里:
让我们一点一点地分解我们在这里所做的事情。我为您提供了步骤编号,以便于您更容易地理解,因为一些代码已经更改:
- 我们添加了一个条件来检查文件是否实际上是一个文件(而不是一个目录)。(提示:如果你运行的是 Mac,有时讨厌的文件叫做“.DS_Store”获得添加。条件的第二部分针对这些进行检查)
- 我们创造了和以前一样有用的变量。
- 我们将日期转换成更有用和可排序的格式。
- 我们将月份以字符串格式存储在
month
变量中。然后我们使用.joinpath()
方法通过插入一个字符串作为参数来创建一个新路径。 - 然后我们使用
.exists()
方法检查文件夹是否存在,该方法返回一个布尔值。如果文件夹不存在,那么我们创建文件夹。 - 这里,我们创建了一个新的 path 对象,它将新文件名加入到新文件夹中。
- 最后,我们使用
.replace()
方法,将文件移动到那个路径。需要注意的是,如果该文件已经存在,它将被覆盖。为了避免这种情况,您可以编写一个条件来首先检查这一点。
现在剩下的就是点击运行!这将更改所有文件名,并将它们移动到新创建的文件夹中。
结论—自动化很有趣!
感谢阅读本教程!我希望你发现它在管理你的文件方面是有用的,并且看看你如何能更进一步。
例如,您可以添加条件以仅修改某些文件类型,并且您可以设置自动清理混乱的下载文件夹的方式。
想要更多这样的教程,可以考虑订阅我的 YouTube 频道,我经常在那里发布像这样的教程。点击下面的按钮订阅!
点击此处订阅。图片由 stickpng.com 提供)
使用 Faker 和 PostgreSQL 为 Django 项目自动生成样本大数据
为您的数据密集型项目在几秒钟内生成可重复使用的大型模拟数据集
在处理数据密集型应用程序时,总是需要生成大量模拟数据,以便在多种场景中进行测试。在大多数情况下,我们需要在几分钟内(如果不是几秒钟)生成大型数据集的方法。在我的例子中,我们需要一个模拟数据集用于我们的 UAT 环境 IoT,并验证 API 和查询的性能。我曾经在 CSV 中生成数据,并将数据移动到数据库中。但这似乎效率低下。如果数据集尚未保存,则必须生成,然后我们需要维护、集成和运行一个独立的 python 脚本。
我以前在一些情况下使用过 Django 管理命令。由于我们当前的一些后端运行在 Django 中,并且是用 ORM 管理的,我认为有一个生成模拟数据集的管理命令会很好。事实证明,这不仅对我,而且对整个团队和管理人员都非常有益。
如果你没有编写过定制管理命令,或者需要一份编写定制管理命令的参考资料,试试这个。尽可能地使用它。它不仅可以与您的 Django 应用程序很好地集成,而且您还可以充分利用 Django 的 ORM,从使用对象到运行聚合策略。
我非常依赖的一个软件包是 Faker ,用于生成虚假数据集,如用户名、电子邮件、公司名称。但是还有最后一个缺失的部分——时间序列数据的生成。这就是 PostgreSQL 生成系列的用武之地。它提供了创建时间序列等系列数据的有效方法。
我为一个物联网应用程序创建了一个包含三个模型的 Django 项目样本,安装了 Faker 库,并将其连接到本地 Postgres 数据库。
- 应用程序用户注册用户数据
- 用户设备为用户添加传感器设备
- 设备数据按时间顺序捕获新增用户设备的温度和湿度。
数据库模式和模型:
现在将模型映射到相应的 admin.py。我喜欢 Django 的一点是管理页面。
我通常设计模式,并用 Django-admin 创建数据层的快速模型,包括过滤器、搜索、数据导出、只读字段。
在我的组织中有一个需求,我们需要从 excel(一个计数表)中提取数据。有多个表,每个表都有很多信息,有些单元格有基于月份的财务数据,如 account_no、credit、debit、closing-balance 和 opening-balance,有些表有非每月的非结构化数据。所有这些数据集都按类别存储。我想到了一个关于表单类型的可配置模型层的小点子。
根据类别数据类型的配置,在理货数据页面上输入的数据将应用该公式并计算最终金额。
不仅如此,它的编码方式是,当计数表被上传到一个类别时,提取和计算也会基于配置发生。这是在很短的时间内完成的,结果证明它非常有活力,非常有用。
如果您是 Pythonista,只要知道如何将设计好的模式转换成模型并创建管理页面映射,就可以为您节省大量创建数据层的时间。它还会为您的数据层提供一个漂亮、时尚的 UI。
是的,我明白了,这和这篇文章没有关系。但是如果你是 python 开发人员、数据分析师或科学家,Django 管理层会给你很多支持和帮助。我总是用 Django admin 来原型化我的数据层。
关于 Django admin 已经说得够多了。现在你可以在 Django-admin 中创建一个用户和一些与用户相关的设备。我已经创建了一个用户和一个设备。现在让我们使用原始 SQL 为设备生成数据。
PostgreSQL generate-series 是一个非常强大的系列数据生成函数,可以在几分钟内创建数百万条记录。
让我们为我们创建的 ID 尝试一个示例生成系列函数
插入到设备数据(日期时间,用户设备 id,温度,湿度)
选择
日期时间,
用户设备 id,
random()*100 作为温度,
random()*100 作为湿度
从 generate_series(now() —间隔’ 3 年’,now(),间隔’ 1 小时’)作为 g1(日期时间),
generate_series(1,1)作为 g2(用户设备 id)
我们正在为我们创建的设备插入 3 年的每小时数据
你可以看到快速的数据生成与 Postgres 生成系列。现在将它与 Faker 和 Django ORM 结合起来,您就可以将任何 Django 应用程序的样本数据生成脚本集成到您的代码库中。
这些是我遵循的步骤:
- 从用户处获取总用户和相关设备的数量作为输入。
- User Faker(faker.name())来创建模拟用户名。
- 然后用 Django bulk_create 批量插入那些用户数据和设备数据
- 然后用上面的原始 SQL 传递必要的参数,迭代地为设备生成数据。
通过这种方式,我们现在可以将样本数据集生成作为代码与 Django 中的 MVT 一起维护。
以下是输出:
或者,您仍然可以在 psycopg2 中使用等效的 SQLAlchemy ORM 或纯 python 本身。随意发挥你的想法。我之前用过 python,CSV,还有 pandas_to_sql 。虽然这很快,但与生成系列相比,它差远了。在我的一个示例项目中,我能够在 20 分钟内生成 2100 万条包含相关数据的记录。但要警惕的是,随着数据的增加,插入速度往往会变得缓慢。
完整的代码在 GitHub 中。
模拟数据——一种生成可预测数据并测试不可测试数据的方法
开心嘲讽和数据叠加!!
使用 Pyautogui 自动提取 SAP 报告
从世界上最乏味的任务中节省时间的指南。
介绍
报告是任何业务的基础。在日常生活中,你必须以某种方式从报告中吸收新数据,以决定每天的下一步。该报告可以采用各种格式,如 Microsoft Excel、Web 应用程序或从企业资源规划系统(ERP)导出。
我最近收到一个请求,要求我构建一个仪表板,在精心制作的报告中复制业务编号。财务团队每月手动创建此报告。最繁琐的过程是从 SAP 系统中导出源文件,并手动将其放入 excel 中。之后,他们必须调整一些数字,因为这是用户定义的公式无法计算的边缘情况。
在我看来,如果我们以相同的逻辑从 SAP 表的源表开始,我们可以不用做很多手工任务就可以导出报表。我第一次也是这么想的。
复制这些数字将是一项简单的任务。逻辑似乎很简单。但是,当我深入研究细节时,我发现所有这些数字都经过了许多底层 SAP 业务规则的处理。此外,业务规则是如此的动态,对于一个不完全理解整个流程的人来说,很难复制它。
经过一段时间的反复试验,我决定不再继续复制过程。我要花一个多月的时间才能理解所有内容,并将 SAP ABAP 语言转换成另一种我可以使用的语言。有时候,我们需要让一些事情保持原样。不要碰它,即使你认为它会是一个伟大的方式在未来这样做。
然后,我该怎么办?
下面我们来看今天的主要话题。我没有接受源数据并自己计算数字,而是跳过了所有的过程,接受了最终的报告结果。我该怎么做?答案是用一个pyautogui
模块。你可以在这个 Github 里找到。
简而言之,pyautogui
帮助你完成基本的自动化任务,例如移动鼠标,点击按钮,键入一些单词。通过引用鼠标要移动到的像素,你可以在桌面上做任何你想做的事情。此外,它还附加了计算机视觉功能,可以根据提供的图片识别屏幕上的位置。太棒了。
今天,我将引导您浏览这个库,并添加一些其他有用的功能来帮助您自动化桌面上的任何事情。今天,我不会为一个pyautogui
能做什么写一个教程,因为无论如何你能在文档中找到它。我会向你展示这个过程,以及你可以在哪里应用这个东西。
这是我们今天要讲的步骤。
由 Roman Synkevych 在 Unsplash 上拍摄的照片
- 打开 SAP GUI 并登录到服务器。
- 输入用于提取报告的 SAP 程序名称和参数。
- 执行报告并将其导出到 Microsoft Excel 电子表格。
- 将其上传到 AWS S3,以进行进一步的 ETL 流程。
因此,让我们打开 SAP,以便从中提取报告。这是你怎么做的。
import subprocesssap_gui = subprocess.Popen("path/to/saplogon.exe")
首先,我们用subprocess
模块打开程序。你打开任何exe
文件都很方便。你用参数sap_gui
存储program
对象。在脚本的最后,您可以像这样终止 SAP。
sap_gui.terminate()
当 SAP 登录打开时。您将看到这样的屏幕。
作者的 SAP 登录屏幕截图
使用pyautogui
时要小心的一件事是,如果桌面处理不正确。我的意思是,假设你在屏幕上选择了某个选项,程序需要一些时间来处理它。如果您不在脚本中添加任何等待时间,所有后续步骤都可能出错。
为了让上面的例子更好。
import pyautogui
import subprocess
import timesap_gui = subprocess.Popen("path/to/saplogon.exe")# wait 3 seconds for the program to load
time.sleep(3)# assume that we move to input username fieldsusername_field_location = pyautogui.locateOnScreen('username_field.png')
pyautogui.moveTo(username_field_location)
pyautogui.click()# type the username in the field that we just clicked
pyautogui.typewrite(username)# move (relative from the current cursor position) to below 50 pixel
pyautogui.moveRel(0, 50)
pyautogui.click()# type the password
pyautogui.typewrite(password)
pyautogui.press('enter')
通过下面的代码,我们向您展示如何使用pyautogui
函数登录到 SAP 系统。上面的代码片段包含了我在摄取脚本中使用的几乎所有函数。我们同时使用参考运动和计算机视觉运动。现在你会在这里如下图。
作者的 SAP 主页截图
此时,您将输入报告所需的所有参数,然后执行它。我们可以使用上述所有功能来完成这项任务。让我只指出我先前没有提到的功能。
# Other functions that I used to assign the value to get the report# double click
pyautogui.doubleClick()# right click
pyautogui.click(button='right')# hot key with ctrl + f9 (shortcut for SAP command)
pyautogui.hotkey('ctrl', 'f9')# press tab to shift to the next input field
pyautogui.press('tab')
单击 SAP 导出过程的导出按钮后,它会自动为您打开 excel 文件。这种行为有时很烦人,因为在关闭 excel 文件之前,您不能对结果文件做任何事情。
这就是另一个有用的功能出现的地方。我们可以检查该进程(MS Excel)是否正在运行。之后,我们可以将它们作为一个触发点,进入下一步。如果 SAP 系统能够正确保存 excel,我们可以毫不犹豫地关闭 excel 结果文件。我们将使用下面的函数来做到这一点。
import osdef process_exists(process_name): # Thanks to [ewerybody](https://stackoverflow.com/users/469322/ewerybody) for providing this useful snippet code [https://stackoverflow.com/questions/7787120/check-if-a-process-is-running-or-not-on-windows-with-python](https://stackoverflow.com/questions/7787120/check-if-a-process-is-running-or-not-on-windows-with-python) # This function will return true if the process is running.
It's compatible only in MS Window. try:
call = 'TASKLIST', '/FI', 'imagename eq %s' % process_name # use buildin check_output right away
output = subprocess.check_output(call).decode()
# check in last line for process name
last_line = output.strip().split('\r\n')[-1] # because Fail message could be translated
return last_line.lower().startswith(process_name.lower()) except Exception as e:
print(e)def close_process(process_name): # This function will return true if the process is running.
It's compatible only in MS Window. try:
os.system('TASKKILL /F /IM {}'.format(process_name))
except Exception as e:
print(e)
这里我们检查微软是否存在。如果存在,我们就关闭它们。
# Let's wait untill the program is exists and close it.retry = 0
while not is_process_exists('path/to/excel.exe'):time.sleep(10) # may be we need more time for saving
retry += 1
if retry > threshold:
raise ValueError("Excel cannot be saved")close_process('path/to/excel.exe')
我们将对导出的文件进行后处理,将其放在应该放的地方。
local_file = path/to/export.xlsx
target_dir = path/to/{load_date}
file_name = {business_key_parameter}.xlsx
absolute_file_name = os.path.join(target_dir, file_name)if os.path.exist(target_dir): # if the target dir doesn't exist, create one.
os.mkdir(target_dir)if os.path.isfile(absolute_file_name): # if there is a file in the target folder, replace with new one.
os.remove(absolute_file_name)# rename and move export file to the target dir
os.rename(local_file, absolute_file_name)
现在我们想要的报告已经放在目标目录中。我们将循环访问所有业务部门以获取所有报告。
要小心的事情pyautogui
pyautogui
模块的一个缺点是,如果前一条指令的输出结果不符合预期(网页无法加载),那么这个错误将导致后面的所有步骤彻底失败。要解决这个问题,我能想到两个选择
- 为每个
pyautogui
阶段找一个可靠的参照物。如果那个可靠的引用不存在,我们将等待它被加载。请注意,如果您使用while
循环而不重试,可能会导致无限循环。 - 引发错误并跳过当前错误。之后,您可以稍后重试。这假设问题是由于暂时不可靠的参考而发生的。我们可以创建一个函数来检查导出文件的数量。然后,对于丢失的文件,我们再次重新运行脚本。
在你得到你想要的所有报告后,让我们把目标文件上传到 AWS S3 公司做进一步的处理。
**import** **logging**
**from** **botocore.config** **import** Config
*# Intial S3 client* s3_config = Config(region_name = <<YOUR AWS REGION NAME>>)
s3_client = boto3.client(
"s3", config=s3_config,
aws_access_key_id = config["CREDENTIALS"]["AWS_ACCESS_ID"],
aws_secret_access_key = config["CREDENTIALS"]["AWS_SECRET_KEY"]
)
**try**:
response = s3_client.upload_file(
file_name, bucket, object_name
)
**except** Exception **as** e:
print(e)
瞧啊。我们已经自动提取了报告,并将其上传到 S3 自动气象站,无需人工协助。剩下的就是安排这个任务每天运行。
该休息了
我们今天浏览了几个有用的图书馆。如你所见,我们可以用 python 自动完成所有繁琐的任务。
我花了大约半天的时间来编写这个任务的动作代码。但是我能节省的时间更多。
假设您必须每天导出一次,提取时间为 1 小时,并每天输入相同的参数。这将是世界上最无聊的任务。现在我有一个脚本来处理所有这些事情。
起初,我认为自动化会有一些成本。在网上看到一些很优雅的 RPA 应用。如果我必须花钱购买这些应用程序,那么通过概念验证和采购流程将会花费大量时间。有了它,我们可以在一天之内在当地完成所有事情。
然而,正如我前面提到的,您必须自己处理边缘案例。如果它是一个简单的应用程序,我鼓励你自己尝试自动化它。但是对于复杂的流程,您可以选择获得完整的优雅 RPA 应用程序。这可能是一个更好的选择。
不要让你自己在单调乏味的任务中毫无收获。让我们实现自动化吧!
帕泰鲁什·西达
如果你喜欢这篇文章,并希望看到更多这样的东西。
使用 Cookiecutter 自动化数据科学项目的结构
停止手工操作,重新使用项目模板
列宁·艾斯特拉达在 Unsplash 上的照片
这是很多数据科学家都熟悉的情况。
每当您开始一个新项目时,您都要重用旧项目的结构。您浏览它们的文件夹并复制粘贴它们,删除不必要的文件,用新项目的细节重命名剩余的文件,进入每个配置文件并替换旧的环境变量(URL、API 键、主机、端口等)。)与新的。
也许,谁知道呢,在这个过程中,您会创建新的配置和新的文件夹。
❌:我们都同意这是一项相当乏味和重复的任务。更不用说它很容易出错。
✅从一个主模板开始每个新项目不是更方便吗?你可以从终端克隆并填充特定的信息?让这个模板自动为您构建一个完整的文件夹结构,并用您定义的正确名称和变量填充文件,这不是很好吗?
Cookiecutter 才是解决这个问题的正确方法。
在本帖中,我们来看看 cookiecutter。
我们将了解它是如何工作的,以及您如何使用它来为您的项目构建定制的和可重用的模板。
然后,我们将介绍Cookiecutter 数据科学 开源模板,以启动遵循行业最佳标准的数据科学项目。
事不宜迟,我们来看看🔍
什么是 cookiecutter?
" Cookiecutter 从项目模板创建项目."—官方文件
- 项目可以是 python 包、web 应用程序、具有复杂工作流的机器学习应用程序或任何你能想到的东西
- 模板是 cookiecutter 用来创建项目的。他们依赖于 Jinja2 的语法
cookiecutter 做的事情非常简单:它克隆一个目录并将其放入新项目中。然后,它用在cookiecutter.json
文件中找到的名字替换在{{
和}}
(Jinja2 语法)之间的所有名字。(我们将在下一节看到如何构建 cookiecutter 模板的示例)
要开始使用 cookiecutter,您可以使用 pip 安装它:
**pip install cookiecutter**
或康达:
**conda install -c conda-forge cookiecutter**
👉你可以在所有平台上使用 cookiecutter:Windows、Mac 和 Linux
👉它适用于 Python 2.7+和 3.5+(尽管更喜欢 Python 3.5+,因为 Python 2.7 不再维护 )
👉您可以使用 Cookiecutter 创建一种或多种语言的模板
如何为您的 Streamlit 项目创建自定义 cookiecutter 模板?
在这一节中,我将向您展示如何为 kickstart Streamlit 项目创建一个 cookiecutter 模板。
如果你不熟悉 Streamlit ,它是一个用于构建 web 应用程序的 Python 库。它使用起来非常简单,并且提供了很多功能。我每天都用它来与我的团队分享实验和结果,并制作机器学习应用的原型。
目标结构
我的基于 Streamlit 的项目往往具有以下结构:
作者截图
- 一个包含应用程序(
app.py
)主脚本的src
文件夹,以及一个包含两个脚本的utils
模块:ui.py
用于放置布局函数,而common.py
用于保存其他用于数据处理或远程数据库连接的实用函数 - 一个
.gitignore
文件,用于防止 git 对不必要的文件(例如 env 文件,或。pyc 文件) Procfile
和setup.sh
:处理 Heroku 上的部署requirements.txt
:列出项目依赖关系- 一个
.env
文件,用于存储项目的环境变量 - A
README.md
分享项目详情
创建一个 cookiecutter 模板以匹配目标结构
要创建一个生成这个结构的 cookiecutter 模板,让我们首先为这个模板创建一个文件夹。
**mkdir streamlit-cookiecutter
cd streamlit-cookiecutter**
在这个文件夹中,创建cookiecutter.json
文件:
关于这个文件的一些事情:
- 当 cookiecutter 从模板中启动一个项目时,每个键都是它需要的一个项目
- 每个值对应于每个项目的默认值
- 项目的值按顺序设置。例如,
repo_name
设置在project_name
之后(因为它的值取决于project_name
的值)
当您使用 cookiecutter 克隆模板时,会设置这些项的值:我们将在下一步中看到这是如何完成的。
现在创建文件夹,并将所需的目标结构放入其中。我们将根据repo_name
项来命名该文件夹。
在 cookiecutter 语法中:{{cookiecutter.repo_name}}
。
在{{cookiecutter.repo_name}}
文件夹中,将您想要的结构放到您的项目中:
这些文件中的每一个都可以访问您传递给 cookie-cutter 的项目的值:您所要做的就是使用{{
和}}
。
让我们看看如何利用这一点。
👉生成 README.md 我们可以通过在其中插入project_name
、description
、open_source_license
项来自动生成 README.md。
👉设置环境变量 我们可以自动填写s3_bucket
、aws_profile
、port
、host
和api_key
在。环境文件。
👉重复数据删除代码 如果您的 Streamlit 应用程序遵循相同的结构,并且都以项目名称作为标题,则没有必要每次都重复此代码。
一旦你完成了你的模板代码,把它推给 Github。我已经做了,你可以在这里查看。
测试模板!🚀
现在模板已经在 Github 上了,让我们用它来开始一个项目。
假设我想在 Streamlit 中创建一个情绪分析 app 。
我需要做的就是用模板的 URL 调用 cookiecutter。
**cookiecutter** [**git@github.com**](mailto:git@github.com)**:ahmedbesbes/streamlit-cookiecutter.git**
一旦执行该命令,Cookiecutter 将要求您设置您在cookiecutter.json
文件中定义的项目的值(注意,每个项目的默认值都放在括号中)。
为每个项目输入特定值后,项目就创建好了。
让我们检查一下它的README.md
✅
作者截图
其.env
文件✅
作者截图
其app.py
文件✅
作者截图
一切都好。项目具有所需的结构,文件中填充了正确的数据。
现在我们可以开始开发这个应用程序了。
库克数据科学
cookiecutter 的一大优点是充满活力的社区。现在有很多不同风格的开源模板(Django、Flask、FastAPI,随便你怎么说)。你可以很容易地在 Github 上找到它们并开始使用它们。
一个引起我注意的模板是 Cookiecutter 数据科学。
作者截图
正如作者所说,这个模板是:
一个逻辑合理、标准化但灵活的项目结构,用于进行和共享数据科学工作。
实际上,这个模板提供了一组目录来更好地组织您的工作。这有点固执己见,但它遵循了该领域公认的良好实践。
在我看来,它有助于:
- 按职责组织模块:数据集创建、特征工程、建模、可视化
- 按流水线阶段组织数据
- 强制单元测试
- 创建文档
您可以开始使用此模板,如下所示:
作者在碳上制作的图像。嘘
一旦您完成了对每一项的值的设置,您将得到以下结构:
来源:http://drivendata.github.io/cookiecutter-data-science/
您不必坚持这种结构:如果您对它不满意,您可以派生模板并修改它以满足您的需要。
资源
Cookiecutter 是一个神奇的图书馆。它有助于自动创建项目,并防止您重复自己。作为一名数据科学家,它必须是你工具箱的一部分。
为了了解更多关于 Cookiecutter 的信息,我挑选了一些你可以轻松浏览的好资源:
- https://github.com/cookiecutter/cookiecutter
- https://drivendata.github.io/cookiecutter-data-science/
- https://dev . to/azure/10-top-tips-for-reproducible-machine-learning-36g 0
- https://towards data science . com/template-your-data-science-projects-with-cookiecutter-754 d3c 584d 13
- https://youtu.be/nExL0SgKsDY(一段优秀的 Youtube 视频)
感谢阅读🙏
如果你坚持到最后,我真的感谢你的时间,并希望你学到了一些关于 cookiecutter 和项目模板。
今天就这些了。直到下一次更多的编程技巧和教程。👋
新到中?您可以每月订阅 5 美元,并解锁无限的文章— 单击此处。
用 Python 自动化 WhatsApp 消息
只用了两行代码
用 Python 自动化 WhatsApp 消息?
Python 是一门令人惊叹的语言。你不一定要成为专业人士才能用它做令人兴奋的事情。
这种语言非常适合自动化。我尝试的第一个自动化是电子邮件自动化。然后是网页抓取,现在是 WhatsApp 消息。
也许你想让 WhatsApp 在某个特定的时间发送消息,但那个时候你可能很忙,甚至在睡觉。或者你可能想知道如何自动化 WhatsApp 信息,只是为了好玩。
在本文中,您将学习如何用两行 Python 代码自动处理 WhatsApp 消息。
安装 Python 、 Pycharm 和 Pywhatkit 如果你还没有的话。
如何用 Python 自动化 WhatsApp 消息
在编写代码的过程中,您可能会遇到错误,但不要担心。我将在下面介绍如何解决可能出现的 bug。如果你看到的 bug 这里没有提到,在 Google 上搜索解决方案。
bug 是编程的一部分。我无法克服在尝试自动化我的 WhatsApp 信息时遇到的一个错误。在我能解决它之前,我不得不考虑它。睡在虫子旁边总是好的。第二天早上你精神焕发,准备解决那些该死的 bug。
现在让我们开始吧。
- 打开 Pycharm 并创建一个新项目。给新项目起一个名字——Whatsautomation 或任何您喜欢的名字。然后选择 python 文件。此外,给 python 文件取一个您想要的名称。
- 谷歌 Pywhatkit 或者去网站这里。复制 Pywhatkit 安装链接。您将看到下图中红色箭头所指的链接。点击它,链接将被复制。
- 回到皮查姆。记住你已经打开了 Pycharm。点击 Pycharm 左下角的终端。将您复制的 Pywhatkit 安装链接粘贴到终端中,然后按 enter 键。安装 Pywhatkit 需要几分钟时间。
- 现在,在 Pycharm IDE(终端上方的大空间)中编写以下代码。
注:在括号内,写下您要发送自动消息的国家的国际代码(+……)。然后,写下你的信息。现在写下你希望信息传递的时间。这里的时间使用 24 小时制。因此,不是写 1,00 表示下午 1 点,而是写 13,00。另外,请注意引号。
- 运行代码。代码成功运行后,您将收到以下类型的消息:
110 秒后,web.WhatsApp.com 将打开,20 秒后,一条信息将被传递。
在你设定的时间,WhatsApp 会自动在你用来访问 WhatsApp 的浏览器中打开。你写的信息会出现在文本框中,并在 20 秒后自动发送。如果您的互联网连接速度很慢,您的邮件将无法发送。它将保留在文本框内。
您可能会遇到的错误消息
在尝试自动处理 WhatsApp 信息时,你可能会看到我在下面列出的错误信息。我已经包括了你如何解决每个错误。
- 安装 Pywhatkit 时,您可能会看到以下错误消息:
找不到 zlib 的头文件或库文件,这是从源代码编译 Pillow 时所需的依赖项。
解决方案
升级 pip 和枕头。分别运行以下代码:
- 从 0 开始计时。例如,9,06。您将得到语法错误:
语法错误:十进制整数文本中不允许前导零;对八进制整数使用 0o 前缀。
解决方案
用 0 以外的数字开始计时。
- 如果您要发送消息的电话号码没有国家代码。您将得到以下错误:
引发 CountryCodeException(“电话号码中缺少国家代码”)
pywhatkit . main functions . Country code exception:电话号码中缺少国家代码
解决方案
包括每个电话号码的国家代码。例如+234、+44、+1。
- 当您的网络速度慢时,您的信息将不会被发送。您将收到以下错误消息:
发出警告(“互联网速度慢,提取信息可能需要更长时间”)
警告:互联网速度较慢,提取信息可能需要较长时间
解决方案
使用强大的互联网连接。
结论
你可以用两行 python 代码实现 WhatsApp 消息的自动化。使用 Pycharm 或任何你觉得舒服的 IDE。安装 Pywhatkit。导入 Pywhatkit。写下你的信息,包括你想发送自动信息的电话号码和你想发送信息的时间。
唷,消息是这样的。
自动化 WhatsApp 信息快乐。
“Python 就像许多优秀的技术一样,很快就像病毒一样在你的开发团队中传播开来,并找到了进入各种应用程序和工具的途径……”——Mustafa Thamer
P.S 作家面临的挑战可能会阻止他们终身写作……久坐导致的慢性背痛、长时间盯着屏幕导致的眼睛问题、写作时手指窒息等等。如果你想继续得到这种类型的文章,你可以通过成为 媒体订户来支持我。每月花费 5 美元。你的一部分订阅费归我 。
使用 Python 自动生成枯燥的 Excel 报表!
将多个 Excel 文件合并成一个可操作的报告,而无需接触 Excel!
学会自动化你重复、枯燥的 Excel 工作。图片作者:Nik Piepenbreier
Excel 是我们又爱又恨的工具。它擅长做的事情很棒,但不擅长它不该做的事情。在这个数据越来越重要的时代,你经常会收到来自不同来源的工作簿,并被要求用它们创造奇迹。
在这篇文章中,你将确切地了解到这一点——如何用简单的 Python 脚本的力量来施展 Excel 的魔法。
你会学到什么!
假设您收到一堆 Excel 文件,其中包含不同销售人员的销售数据。问题是这些文件除了文件名之外,没有告诉你谁是谁。你被要求找出一些关于销售的高级统计数据!
你将学习如何:
- 将多个工作簿合并成一个数据帧,
- 创建一个数据透视表,
- 用您的所有工作生成最终的 Excel 工作簿。
您将无需实际接触 Excel 就能完成所有工作。
将一堆松散的文件转换成可操作的报告,准备好 Excel 图表!图片作者:Nik Piepenbreier
更喜欢看教程?
我把整篇文章放在一个简单易懂的 YouTube 视频中:
在 YouTube 上看看这个教程吧!资料来源:Nik Piepenbreier
我们开始吧!
让我们从加载我们需要的库开始。在本教程中,您将使用pandas
、openpyxl
和glob
。Pandas 是 Python 的精华数据分析库;openpyxl 让我们做一些有趣的 Excel 工作来保存我们的数据(比如创建图表);glob 允许您仔细阅读目录中的不同文件。
如果你想跟着做,可以从这里的我的 GitHub 下载文件。
让我们看看如何使用 glob 来解析不同的文件。出于本教程的目的,我将文件保存在下面的目录中:/Users/nik/Desktop/ExcelMagic
。让我们将修改后的文件路径保存到一个变量中。
Glob 允许您查找找到某个模式的文件路径。因为我们在 ExcelMagic 文件夹中寻找 Excel 文件,所以我们可以简单地使用通配符。因此,我们可以使用 glob 来查找所有匹配模式的文件路径:
最棒的是,我们现在有了一个我们想要迭代的所有文件的列表。
提示! 如果你使用的是 Windows,你可能需要通过在你的左引号前加上r
来将你的路径字符串转换成原始字符串。
合并我们的文件
获取文件名
当我们查看这些文件时,我们会发现除了文件名之外,没有其他方法可以区分它们。我们要做的是获取文件名
要合并所有这些文件,让我们:
- 创建一个空的数据帧,
- 遍历列表并创建一个临时数据帧,
- 将临时数据帧添加到更大的数据帧中。
我们现在有了一个数据框架,其中添加了一个新列,其中包含雇员的姓名!
汇总数据
现在我们已经在一个数据框架中获得了数据,让我们按销售人员和季度汇总数据,看看谁的销售额最高。
让我们通过编写以下代码来创建一个熊猫数据透视表:
要了解更多关于熊猫的数据透视表,请查看我在这里的帖子。简而言之,以下是主要观点的概述:
- 数据:您要透视的数据
- 索引:数据透视表的“行”
- 列:数据透视表的“列”
- 值:您要使用哪一列进行汇总
- aggfunc :您希望如何聚合您的数据
当我们使用print(pivot)
打印数据透视表时,我们返回以下内容:
最后,让我们将数据保存到 Excel 工作簿中:
我们在这里创建了一个新的变量save_file_path
,这样我们以后可以更容易地加载工作簿来格式化数据和添加 Excel 图表。
让我们创建一个 Excel 图表
现在我们有了数据摘要,我们可以使用这个数据框架直接在 Excel 文件中创建一个图表。
为此,我们将使用 openpyxl。让我们开始吧!
让我们看看我们在这里做了什么:
- 我们已经将工作簿和工作表作为 openpyxl 对象加载,
- 我们循环了包含我们的值的数据,并将它们格式化为货币,
- 然后,我们创建了一个条形图对象并插入了数据,并指示 openpyxl 在一个特定的位置(G2)用一个标题保存它
- 最后,我们将文件保存在同一个位置。
结论
我们在本教程中已经做了很多!我们遍历了许多不同的 Excel 工作簿来合并数据,生成了一个数据透视表和一个 Excel 图表— 所有这些都没有用到 Excel !
有问题就留言评论,我会尽力解答。
点击此处订阅(图片由 stickpng.com 提供)
如果你想订阅我的 YouTube 频道,可以看看这里,我经常在这里发布 Python 和熊猫教程。
通过三个简单的步骤自动化您的数据科学项目结构
实践教程
快速高效地简化您的数据科学代码库和工具
免费矢量插图来自比例尺
好的代码是它自己最好的文档
Rachael tat man博士在她的演讲中,以一种非常微妙的方式强调了代码可再现性的重要性:
“你为什么要关心再现性呢?因为最有可能需要复制你作品的人……就是你。”
在很多层面上都是如此。你有没有发现自己处于一种很难破译你的代码库的情况?你是否经常以类似于untitled1.py
或untitled2.ipynb
的多个文件结束?好吧,如果不是所有人,我们中的一些人无疑在一些场合面临过糟糕的编码实践的冲击。这种情况在数据科学中更为常见。通常,我们限制了对分析和最终产品的关注,而忽略了负责分析的代码的质量。
为什么再现性是数据科学管道中的重要组成部分?我在的另一篇博文中提到了这个话题,我将从那里借用几行文字。一个可重复的例子允许其他人使用相同的数据重新创建您的分析。这很有意义,因为你把你的作品公之于众,让他们使用。如果别人不能复制你的作品,这个目的就失败了。在本文中,让我们看看三个有用的工具,它们可以简化并帮助您创建结构化的、可重复的项目。
创建良好的项目结构
假设您想要创建一个包含代码的项目来分析电影评论的观点。创建良好的项目结构有三个基本步骤:
作者创建项目模板|图像的管道
1.使用 Cookiecutter 数据科学自动创建项目模板
@NounProject 的图标| CC: Creative Commons
在组织机器学习项目的最佳实践方面,社区中没有明确的共识。这就是为什么他们有太多的选择,而这种不明确会导致混乱。幸运的是,有一个变通办法,这要感谢 DrivenData 的人们。他们创建了一个名为 Cookiecutter 数据科学的工具,这是一个标准化但灵活的项目结构,用于进行和共享数据科学工作。几行代码就建立了一系列子目录,使得启动、构建和共享分析变得更加容易。你可以在他们的项目主页上阅读关于该工具的更多信息。让我们进入有趣的部分,看看它是如何工作的。
装置
pip install cookiecutterorconda config --add channels conda-forge
conda install cookiecutter
开始一个新项目
在您的终端上运行以下命令。它会自动用所需的文件填充一个目录。
cookiecutter [https://github.com/drivendata/cookiecutter-data-science](https://github.com/drivendata/cookiecutter-data-science)
使用 Cookiecutter 数据科学|作者图片
在指定的路径上创建一个情感分析项目目录,在上面的例子中是桌面。
新创建项目的目录结构|作者图片
注意 : Cookiecutter data science 将很快迁移到版本 2,因此该命令在未来的使用方式上会有细微的变化。这意味着你必须在上面的命令中使用
*ccds ...*
而不是*cookiecutter ...*
。根据 Github 库,这个版本的模板仍然可用,但是你必须显式地使用*-c v1*
来选择它。当变更发生时,请留意文档。
用 readme.so 创建一个好的 Readme
@NounProject 的图标| CC: Creative Commons
接下来创建项目的框架后,您需要填充它。但在此之前,有一个重要的文件需要更新——README。自述文件是一个减价文件,传达有关项目的基本信息。它告诉其他人项目是关于什么的,项目的许可,其他人如何为项目做贡献,等等。我见过许多人在他们的项目上投入了巨大的努力,但却没能创造出像样的读物。如果你是其中之一,有一些好消息以一个项目的形式出现,这个项目叫做 readme.so 。
一个善良的人刚刚结束了手动写阅读材料的时代。Katherine Peterson 最近创建了一个简单的编辑器,允许您快速创建和定制项目的自述文件。
Github 甚至转发了凯瑟琳的推文。
编辑器非常直观。您只需单击一个部分来编辑内容,该部分就会添加到您的自述文件中。从大量的收藏品中选择你喜欢的。您也可以根据您希望它们在页面上的位置来移动这些部分。一旦一切就绪,继续复制内容或下载文件并将其添加到现有项目中。
使用 readme.so |图像按作者生成自动阅读材料
将您的代码推送到 Github
@NounProject 的图标| CC: Creative Commons
我们差不多完成了。剩下唯一的事情就是把代码推送到 Github(或者你选择的任何版本控制平台)。您可以通过 Git 轻松做到这一点。这里有一个方便的备忘单,包含了最重要和最常用的 Git 命令,便于参考。
资料来源:https://education.github.com/git-cheat-sheet-education.pdf
或者,如果你用的是 Visual Studio 代码 (VS 代码),像我一样,就已经搞定了。VS 代码使得直接向 GitHub 发布任何项目成为可能,而不必先创建一个存储库。VS 代码将为您创建存储库,并控制它是公共的还是私有的。您唯一需要做的就是通过 VS 代码向 GitHub 提供认证。
通过 Visual Studio 代码将代码推送到 Github 作者图片
这就是建立一个健壮的结构化的项目库所需要的一切。如果您想同步查看所有步骤,下面的视频总结了上述所有步骤。
展示文章中使用的工具的端到端视频
结论
创建结构化的和可重复的项目在开始时可能看起来很困难,但从长远来看却有好处。在本文中,我们看了三个有用的工具,它们可以帮助我们完成这项任务。虽然 cookiecutter data science 给出了一个干净的项目模板, readme.so 会自动填充一个 readme 文件。最后,VS 代码可以帮助我们将项目推到 web 上进行源代码控制和协作。这为一个好的数据科学项目创造了必要的基础。现在,您可以开始处理您的数据,并从中获得见解,与各种利益相关者共享。
👉有兴趣看我写的其他文章。这个 repo 包含了我分类写的所有文章。
在云中自动化您的数据科学项目—第 1 部分,共 2 部分
使用 Azure 功能在云中实现无服务器代码自动化
有一个工作笔记本,里面有一个有趣的案例,理想情况下有一些有意义的结果,这对一个人来说是非常好的。但是,当涉及到向他人展示你的作品时,无论是同事、未来可能的雇主还是仅仅是互联网,一个全自动运行的展示台比通过邮件给某人发送笔记本要“性感”得多。
除了额外的外在好处(更容易的反馈、与结果的交互性、留下印象)之外,在将您的概念证明级别的项目提升为完全可操作的产品时,还会有惊人的内在满足感。
本文包含这个自动化系列的第 1 部分,并阐述了 Azure 函数的概念。
云有时也是美丽的东西,图片来自 pexels
Azure 函数
Azure Functions 是来自微软 Azure 的低成本服务,它可以用来在云中无服务器地执行你的代码——每次执行不到一美分。您可以将这些函数视为一个框架,让您的代码在云中运行。可以通过在浏览器中输入 HTTP 地址或计时器来触发执行。更多关于 Azure 功能的详细信息可以在这里找到。
为了使这个概念更加具体,请查看下面的用例。你拥有一个网站,有人在那里注册。这会向您的 Azure 函数发送一个 HTTP 请求,其中包含人员别名、电子邮件和其他有趣的参数。您的函数从这个请求开始,用这些参数做一些有趣的分类,查询一些信息,生成一封个性化的欢迎邮件并发送给这个人。所有这些都发生在你的网站之外。
低价格是有代价的:在最便宜的级别运行时间被限制在最长 10 分钟,默认设置为大约 5 分钟。为了获得更高的 60 分钟最大运行时间,必须额外付费购买高级计划。在设计管道时,请记住这一点。
这当然使得 Azure 函数很难适合处理大数据或企业级案例,但 Azure 为这些提供了自己的工具套件:Databricks、Synapse、Azure Data Factory 等等。
持久函数的概念是对函数框架的扩展。单个函数可以被自动发布和执行,但是为了创建一个管道,其中一个函数开始一个函数,然后开始第三个函数,发明了持久函数来编排这个过程。
设置您的环境
由于我们将使用 Azure Cloud,我强烈推荐使用微软的 Visual Studio 代码。有了原生 Azure 集成和许多模板,这个编辑器是这项任务的最佳选择。当然,您可以使用您选择的编辑器将您的模型开发成一个整洁的 python 包,然后只使用 VS 代码进行云编排。你可以在这里免费得到编辑器。
VS 代码扩展经理,作者图片
安装后,你有一个有点裸露的编辑器,左边有一个块状图标,让你安装扩展。用它来安装 **Azure 功能,**这个助手将大大减少我们要做的手工工作量。在编辑器的这个部分,你可以找到各种有用的扩展。去狂野和个性化吧——毕竟,是你要和它一起工作。此外,确保从这里安装 Azure 核心工具。
Azure 函数入门
创建新项目
使用命令面板⇧⌘P (Windows: Ctrl+Alt+P)在你喜欢的地方创建一个项目:输入“azure functions:create new project”并点击 enter。这是编辑器所有功能的主要枢纽。从设置、代码模板到 GitHub 版本控制,一切都可以在这里完成。
你可以从命令面板执行几乎每一个动作
选择一个路径(稍后会详细介绍),选择 python 作为一种语言,选择一个 Python 解释器,选择 HTTP Trigger 作为模板,给你的函数起一个名字(我把它命名为 MyTrigger)并选择 anonymous。您为新项目选择的文件夹必须是包含所有应该在云中运行的代码的路径。我找不到从高于 Azure Function Projects 基本路径的文件夹级别导入代码的方法。
文件结构
从这些模板创建项目和函数也创建了大量新文件。乍一看,这似乎让人不知所措,但是下面的列表包含了对重要文件的解释以及您可以用它们做什么。
创建项目和 Azure 函数后的文件结构,作者图片
- host.json
这个文件包含了一些关于项目的元信息,尤其是扩展包的版本号。这意味着我们用于数据科学项目自动化的 Azure 核心工具的版本。您可以将 Azure 函数与默认版本[1]一起使用。,2.0.0),但是因为我们想在以后使用持久函数来实现自动化,所以将版本设置为[2。,3.0.0)并重新启动编辑器。 - requirements.txt
这听起来应该很熟悉。无论您使用 Conda、pip 还是任何其他适合您的解决方案,在某种程度上,您都创建了一个包含所有使用过的包的 Python 环境。Azure 函数不使用这些环境。相反,在部署到云的过程中,环境是根据给定的 requirements.txt 创建的。
幸运的是,有一些方法可以自动生成这个文件,
pip freeze > requirements.txt
就是这样一个解决方案。随着代码的增长,记得在这个文件中添加新的包。
还要确保azure-functions
和azure-functions-durable>=1.0.0b12
已列出。 - 。这个文件夹包含调试 Azure 函数时使用的 Python 环境。
- MyTrigger/function.json
这个文件包含了关于你的函数的元信息,它是什么类型,它是如何被触发的等等。它还可以用来设置可以从代码中读取的全局参数。 - My_Trigger/init。py
这个文件现在包含了主函数中的实际代码。这是你可以剪切掉中间部分,导入你的包并在主区域执行它的地方。但稍后会详细介绍。预先配置的功能。HttpResponse 由 main 函数返回,这是您的函数完成后将显示的消息。
排除故障
设置完成后,我们现在可以开始执行新创建的函数 MyTrigger。首先,打开命令面板(⇧⌘P),输入“查看:切换集成终端命令”。在编辑器的底部,应该会打开一个外壳。执行以下语句来更新中的 python 环境。venv 文件夹:
source .venv/bin/activate (Windows: .venv\scripts\activate)
python -m pip install -r requirements.txt
现在按 F5 键或打开 Run 并选择 Start Debugging 来启动主机。请注意,一旦设置好主机并且准备好执行您的函数,编辑器底部的蓝色条就会变成橙色。
这是你的函数准备好启动时的样子,作者图片
你的函数是用黄色和绿色写的,一个触发它的链接。按住 Command 键并单击链接,会打开一个浏览器窗口,执行您的功能。注意,在成功执行代码后,返回的 func。HttpResponse(来自 init。py 文件)。在编辑器的底部,错误消息或日志以蓝色显示。
有时你必须忽略编辑器突出显示的一些错误,因为它并不总是完全理解 Azure 函数的架构,并且可能对导入的处理方式很不满意。
另一方面,注意:我强烈推荐使用“logging.info”进行日志记录,就像模板中一样。这些消息在调试过程的执行过程中显示,并且一旦部署了该过程,也可以在云中轻松地免费阅读。如果您的代码中有一些自定义日志记录,将它切换到这种日志记录风格或者添加一个参数并使它自己相应地切换是一个好主意。
在代码中使用 azure 函数
在一些前期工作之后,我们来到了有趣的部分:添加你的定制代码,你的酷模型,你的价值生成脚本。
现有代码的示例导入,作者的图片
确保您的自定义代码在上面创建的项目文件夹中,并测试它以确保它可以顺利运行。现在剩下的就是导入代码并调用函数了。如果您已经将所有代码合并到一个 main 函数中,事情就变得简单了,因为现在您只需在 init 中调用它。py 和你玩完了。
就这么简单。
使用 F5 键调试您的代码,并使其在 Azure Functions 框架内运行。如果你想要一个例子作为参考,你可以从我的 repo 中这个文件,在那里我自动将数据从 Azure SQL DB 加载到 tableau 仪表板的 google sheets 文档。如果你想了解更多细节,你可以访问我关于这个话题的文章这里,在我的主页这里查看结果。
部署和无服务器执行
既然你的 Azure 功能已经完全开发好了,剩下的最后一步就是让奇迹发生:部署。
为了部署到 Azure,您必须已经创建了一个 Azure 帐户(显然)。点击左侧的 Azure 图标并连接到您的帐户。一旦建立了连接,你必须点击向上的蓝色小箭头。这将启动 Azure 功能的部署过程。
VS Studio 代码中的 Azure 窗口,圈起来的是部署按钮,作者图片
首先,它要求你创建一个新的“功能应用”或部署到一个已经存在的应用。据我所知,创建和拥有这样的 anApp 是完全免费的,所以继续创建一个新的吧。它基本上是你各种功能的管理工具:你可以查看日志,检查性能,并在一些语言中直接在你的 Azure 门户中从功能应用程序中编辑功能 coce(Python 不是这些语言中的一种)。
部署完成后,打开 azure 门户并检查你的功能应用。通过点击功能菜单,你可以访问所有已部署的功能,当你点击一个功能时,还可以看到一些不错的元信息。
对示例性 Azure 功能的概述,作者的图片
在功能概述中,实际的 URL 可以在“获取功能 URL”按钮下获取。复制 URL 并将其粘贴到您的浏览器中—您的功能将被执行。延迟一段时间后,您可以进入 Monitor 选项卡并检查执行情况:您可以查看函数执行的时间,它是否成功执行,并检查每次执行的日志(只需单击蓝色时间戳)。有关日志的更详细分析,请单击“在应用洞察中运行查询”按钮。但是我不会在我的文章中对此进行更详细的描述。
现在,您可以随时随地在云中执行您的代码。哦,我提到过你可以在 URL 中添加参数并在你的代码中读出它们吗?来自任何进程的完全参数化的函数调用。粘贴 URL,从您最喜欢的管道中呼叫。看看这提供的所有可能性。
发挥创意,尽情奔跑!
摘要
放弃控制并开始依赖一些模糊的框架让人感到不安。开发人员尤其习惯于对他们的代码拥有最终的控制权,可能会感到不止一盎司的怀疑。但是在前置设置之后,Azure 函数变得非常容易操作,并开启了一系列全新的可能性。
随着经验的积累,你将开始理解这个 Azure Functions 框架的内部运作,从而使它不再模糊不清,而是成为你不断发展的数据科学工具箱中一个新的强大的前沿工具。
将您的数据科学工作从笔记本电脑中的概念验证提升到完全可用的微型产品。超越你的竞争对手。带着对云的一点信任。
有时候真的就是这么简单。
下一篇文章:构建管道
请继续关注我的自动化系列的第 2 部分,在那里我将解释我们如何使用持久函数将 Azure 函数链接在一起,并从一个简单的触发器协调整个执行管道。
无耻的自我推销
在此之前,请阅读我的其他文章,访问我的投资组合网站,并在 Twitter 上关注我,关注@88Andreasd。
通过使用 Python 创建摘要表来自动化您的 Excel 报表
Python + Excel
如何协调 Python 和 Excel,用一种像样的、专业的格式来总结你的数据?改进 Excel 报表的一种方法。
卢卡·布拉沃在 Unsplash 上的照片
简介
创建一个独特的和可展示的摘要页面是任何基于 Excel 的报告工作的最后一步。没有这些,你只能得到一张张的数字和公式,很难从你的基础数据中得出结论。通过创建摘要表,工作簿的查看者将能够立即以美观的格式理解数据。
在这个 Python + Excel 系列的前面,您学习了如何使用 Python 格式化 Excel 电子表格。这次我们将看看如何使用格式化代码在 Excel 中制作一个汇总表/仪表板。
在我的上一篇文章中,我写了一些推理,解释了为什么你想将 Excel 与 python 一起使用,python 与 pandas 和 xlwings 如何能极大地改善你的 Excel 繁重的工作流程,并包括一个简短的教程,其中有一些例子,让你开始对你的 Excel 电子表格进行样式化。
您可以在下面的链接中找到所有这些信息;这可能是一个很好的起点,因为本文不会详细讨论相同的主题。
我这篇文章的目标是帮助你在使用我上一篇文章中学到的 Excel/python 格式化技巧的同时总结你的数据。我们将对数据进行旋转、分组和排序。然后制作图表、设计风格并向摘要页面添加徽标。这些技能相结合将使您能够在一个简单的 python 脚本中对数据进行汇总和格式化。希望这篇文章和上一篇一样有用!
汇总数据
如果您的工作流程是 Excel 繁重的,我敢肯定您有跨越多个选项卡的工作簿、许多数据透视表和更多交叉引用每张工作表的公式。这很好…如果你的目标是迷惑所有试图理解你的电子表格的人。
使用 Python 汇总数据的一个好处是能够将数据透视表和其他数据存储为单个变量中的数据帧。以这种方式引用更容易调试,而不是试图通过电子表格中的多个选项卡来跟踪数字。
pandas —本模块对于成功总结您的数据至关重要。
根据熊猫网站:
pandas 是一个快速、强大、灵活且易于使用的开源数据分析和处理工具
简而言之,pandas 包含的功能可以完成你通常在 Excel 中所做的所有数据分析。以下是一些您会对基于 Excel 的背景感兴趣的函数,如果您想了解更多信息,每个函数的文档都有超链接:
- value_counts()
- drop_duplicates()
- groupby()
- 形容()
- 【pivot _ table()(每个 Excel 用户的最爱)
- 剧情()
- 数据类型
- loc
- 国际劳工组织理事会
这些是 pandas 众多功能中的几个例子,可以用来操作或快速总结你的数据。
创建汇总表的步骤
如前所述,本教程中格式化电子表格的代码已经在我的上一篇文章“用 Python 格式化和自动化 Excel 文件”中详细解释过了。本教程将在前面的基础上增加一些新的功能来创建一个快速、美观和全面的汇总表。
我创建了一个 csv 格式的水果和蔬菜销售测试数据集,用于本教程和上一教程。
可以从 Github 下载数据:链接
- 第一步是导入我们将使用的模块。几乎所有的教程都将使用熊猫和 xlwings 来完成。
import pandas as pd
import numpy as np
import xlwings as xw
import matplotlib.pyplot as plt
2.使用 Pandas 将 csv 数据导入数据框架。有两种方法可以做到这一点,直接从 Github 读取或下载到您的本地驱动器并引用。两者在完整的剧本中都有提及。下面的片段将直接从 Github 中读取。
df = pd.read_csv(r”[https://raw.githubusercontent.com/Nishan-Pradhan/xlwings_dashboard/master/fruit_and_veg_sales.csv](https://raw.githubusercontent.com/Nishan-Pradhan/xlwings_dashboard/master/fruit_and_veg_sales.csv)")
3.下面的步骤初始化一个 Excel 工作簿,重命名 Sheet1 并将我们的 DataFrame 复制到 Excel。
wb = xw.Book()
sht = wb.sheets["Sheet1"]
sht.name = "fruit_and_veg_sales"
sht.range("A1").options(index=False).value = df
4.接下来,我们想创建一个名为“Dashboard”的新工作表,并引用该工作表。
wb.sheets.add('Dashboard')
sht_dashboard = wb.sheets('Dashboard')
我们现在有一个包含两张工作表的 Excel 工作簿。“水果蔬菜销售”有我们的数据,而“仪表板”是空白的。
5.我们现在将开始使用 pandas 来处理我们的数据,并生成我们的数据摘要,以包括在我们的空白表上。第一步是检查数据集中的列名。在 Python 中查看所有列名的快捷方式是运行下面一行:print(df.columns)
df.columns |作者图片
从这里我们可以看到,许多列名包含空格、括号、美元符号、大写字母和括号,很不方便。
为了防止我们犯小错误并节省大量调试时间,在用 pandas 引用这些列名时,复制并粘贴它们是明智的。(在较大规模的项目中,重命名列可能更好)
6.我们将为仪表板表创建的第一个摘要将是显示每件售出商品的总利润的数据的枢纽。为此,我们将利用 pandas 的pd.pivot_table()
功能。
pv_total_profit = pd.pivot_table(df, index='Item', values='Total Profit ($)', aggfunc='sum')
这里我们创建了一个新的数据帧,名为pv_total_profit
。这个数据帧有一个索引,包含我们的 Item 列中的每个值。显示的值来自我们数据中的“总利润(
)
”列,我们指定的函数的最终输入是
‘
a
g
g
f
u
n
c
=
′
s
u
m
′
‘
,这告诉
P
a
n
d
a
s
我们希望通过对
‘
v
a
l
u
e
s
‘
列求和来汇总我们的数据,在本例中是“总利润
(
)”列,我们指定的函数的最终输入是`aggfunc='sum'`,这告诉 Pandas 我们希望通过对`values`列求和来汇总我们的数据,在本例中是“总利润(
)”列,我们指定的函数的最终输入是‘aggfunc=′sum′‘,这告诉Pandas我们希望通过对‘values‘列求和来汇总我们的数据,在本例中是“总利润()”。
pv_total_profit 数据框架透视|作者图片
7.我们现在再次执行相同的步骤,只是这一次我们希望透视我们的数据,以显示每件售出商品的数量。
pv_quantity_sold = pd.pivot_table(df,index='Item',values='Quantity Sold',aggfunc='sum')
8.你可以制作一个简单枢纽的整个仪表板或报告,这将看起来很棒,然而,为了使本教程更有趣,我们将使用一个分组函数:df.groupby()
将你的数据按你指定的方式分组。
由于我们的数据与过去一年的销售数字有关,因此查看按月而不是按天分组的数据可能会有用。我们会做到这一点,但首先我们需要确保我们的“售出日期”栏确实被熊猫作为日期读取。****
检查该运行print(df.dtypes)
您应该能够从这里看到,我们的“售出日期”列被作为一个对象读取,而不是日期时间格式。这意味着我们还不能很容易地按月对数据帧进行分组。
我们可以将该列的数据类型更改为 datetime,如下所示:
df[“Date Sold”] = pd.to_datetime(df[“Date Sold”], format=’%d/%m/%Y’)
这里,pd.to_datetime()
格式化我们的列,我们指定原始数据的格式,以确保它被正确地从对象转换成日期时间。如果你再次运行df.dtypes
,你会看到“销售日期”是datetime64[ns]
的格式,这是我们分组工作所需要的。
******
数据类型:转换前(左)、转换后(右)|按作者分类的图像**
9.现在我们的数据有了正确的格式,我们可以使用下面的代码行来合计和聚合我们的数据,并显示相关的列。
gb_date_sold = df.groupby(df["Date Sold"].dt.to_period('m')).sum()[["Quantity Sold",'Total Revenue ($)', 'Total Cost ($)',"Total Profit ($)"]]
我们按月分组的数据现在看起来像这样:
gb_date_sold |作者图片
10.最后一个 groupby 将为我们的仪表板提供第四个数据集。
gb_top_revenue = (df.groupby(df["Date Sold"]).sum().sort_values('Total Revenue ($)',ascending=False).head(8))[["Quantity Sold",'Total Revenue ($)','Total Cost ($)',"Total Profit ($)"]]
这个 groupby 向我们展示了总收入排名前 8 位的。我们通过按“总收入”降序(最高收入在顶部)对数据框架进行排序来实现这一点,然后我们使用head(8)
给出排序后数据的前 8 行。****
11.现在我们已经有了 4 个数据摘要,我们可以继续创建报告了。首先,我们从一些静态格式开始。
**# Background
sht_dashboard.range('A1:Z1000').color = (198,224,180)# A:B column width
sht_dashboard.range('A:B').column_width = 2.22# Title
sht_dashboard.range('B2').value = 'Sales Dashboard'
sht_dashboard.range('B2').api.Font.Name = 'Arial'
sht_dashboard.range('B2').api.Font.Size = 48
sht_dashboard.range('B2').api.Font.Bold = True
sht_dashboard.range('B2').api.Font.Color = 0x000000
sht_dashboard.range('B2').row_height = 61.2# Underline Title
sht_dashboard.range('B2:W2').api.Borders(9).Weight = 4
sht_dashboard.range('B2:W2').api.Borders(9).Color = 0x00B050# Subtitle
sht_dashboard.range('M2').value = 'Total Profit Per Item Chart'
sht_dashboard.range('M2').api.Font.Name = 'Arial'
sht_dashboard.range('M2').api.Font.Size = 20
sht_dashboard.range('M2').api.Font.Bold = True
sht_dashboard.range('M2').api.Font.Color = 0x000000# Line dividing Title and Subtitle
sht_dashboard.range('L2').api.Borders(7).Weight = 3
sht_dashboard.range('L2').api.Borders(7).Color = 0x00B050
sht_dashboard.range('L2').api.Borders(7).LineStyle = -4115**
上面代码片段中的副标题应该解释代码的每一部分是做什么的。
12.我创建了以下函数来手动创建特定的表格格式。这是相当长的,所以我将打破它在这一步做什么。
上面的函数有 4 个输入,header_cell, title, df_summary, color
。
- header_cell 是一个字符串,表示您要放置数据帧摘要的右上角单元格(例如“B5”)。
- 标题是您希望为摘要命名的字符串(例如,“前 8 天的收入”)。
- df_summary 是您希望格式化并放在 Excel 仪表板页面上的 Pandas 数据框架。
- color 是引用函数中预定义颜色的字符串(例如“蓝色”)。
在函数中,我们首先定义一个颜色字典。
**colors = {“purple”:[(112,48,160),(161,98,208)],
“blue”:[(0,112,192),(155,194,230)],
“green”:[(0,176,80),(169,208,142)],
“yellow”:[(255,192,0),(255,217,102)]}**
这里我们命名了 4 种颜色,紫色、蓝色、绿色和黄色。对于每种颜色,在元组中有两种色调,一种较暗的色调和一种较亮的色调,两者都是 RGB 格式。任何颜色都可以添加到这里,如果你想扩大这个范围!
其余的格式化是动态引用我们在函数输入中指定的 header_cell,并自动为您格式化表格的其余部分。
13.接下来,我们调用该函数 4 次,为我们创建的每个数据帧摘要调用一次。
**create_formatted_summary('B5','Total Profit per Item', pv_total_profit, 'green')create_formatted_summary('B17','Total Iteams Sold', pv_quantity_sold, 'purple')create_formatted_summary('F17','Sales by Month', gb_date_sold, 'blue')create_formatted_summary('F5','Top 5 Days by Revenue ', gb_top_revenue, 'yellow')**
14.最后,我们使用 Matplotlib 和 pandas .plot()
函数(调用 Matplotlib)制作一个图表
**# Makes a chart using Matplotlib
fig, ax = plt.subplots(figsize=(6,3))
pv_total_profit.plot(color='g',kind='bar',ax=ax)# Add Chart to Dashboard Sheet
sht_dashboard.pictures.add(fig,name='ItemsChart',
left=sht_dashboard.range("M5").left,
top=sht_dashboard.range("M5").top,
update = True)**
上面的第一部分创建了一个条形图,带有绿色的条形颜色。
然后sht_dashboard.pictures.add()
xlwings 函数允许我们在 Excel 仪表板上放置该图表的图像。我们用left
和top
参数指定我们想把它放在哪里。name
也会在 Excel 中给我们的形象起一个名字。
奖金
为了让你的 Excel 仪表盘看起来更专业,我们甚至可以添加一个 logo 。下面的代码将从 Github 资源库下载一个 png 格式的小示例徽标,保存它,将其添加到我们的 Excel 仪表板,然后调整其大小。确保你已经在 FOLDER_PATH
变量中指定了保存 png 图像的位置。(Github 上的脚本顶部)
**import requestsFOLDER_PATH = r"path_to_save_folder" # r"C:\Users\Name\Downloads"image_url = r”[https://github.com/Nishan-Pradhan/xlwings_dashboard/blob/master/pie_logo.png?raw=true](https://github.com/Nishan-Pradhan/xlwings_dashboard/blob/master/pie_logo.png?raw=true)”r = requests.get(image_url, stream = True)
image_path = rf"{FOLDER_PATH}\logo.png"# Saves image to image_path above
file = open(image_path, "wb")
file.write(r.content)
file.close()# Adds image to Excel Dashboard
logo = sht_dashboard.pictures.add(image=image_path,
name='PC_3',
left=sht_dashboard.range("J2").left,
top=sht_dashboard.range("J2").top+5,
update=True)# Resizes image
logo.width = 54
logo.height = 54**
我们现在已经为数据集创建了仪表板摘要!不要忘记通过运行以下命令来保存它:
**wb.save(rf”{FOLDER_PATH}\fruit_and_veg_dashboard.xlsx”)**
作者使用 xlwings | GIF 格式的摘要表
结论
用不多的代码,我们创建了一个美观的仪表板,可以快速汇总我们的数据。用 Python 来做这件事的优点是易于阅读的语法、相对较少的代码行和使用第三方模块的组合,这可以节省我们总结数据的大量时间。
使用 Python 格式化 Excel 报表可以是手动创建 Excel 报表(或使用 VBA)和用替代报表软件完全替换 Excel 之间的中间步骤。能够以这种粒度级别与 Excel 进行交互使您能够加快工作流程、自动化报告并提高 Python 编码技能,同时为最终用户提供熟悉的输出。
这段代码应该足以让您入门;你可以随意定制。尝试改变颜色,边框,标题,背景色,标志,这里提到的几乎任何东西都可以改变,以符合你想要的风格。
任何创建函数以编程方式排列这些格式化摘要的人都会得到加分!
本教程中使用的代码可从 Github 这里 获得
如果你被卡住了,检查 xlwings 文档 这里
如果你还有任何问题,请在下面的评论区留言。
注:本文仅代表个人观点和经验。
**** ****
使用 Python 自动化您的 Excel
从手动到自动化的方法
图片由 Alexas Fotos 来自 Pexels
Python 是一种令人惊叹的编程语言。更容易学习和适应。python 中的错误消息是不言自明的。我们不需要花时间去寻找错误信息的解决方案。这就是我喜欢这种编程语言的原因。
我觉得这应该是最理想的编程语言。编程语言的目标应该是帮助我们构建令人兴奋的产品,而不是浪费时间解决错误。
最近,我学习了使用 python 自动化 excel 任务。我想与更多的观众分享这些惊人的技巧。这种自动化策略使用 python 编程。好的一面是 python 代码的每一行都是自我解释的,你不需要谷歌任何东西。
您可以使用自己选择的代码编辑器。在本文中,我将使用 Jupyter 笔记本进行演示。
安装所需的库
我们需要安装一个 python 库,openpyxl
。在命令提示符下键入以下命令。
pip install openpyxl
加载现有工作簿
如果您有一个现有的 excel 工作簿,并且您想从特定的工作表中读取数据或修改任何工作表中的数据,openpyxl
提供了一个名为load_workbook()
的函数,可以如下使用。
from openpyxl import Workbook, load_workbookwb = load_workbook('my_demo_sheet.xlsx')
演示工作表
访问工作表
如果要访问活动工作表中的内容。那么 workbook 有一个名为active
的属性,它可以帮助我们指向活动工作表。
ws = wb.active
print(ws)
但是,如果你想指向任何其他工作表,那么我们可以这样做。在这里,我从我的 excel 表中访问sheet2
。
ws = wb["Sheet2"]
访问单元格值
一旦我们定义了工作表,我们就可以引用工作表中的任何单元格。
cell_to_access= ws['A5']
为了获得单元格的值,我们必须使用value
属性。
cell_value = ws['A5']
更改单元格的值
我们可以使用下面一行代码来更改 excel 表格中的任何值。
ws['B1'].value="Second Tab"
我们还需要保存更改,如下所示。
wb.save("my_demo_sheet.xlsx")
获取工作表名称
如果您想知道工作簿中可用工作表的名称,您可以使用下面的 python 代码行来获取列表形式的工作表名称。
print(wb.sheetnames)
访问其他工作表
使用.active
属性,我们可以访问默认的活动工作表。如果您想访问另一个表,即摘要,我们可以如下操作。
ws = wb["summary"]
创建新工作表
要在同一个 excel 工作簿中创建一个新的工作表,我们可以使用如下所示的create_sheet()
。当我们修改工作表时,我们需要保存工作簿以将更改应用到 excel 工作簿。
wb.create_sheet("Index_sheet")
wb.save("test1.xlsx")
创建新工作簿
创建新的 Excel 工作簿非常简单。我们需要调用函数Workbook()
。由于这是一个新工作簿,我们需要将该工作表设置为默认工作表。我们还可以使用title
属性更改工作表的名称。
wb = Workbook()
定义默认工作表。
ws = wb.active
ws.title = "Demo_data"
向工作表添加数据
一旦我们定义了工作表,我们就可以使用append
函数添加数据。这将按行添加数据。
ws.append(["This","Is", "A", "Header"])
ws.save("New_WB.xlsx")
添加新行
我们可以使用insert_rows()
来添加任意数量的行。该函数将 row_number 作为输入。
for i in range(2):
ws.insert_rows(row_num)
删除行
我们可以使用delete_rows()
功能删除任何一行。该函数将 column_number 作为输入。
for i in range(3):
ws.delete_rows(col_num)
添加新列
如果你想插入任何列,那么insert_cols()
功能可以使用循环添加任何列。该函数将 column_number 作为输入。
ws.insert_cols(column_number)
删除列
要删除任何列,可以使用以列号为输入的delete_cols()
函数。
ws.delete_cols(column_number)
在 excel 表中移动数据
假设您有一个包含数据的 excel 表,并且您想要将行或列的任何部分移动到另一个位置。
移动前
我们可以使用move_range()
来移动我们的数据。该函数有三个参数—选定的数据、要移动的行数(+N,-N)和要移动的列数(+N,-N)。
ws.move_range("B2:D9", rows=0, cols=2 )
结论
本文到此为止。我们已经介绍了自动化 excel 任务的不同场景。这些任务也可以在 excel 中手动完成。但是,如果有一些重复的场景,您可以根据您的要求在这个自动化策略上投入一些时间,以节省您的日常时间。
我希望你喜欢这篇文章。谢谢你的阅读!
以下是我的一些最佳选择:
https://levelup.gitconnected.com/six-ultimate-daily-hacks-for-every-programmer-60f5f10feae https://betterprogramming.pub/how-a-single-mistake-wasted-3-years-of-my-data-science-journey-b7ca1e962085
走之前……
如果你喜欢这篇文章,并且想继续关注更多关于 Python &数据科学的精彩文章——请点击这里https://pranjalai.medium.com/membership考虑成为一名中级会员。
请考虑使用我的推荐链接注册。通过这种方式,会员费的一部分归我,这激励我写更多关于 Python 和数据科学的令人兴奋的东西。
还有,可以随时订阅我的免费简讯: 普朗加尔的简讯 。
在一行 Python 代码中实现要素选择工作流的自动化
使用 Featurewiz 快速选择特征
就实例数量而言,更多的训练数据会产生更好的数据科学模型,但这不适用于特征数量。真实世界的数据集有许多要素,其中一些对于训练稳健的数据科学模型非常有用,而其他一些则是会影响模型性能的冗余要素。
特征选择是数据科学模型开发工作流的一个重要元素。选择所有可能的特征组合是多项式解决方案。数据科学家使用各种特征选择技术和技巧来移除冗余特征。
在本文中,我们将重点介绍如何使用开源 Python 包 Featurewiz 实现特征选择工作流的自动化。
Featurewiz:
Featurewiz 是一个开源库,用于从数据集中创建和选择最佳特征,这些特征可进一步用于训练稳健的数据科学模型。Featurewiz 还提供了功能工程功能。只需点击一下代码,它就可以创建数百个新功能。Featurewiz API 有一个参数**‘feature_engg’**
,可以设置为**‘interactions’**
、**‘group by’**
、**‘target’**
,它会一口气创建上百个特性。
功能工程或创建新功能不仅仅是 featurewiz 的功能。它可以减少特征的数量,并选择最佳的特征集合来训练鲁棒的模型。
Featurewiz 是如何工作的?
Featurewiz 使用两种算法从数据集中选择最佳要素。
- 苏洛夫
- 递归 XGBoost
苏洛夫:
SULOV 代表 搜索不相关的变量列表 ,非常类似于 mRMR 算法。SULOV 算法遵循的步骤如下:
- 计算所有超过阈值的相关变量对。
- 相对于目标变量计算 MIS(交互信息得分)。
- 比较每一对相关变量,并移除具有低 MIS 的特征。
- 其余特征具有高的 MIS 和低的相关性。
递归 XGBoost:
在 SULOV 算法选择具有高 MIS 和对数相关性的最佳特征集之后,使用重复 XGBoost 算法来计算剩余变量中的最佳特征。步骤如下:
- 为剩余的要素集构建数据集,并将其分为训练和验证两部分。
- 使用验证计算列车上的前 10 个特征。
- 每次使用不同的功能集重复步骤 1 和 2。
- 组合所有 10 个特征的集合,并对它们进行去重复,这将产生最佳的特征集合。
Featurewiz 使用上面讨论的两种算法来寻找最佳的特征集,该特征集可以进一步用于训练健壮的机器学习模型。
安装和使用:
Featurewiz 可以使用 Pypl 安装
**pip install featurewiz**
安装后,可以导入 featurewiz:
**from featurewiz import featurewiz**
现在,开发人员只需要编写一行代码,就可以从数据集中获得最佳的功能集。
**out1, out2 = featurewiz(dataname, target, corr_limit=0.7, verbose=0, sep=",", header=0, test_data="", feature_engg="", category_encoders="")**
Featurewiz 不仅可以处理具有一个目标变量的数据集,还可以处理具有多标签目标变量的数据集。从 featurewiz 返回的数据框包含最佳的要素集,可用于模型训练。开发者不需要指定问题的类型,如果是回归或分类,特性可以自动决定它。
结论:
在本文中,我们讨论了一个开源库 featurewiz,它可以自动选择数据集的特性。除了功能选择,featurewiz 还具有执行功能工程和生成数百个功能的能力,只需点击一下代码。
Featurewiz 使用两种算法(SULOV 和递归 XGBoost)来选择最佳的特性集。Featurewiz 只需点击一行代码即可完成整个功能选择,从而加快了数据科学家的工作流程。数据科学家可以使用几种特性选择技术来筛选出最佳特性,您可以在下面提到的文章中阅读其中的 7 种特性选择技术。
参考资料:
[1] Featurewiz GitHub 回购:https://github.com/AutoViML/featurewiz
感谢您的阅读
自动化您的终端改造
安装终端是你用新电脑做的第一件事吗?如果是,那么这是给你的。
在 Unsplash 上由 Haseeb Jamil 拍照。作者 Gif。
【更新:2021–12–18,font-fira-code-nerd-font 新增。]
《走向数据科学》在 2020 年 4 月发表了我的文章终端改造的终极指南。这是我最受欢迎的文章之一。自发布以来,它已经有超过 12 万的浏览量,每天大约 300 次。
这个月我不得不在我的新笔记本电脑上安装终端。按照我自己文章中的步骤,我想“嗯,我可以自动化所有这些安装。”
随后,我创建了TerminalMake overAautomated(Terma)。它会自动在新 Mac 上安装以下软件包:
警告
我为一台新的 Mac 电脑创造了 Terma。如果你已经安装了 iTerm2 和插件,我建议保存~/.oh-my-zsh
目录、~/.zshrc
文件和~/Library/Preferences/com.googlecode.iterm2.plist
。
我建议首先使用 Automate Brew Installer 来保存您的 Brew 列表,然后在 Terma 安装完成后重新安装。
我推荐使用 Dotties 来保存你的.zshrc
和其他点文件。
然后安装 Terma 并运行几次terma uninstall
,从终端而不是 iTerm 卸载上面的包。然后运行terma
两次。
安装 Terma
在查找器上查找终端。作者截图。
打开一个终端,安装牛逼包管理器。
https://medium.com/mkdir-awesome/a-new-simple-package-manager-for-script-languages-a1228fd0972a
安装令人敬畏的软件包管理器很容易。在您的终端上运行以下命令:
curl -s https://raw.githubusercontent.com/shinokada/awesome/main/install | bash -s install
一旦你安装了 Awesome 软件包管理器,安装 Terma。
awesome install shinokada/terma
入门:运行 terma 两次!
要在终端上运行 terma,请执行以下操作:
terma
安装家酿软件时,你会被要求输入密码。
Oh-My-Zsh 安装退出脚本,所以需要再次运行terma
。
terma
安装 Terma。图片作者。
iTerm2 准备好摇滚了!
当您打开新安装的 iTerm 时,按 Ctrl+右键并选择 open。
iTerm 首选项配置文件设置为名称“Terma”,颜色预设为时髦,字体为 Fira 代码。
可以使用 brew 别名,比如bubu
,自动建议,自动跳转,以上所有插件。
运行中的插件。图片作者。
打印帮助
terma -h
卸载 Terma
您可以删除所有已安装的项目,包括 Homebrew。我建议先用自动 brew 安装保存你的 Brew 列表。
terma uninstall
我从写 Terma 中学到了什么
起初,我在 Bash 中编写脚本,然后运行source $HOME/.zshrc
需要一个 ZSH 脚本。我把剧本改成了 ZSH。我需要改变的只是read
命令。
# Bash
read -rp "Do you want to uninstall? yes/y or no/n " PANS# ZSH
read "PANS?Do you want to uninstall Y/y or N/n? "
该脚本使用自制软件安装除 Oh-My-Zsh 之外的软件包。为了避免不必要的错误消息,脚本提供了适当的.zshrc
文件。对于 iTerm2 配置文件,它将一个预制的com.googlecode.iterm2.plist
文件复制到~/Library/Preferences
目录。
该脚本使用 heredoc 来显示最终消息。 Figlet 程序可以创建大字母。
结尾的留言是菲戈莱特和赫雷多克做的。图片作者。
结论
由于您将使用 Terma 安装许多程序,因此需要一些时间来完成。我在我的 2015 Mac (x86_64)和 2021 Mac (ARM 64,M1 芯片)上测试了terma
,它运行得完美无缺。
如果您有自己喜欢的 iTerm2 设置,请用~/Library/Preferences/com.googlecode.iterm2.plist
目录中的 plist 文件替换 Terma 的com.googlecode.iterm2.plist
。
编码快乐!
通过 成为 会员,可以完全访问媒体上的每个故事。
【https://blog.codewithshin.com/subscribe】