Python教程:10个简单窍门带你提高Python数据分析速度(附代码)

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/chen801090/article/details/95978708

Python教程:10个简单窍门带你提高Python数据分析速度(附代码)

不管在做什么事情,提示和一些小技巧总是非常有用的,在编程领域更是如此。有时候,小小的黑科技可以节省你大量的时间和精力。一个小的快捷方式或附加组件有时会是天赐之物,可以成为实用的效率助推器。

所以,这期给大家介绍下自己编程时最喜欢使用的一些提示和小技巧,也是花了些时间整理的!有些可能是大家熟悉的,而有些可能是新鲜的,我相信它们会为你下一次处理数据分析的项目时提供便利。

1.预览Pandas中的数据框数据(Dataframe)

分析预览(profiling)是一个帮助我们理解数据的过程,在Python中Pandas Profiling 是可以完成这个任务的一个工具包,它可以简单快速地对Pandas 数据框进行搜索性数据分析。Pandas中df.describe()和df.info()函数通常可以实现EDA过程的第一步,但如果只是给出非常基础的数据预览并不能对分析那些大型的数据集提供帮助。另一方面来看,Pandas Profiling函数能通过一行代码来展示出大量的信息,而在交互式HTML报告中也是这样。

对于一个给定的数据集,Pandas Profiling 工具包将会计算出下面的统计信息:

在这里插入图片描述

由pandas profiling包算出的统计信息

代码示例:

安装

Python2.x的版本中,运用pip或conda安装pandas-profiling资源包:

pip install pandas-profiling
or
conda install -c anaconda pandas-profiling

使用

现在用一个古老的泰坦尼克数据集来演示多功能python profiler的结果:

#importing the necessary packages
import pandas as pd ##使用pandas资源包
import pandas_profiling ##使用新安装的pandas profiling资源包
df = pd.read_csv('titanic/train.csv') ##读取数据形成数据框
pandas_profiling.ProfileReport(df) ##使用pandas profiling

分析数据

这一行就是你需要在jupyter notebook中形成数据分析报告所需的全部代码。这个数据报告十分详细,包括了所有必要的图表。

在这里插入图片描述

这个报告也可以用下面的代码形成交互HTML文件(interactive HTML file)导出:

profile = pandas_profiling.ProfileReport(df)
profile.to_file(outputfile="Titanic data profiling.html") ##形成Titanic data profiling.html网页

在这里插入图片描述

2.Pandas图表(Plot)的交互性

Pandas中有一个内置的.plot()函数作为数据框(Dataframe)的一部分,但因为这个函数呈现的可视化并不是交互的,这使它的功能没那么吸引人。而且,使用pandas.DataFrame.plot()函数绘制图表也并不容易。如果我们想要在没有对代码进行重大修改的情况下用pandas绘制交互式图表要怎么办?嗯,可以通过Cufflinks资源包来帮助你完成这一目的。

Cufflinks资源包将功能强大的plotly和灵活易用的pandas结合,非常便于绘图。现在我们来看看怎么安装和在pandas中使用这个资源包。

代码示例:

安装

Python2.x的版本中,使用pip安装plotly和cufflink:

pip install plotly # Plotly is a pre-requisite before installing cufflinks(plotly先于cufflinks安装)
pip install cufflinks

使用

调用方法:

#importing Pandas 
import pandas as pd ##使用pandas资源包
#importing plotly and cufflinks in offline mode
import cufflinks as cf ##使用cufflinks 和plotly资源包
import plotly.offline
cf.go_offline() ##使用cufflink包中的函数
cf.set_config_file(offline=False, world_readable=True)

下面来看一下泰坦尼克数据集所展现的魔力:

df.iplot()

在这里插入图片描述

在这里插入图片描述

右边的可视化展示的是静态的线状图,而左边的图是交互式的,并且更加详细,两个图在代码上没有重大的变化。

3.一点点魔法

Magic命令是Jupyter Notebook中的一组便捷功能,它们旨在解决数据分析中一些常见的问题。你可以用%Ismagic来查阅所有的Magic 命令。

在这里插入图片描述
上图列举了所有可用的Magic 函数

Magic命令有两大类:行magic命令(line magics),以单个% 字符为前缀,单行输入操作;单元magics命令(cell magics),以双%% 字符作为前缀,可以在多行输入操作。如果设置为1,我们使用magic 函数时不需要键入%。

下面让我们来看一下,在常见的数据分析任务中一些可能会用到的命令。

% pastebin

% pastebin将代码上传到Pastebin并返回一个链接。Pastebin是一个线上内容托管服务,我们可以在上面存储纯文本,如源代码片段,所形成的链接也可以分享给他人。事实上,Github gist也类似于pastebin,只是它带有版本控制。

代码示例:

来看一下这个file.py的python代码文件中的内容:

#file.py
def foo(x):
 return x

在Jupyter Notebook中使用% pastebin形成一个pastebin的链接。

在这里插入图片描述

%matplotlib notebook

%matplotlib inline函数用于在Jupyter笔记本中呈现静态matplotlib图。我们可以尝试用notebook来代替inline得到可轻松地缩放和调整大小的绘图,但要确保在套用matplotlib资源包之前调用该函数。

在这里插入图片描述
%matplotlib inline vs %matplotlib notebook

%run

%run函数用于jupyter notebook中运行一个python脚本文件。

%%writefile

%% writefile将执行单元的内容写入文件。下面的这段代码将写入名为foo.py的文件并保存在当前目录中。

在这里插入图片描述

%%latex

%% latex函数将单元格内容以LaTeX的形式呈现。它对于在单元格中编写数学公式和方程很有用。

在这里插入图片描述

4.发现并减少错误

交互式调试器(interactive debugger)也是一个Magic函数,但我必须给它归个类。如果你在运行代码单元出现异常时,可以在新行中键入%debug运行。这将打开一个交互式调试环境,它将您告诉你代码发生异常的位置。你还可以检查程序中分配的变量值,并在此处执行操作。点击q可退出调试器。

在这里插入图片描述

5.输出也可如此美观

如果你想生成美观的数据结构,pprint是首选的模块。它在输出字典数据或JSON数据时特别有用。下面来看一下print 和pprint输出的一个例子:

在这里插入图片描述

6.让提示更突出

可以在你的Jupyter Notebook中使用提示/注释框来突出显示任何重要的内容。注释的颜色取决于指定的提示类型。只需在代码中加入需要突出显示的内容即可。

蓝色提示框:注释

代码示例:

<div class="alert alert-block alert-info">#提示框开头
<b>Tip:</b> Use blue boxes (alert-info) for tips and notes. 
If it’s a note, you don’t have to include the word “Note”.#提示框内容
</div>#提示框结尾

输出结果:

在这里插入图片描述

黄色提示框:警告

代码示例:

<div class="alert alert-block alert-warning">
<b>Example:</b> Yellow Boxes are generally used to include additional examples or mathematical formulas.
</div>

输出结果:

在这里插入图片描述

绿色提示框:成功

代码示例:

<div class="alert alert-block alert-success">
Use green box only when necessary like to display links to related content.
</div>

输出结果:

在这里插入图片描述

红色提示框:高危

代码示例:

<div class="alert alert-block alert-danger">
It is good to avoid red boxes but can be used to alert users to not delete some important part of code etc. 
</div>

输出结果:

在这里插入图片描述

7.输出一个执行单元中的所有结果

下面来看一下Jupyter Notebook格中包含的几行代码:

In[1]: 10+5 
 11+6
Out[1]: 17

通常一个执行单元只输出最后一行的结果,而对于其他输出我们需要添加print()函数。好吧,事实证明我们可以通过在Jupyter Notebook开头添加以下代码来输出每一行的结果:

from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = “all”
现在所有结果可以被一一输出:

In[1]: 10+5 
 11+6
 12+7
Out[1]: 15
Out[1]: 17
Out[1]: 19

如果要恢复成初始设定:

InteractiveShell.ast_node_interactivity = "last_expr"

8.使用‘i’选项运行Python脚本文件

在命令行中运行python脚本的典型方法是:python hello.py。但是,如果在运行相同的脚本文件时额外添加一个 -i,例如python -i hello.py,这会带来更多好处。我们来看看是怎么回事:

首先,一旦程序结束,python不会退出编译器。因此,我们可以检查变量的值和程序中定义的函数的正确性。

其次,我们可以轻松地调用python调试器,因为我们仍然在编译器中:

import pdb
pdb.pm()

这将把我们带到代码发生异常的位置,然后我们可以去处理代码。

在这里插入图片描述

9.自动添加代码注释

Ctrl / Cmd + / 命令将自动注释执行单元中的选定行。再次点击组合将取消注释相同的代码行。

10.删除容易恢复难

你有没有不小心误删过Jupyter Notebook中的执行单元呢?如果有,这里有一个可以撤消该删除操作的快捷方式。

如果你误删了执行单元的内容,可以通过点击CTRL/CMD+Z轻松恢复。

如果你想要恢复所删除执行单元的所有内容,可以点击ESC+Z 或者 EDIT > Undo Delete Cells

总结

以上所列出来的是我自己目前在使用Python和Jupyter Notebook时所收集的一些重要技巧。我相信它们能帮助到你并让你学以致用。有补充的伙伴也可以大方的留言啦!

展开阅读全文

如何提高速度呀有代码(数据库)?

10-03

下面的代码速度慢的要命,如何能快点rncomm1.CommandText = "SELECT 类型,日期,备刀份数,备刀人员,操作次数,新,一次,二次,三次,四次,五次,断新,断一,断二,断三,断四,断五,没新,没一,没二,没三,没四,没五 from ZT_DATA_History where 类型=1 or 类型=2 or 类型=3 or 类型=4 or 类型=5 or 类型=6 or 类型=7"rn reader = comm1.ExecuteReaderrn Do While reader.Readrn sl = reader("新") + reader("一次") + reader("二次") + reader("三次") + reader("四次") + reader("五次")rn dd = reader("断新") + reader("断一") + reader("断二") + reader("断三") + reader("断四") + reader("断五")rn mysl = reader("没新") + reader("没一") + reader("没二") + reader("没三") + reader("没四") + reader("没五")rnrn DateTimeTEMP = reader("日期")rn Dim xh As Integer = DateTimeTEMP.Hourrn Dim fz As Integer = DateTimeTEMP.Minutern If xh < 7 Or (xh < 8 And fz < 30) Then '当时间小于7:30时候将日期减1rn DateTimeTEMP = DateTimeTEMP.AddDays(-1)rn End Ifrnrn comm2.CommandText = "SELECT ID from ZT_beidao_TJ where 日期=#" & DateTimeTEMP.Year & "-" & DateTimeTEMP.Month & "-" & DateTimeTEMP.Day & "# and ID='" & reader("备刀人员") & "'"rn reader2 = comm2.ExecuteReaderrn Do While reader2.Readrn bdr = reader2("ID")rn Looprn reader2.Close()rnrn Select Case reader("类型")rn Case 1rn If bdr = "" Thenrn comm2.CommandText = "insert into ZT_beidao_TJ(日期,ID,备刀份数,备刀次数,备刀数量) values('" & DateTimeTEMP.Year & "-" & DateTimeTEMP.Month & "-" & DateTimeTEMP.Day & "','" & reader("备刀人员") & "'," & reader("备刀份数") & "," & reader("操作次数") & "," & sl & ")"rn comm2.ExecuteNonQuery()rn Elsern comm2.CommandText = "Update ZT_beidao_TJ set 备刀份数=备刀份数+" & reader("备刀份数") & ",备刀次数=备刀次数+" & reader("操作次数") & ",备刀数量=备刀数量+" & sl & " where 日期=#" & DateTimeTEMP.Year & "-" & DateTimeTEMP.Month & "-" & DateTimeTEMP.Day & "# and ID='" & reader("备刀人员") & "'"rn comm2.ExecuteNonQuery()rn End Ifrn Case 2rn If bdr = "" Thenrn comm2.CommandText = "insert into ZT_beidao_TJ(日期,ID,填份份数,填份次数,填份数量) values('" & DateTimeTEMP.Year & "-" & DateTimeTEMP.Month & "-" & DateTimeTEMP.Day & "','" & reader("备刀人员") & "'," & reader("备刀份数") & "," & reader("操作次数") & "," & sl & ")"rn comm2.ExecuteNonQuery()rn Elsern comm2.CommandText = "Update ZT_beidao_TJ set 填份份数=填份份数+" & reader("备刀份数") & ",填份次数=填份次数+" & reader("操作次数") & ",填份数量=填份数量+" & sl & " where 日期=#" & DateTimeTEMP.Year & "-" & DateTimeTEMP.Month & "-" & DateTimeTEMP.Day & "# and ID='" & reader("备刀人员") & "'"rn comm2.ExecuteNonQuery()rn End Ifrn Case 3rn If bdr = "" Thenrn comm2.CommandText = "insert into ZT_beidao_TJ(日期,ID,填加次数,填加数量) values('" & DateTimeTEMP.Year & "-" & DateTimeTEMP.Month & "-" & DateTimeTEMP.Day & "','" & reader("备刀人员") & "'," & reader("操作次数") & "," & sl & ")"rn comm2.ExecuteNonQuery()rn Elsern comm2.CommandText = "Update ZT_beidao_TJ set 填加次数=填加次数+" & reader("操作次数") & ",填加数量=填加数量+" & sl & " where 日期=#" & DateTimeTEMP.Year & "-" & DateTimeTEMP.Month & "-" & DateTimeTEMP.Day & "# and ID='" & reader("备刀人员") & "'"rn comm2.ExecuteNonQuery()rn End Ifrn Case 4rn If bdr = "" Thenrn comm2.CommandText = "insert into ZT_beidao_TJ(日期,ID,完出次数,完出数量) values('" & DateTimeTEMP.Year & "-" & DateTimeTEMP.Month & "-" & DateTimeTEMP.Day & "','" & reader("备刀人员") & "'," & reader("操作次数") & "," & sl & ")"rn comm2.ExecuteNonQuery()rn Elsern comm2.CommandText = "Update ZT_beidao_TJ set 完出次数=完出次数+" & reader("操作次数") & ",完出数量=完出数量+" & sl & " where 日期=#" & DateTimeTEMP.Year & "-" & DateTimeTEMP.Month & "-" & DateTimeTEMP.Day & "# and ID='" & reader("备刀人员") & "'"rn comm2.ExecuteNonQuery()rn End Ifrn Case 5rn If bdr = "" Thenrn comm2.CommandText = "insert into ZT_beidao_TJ(日期,ID,出库次数,出库数量) values('" & DateTimeTEMP.Year & "-" & DateTimeTEMP.Month & "-" & DateTimeTEMP.Day & "','" & reader("备刀人员") & "'," & reader("操作次数") & "," & sl & ")"rn comm2.ExecuteNonQuery()rn Elsern comm2.CommandText = "Update ZT_beidao_TJ set 出库次数=出库次数+" & reader("操作次数") & ",出库数量=出库数量+" & sl & " where 日期=#" & DateTimeTEMP.Year & "-" & DateTimeTEMP.Month & "-" & DateTimeTEMP.Day & "# and ID='" & reader("备刀人员") & "'"rn comm2.ExecuteNonQuery()rn End Ifrn Case 6rn If bdr = "" Thenrn comm2.CommandText = "insert into ZT_beidao_TJ(日期,ID,完返次数,完返数量,完返断刀,完返没用) values('" & DateTimeTEMP.Year & "-" & DateTimeTEMP.Month & "-" & DateTimeTEMP.Day & "','" & reader("备刀人员") & "'," & reader("操作次数") & "," & sl & "," & dd & "," & mysl & ")"rn comm2.ExecuteNonQuery()rn Elsern comm2.CommandText = "Update ZT_beidao_TJ set 完返次数=完返次数+" & reader("操作次数") & ",完返数量=完返数量+" & sl & ",完返断刀=完返断刀+" & dd & ",完返没用=完返没用+" & mysl & " where 日期=#" & DateTimeTEMP.Year & "-" & DateTimeTEMP.Month & "-" & DateTimeTEMP.Day & "# and ID='" & reader("备刀人员") & "'"rn comm2.ExecuteNonQuery()rn End Ifrn Case 7rn If bdr = "" Thenrn comm2.CommandText = "insert into ZT_beidao_TJ(日期,ID,返库次数,返库数量,返库断刀,返库没用) values('" & DateTimeTEMP.Year & "-" & DateTimeTEMP.Month & "-" & DateTimeTEMP.Day & "','" & reader("备刀人员") & "'," & reader("操作次数") & "," & sl & "," & dd & "," & mysl & ")"rn comm2.ExecuteNonQuery()rn Elsern comm2.CommandText = "Update ZT_beidao_TJ set 返库次数=返库次数+" & reader("操作次数") & ",返库数量=返库数量+" & sl & ",返库断刀=返库断刀+" & dd & ",返库没用=返库没用+" & mysl & " where 日期=#" & DateTimeTEMP.Year & "-" & DateTimeTEMP.Month & "-" & DateTimeTEMP.Day & "# and ID='" & reader("备刀人员") & "'"rn comm2.ExecuteNonQuery()rn End Ifrn End Selectrn bdr = ""rn Looprn reader.Close() 论坛

在下要把这段代码速度提高.急呀!!!!!!!!!!!

08-25

这段代码是解析出HTML里的内容的.我现在要做的就是提高它的运行速度.因为这一段代码跑的太慢了.有时达到20秒.急呀. rnrnstd::wstring wContent = CHtmlCell::UTF8ToUnicode(csContent);rn rn std::wstring wBody = CHtmlCell::FindFirstOccuranceRegExW(wContent, _T("([\\s\\S]*)"));rnrn // Find all on the tablern FINDRESULTW tableResult;rn rn CHtmlCell::FindAllOccuranceUsingIndexW(wBody, _T(" "), _T(""), tableResult);rnrn OutputDebugString("\n##########nested For loop\n" );rn //////////////////////////////////////////////////////////////////////////rn for (FINDRESULTW::iterator i=tableResult.begin(); i!=tableResult.end(); ++i)rn rn //get the colspanrn std::wstring wTable = i->second;rn// CHtmlTable aTable;rn// aTable.put_Factor(m_iFactor);rn// aTable.put_Language(m_csLang);rn// aTable.put_ForHTML(TRUE);rn// aTable.put_rawTableW(wTable);rn rnrn//////////////////////////////////////////////////////////////////////////rn//Startrn m_bForHTML = TRUE;rn std::wstring m_csFormattedTableW;rn CELLWIDTHARRAY CellWidthArray;rnrn FINDRESULTW TRArr;rn int CellIndex;rn get_cellInfoFromTableW(wTable);rn CHtmlCell::FindAllOccuranceUsingIndexW(wTable,"", "", TRArr);rn for (FINDRESULTW::iterator i = TRArr.begin();i != TRArr.end();i ++)rn rn std::wstring wRow = i->second;rn FINDRESULTW TDArr;rn rn CHtmlRow Row;rn Row.put_Factor(m_iFactor);rn Row.put_Language(m_csLang);rn Row.put_CellDefinition(m_CellDefArr);rn CHtmlCell::FindAllOccuranceUsingIndexW(wRow, "","", TDArr);rn int CellCount=0;rn int iCellIndex=1;rn CellIndex = 1;rnrn for (FINDRESULTW::iterator iR = TDArr.begin();iR != TDArr.end();iR ++)rn rn std::wstring wCell = iR->second;rn rn BOOL isSpanned = FALSE;rnrn int colspan=get_CellColSpanFlagW(wCell,isSpanned);rnrn int CellAlignment=get_CellAlignmentW(wCell);rnrn int CellWidth = CalculateCellWidth(CellIndex, colspan);rnrn wchar_t wPadchar = get_CellPadChar(wCell);rn rn if(CellWidth!=0)rn rn // get the cell datarn std::wstring wCellData = CHtmlCell::FindFirstOccuranceRegExW(wCell, "([\\s\\S]*)");rn rn CellCount++;rn // add into the cell rowrn Row.put_CellW(CellCount,CellWidth, CellAlignment, wCellData, isSpanned, get_CellWidth(iCellIndex), colspan,wPadchar);rn iCellIndex=+colspan;rn rn rn rn rn TDArr.erase(TDArr.begin(),TDArr.end());rn Row.RenderW();rn rn CHtmlRow *CurrentRow = &Row;rn std::wstring wRowLines;rn rn int iTotalLine = CurrentRow->get_NumberOfLines();rn if (iTotalLine > 0)rn rn for(int iLine=0;iLine < iTotalLine;iLine++)rn rn std::wstring wLine = CurrentRow->get_LineWCompensated(iLine,CellWidthArray);rn if (m_bForHTML ==TRUE)rn rn wLine = CHtmlCell::AsciiToHTMLW(wLine);rn rn rn wRowLines.append(wLine);rn rn rn rn rn m_csFormattedTableW.append(wRowLines);rn rn rnrn rn TRArr.erase(TRArr.begin(),TRArr.end());rn //Endrn//////////////////////////////////////////////////////////////////////////rnrn// aTable.put_Factor(m_iFactor);rn// aTable.put_Language(m_csLang);rn// aTable.put_ForHTML(TRUE);rn// aTable.put_rawTableW(wTable);rn// aTable.RenderWTakeEntireTableIntoConsideration();rnrn std::wstring wOutput =m_csFormattedTableW /*aTable.get_TableW()*/;rn rn wBody.find(wOutput);rn wBody.replace(wBody.find(wTable),wTable.size(),wOutput);rn rn 论坛

没有更多推荐了,返回首页