乐趣区

Python数据分析实用程序

  • 来源 | 愿码 (ChainDesk.CN) 内容编辑
  • 愿码 Slogan | 连接每个程序员的故事
  • 网站 | http://chaindesk.cn
  • 愿码愿景 | 打造全学科 IT 系统免费课程,助力小白用户、初级工程师 0 成本免费系统学习、低成本进阶,帮助 BAT 一线资深工程师成长并利用自身优势创造睡后收入。
  • 官方公众号 | 愿码 | 愿码服务号 | 区块链部落
  • 免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码

本文阅读时长:13min

本文包含以下部分:

  • 数据分析,数据科学,大数据
  • Python 的数据分析简史
  • dautil 的高级概述
  • IPython 笔记本实用程序
  • 下载数据
  • 绘制实用程序
  • 揭开 Docker 的神秘面纱

数据分析,数据科学,大数据


您可能已经看到维恩图将数据科学描述为数学 / 统计学,计算机科学和领域专业知识的交集。数据分析是永恒的,并且在数据科学和计算机科学之前存在。您可以使用笔和纸进行数据分析,并在更现代的时候使用袖珍计算器进行数据分析。

数据分析涉及许多方面,例如做出决策或提出新的假设和问题。围绕数据科学和大数据的炒作,状态和经济回报让我想起了数据仓库和商业智能成为流行语的时间。商业智能和数据仓库的最终目标是构建管理仪表板。这涉及很多政治和组织方面,但在技术方面,主要是关于数据库。另一方面,数据科学不是以数据库为中心的,而是在很大程度上依赖于机器学习。机器学习由于数据量较大,技术已成为必要。数据增长是由世界人口的增长和社交媒体和移动设备等新技术的兴起引起的。实际上,数据增长可能是我们可以确定的唯一趋势。构建仪表板和应用机器学习之间的区别与搜索引擎的演变方式类似。

搜索引擎最初只不过是手工创建的组织良好的链接集合。最终,自动化方法获胜。由于将及时创建更多数据(而不是销毁),我们可以预期自动数据分析会增加。

Python 的数据分析简史

  • 1989 年:Guido van Rossum 在荷兰的 CWI 实施了第一个 Python 版本,作为圣诞节爱好项目。
  • 1995 年:Jim Hugunin 创建了 NumPy 的前身 Numeric。
  • 1999 年:Pearu Peterson 将 f2py 描述为 Fortran 和 Python 之间的桥梁。
  • 2000:Python 2.0 发布。
  • 2001:SciPy 库发布。此外,还创建了 Numarray,一个竞争的数字库。费尔南多佩雷斯发布了 IPython,这是一个下午的黑客攻击。NLTK 作为一个研究项目发布。
  • 2002 年:John Hunter 创建了 matplotlib 库。
  • 2005 年:NumPy 由 Travis Oliphant 发布。最初,NumPy 是 Numeric 扩展,其功能受到 Numarray 的启发。
  • 2006:NumPy 1.0 发布。SQLAlchemy 的第一个版本发布了。
  • 2007 年:scikit-learn 项目由 David Cournapeau 发起为 Google Summer of Code 项目。Cython 是从 Pyrex 分叉的。Cython 后来被大量用于熊猫和 scikit- 学习以提高性能。
  • 2008 年:Wes McKinney 开始研究 Pandas。Python 3.0 发布了。
  • 2011:IPython 0.12 版本引入了 IPython 笔记本。Packt 发布了 NumPy 1.5 初学者指南。
  • 2012 年:Packt 发布了 NumPy Cookbook。
  • 2013:Packt 发布 NumPy 初学者指南 – 第二版。
  • 2014 年:Fernando Perez 宣布 Project Jupyter,旨在打造一款与语言无关的笔记本电脑。Packt 发布了学习 NumPy 数组和 Python 数据分析。
  • 2015:Packt 发布 NumPy 初学者指南 – 第三版和 NumPy Cookbook – 第二版。

dautil 的高级概述


dautil 模块总结在下表中:

描述 LOC
dautil.collect 包含与集合相关的实用程序 331
dautil.conf 包含配置实用程序 48
dautil.data 包含用于下载和加载数据的实用程序 468
dautil.db 包含与数据库相关的实用程序 98
dautil.log_api 包含日志实用程序 204
dautil.nb 包含 IPython / Jupyter 笔记本小部件和实用程序 609
dautil.options 配置与数据分析相关的多个库的动态选项 71
dautil.perf 包含与性能相关的实用程序 162
dautil.plotting 包含绘图实用程序 382
dautil.report 包含报告实用程序 232
dautil.stats 包含统计函数和实用程序 366
dautil.ts 包含时间序列和日期的实用程序 217
dautil.web 包含用于 Web 挖掘和 HTML 处理的实用程序 47

IPython 笔记本实用程序


IPython 笔记本已成为数据分析的标准工具。该 dautil.nb 有几个互动 IPython 的小部件,以帮助乳胶渲染,matplotlib 属性的设置,和绘图。Ivan 定义了一个 Context 类,它表示小部件的配置设置。这些设置存储在当前工作目录中名为 dautil.json 的漂亮打印的 JSON 文件中。这可以扩展,甚至可以使用数据库后端。以下是一个示例 dautil.json 的编辑摘录(因此它不占用大量空间):

{

   ...

   "calculating_moments": {"figure.figsize": [ 10.4, 7.7],

       "font.size": 11.2

   },

   "calculating_moments.latex": [1, 2, 3, 4, 5, 6, 7],

   "launching_futures": {"figure.figsize": [ 11.5, 8.5]

   },

   "launching_futures.labels": [[ {}, {

               "legend": "loc=best",

               "title": "Distribution of Means"

           }

       ],

       [

           {

               "legend": "loc=best",

               "title": "Distribution of Standard Deviation"

           },

           {

                "legend": "loc=best",

               "title": "Distribution of Skewness"

           }

       ]

   ],

...

}

 Context 对象可以使用字符串构建 – Ivan 建议使用笔记本的名称,但任何唯一标识符都可以。该 dautil.nb.LatexRenderer 还使用了 Context 类。它是一个实用程序类,可帮助您在 IPython / Jupyter 笔记本中编号和渲染 Latex 方程式,例如,如下所示:

import dautil as dl

 

lr = dl.nb.LatexRenderer(chapter=12, context=context)

lr.render(r'delta! = x - m')

lr.render(r'm' = m + frac{delta}{n}')

lr.render(r'M_2' = M_2 + delta^2 frac{ n-1}{n}')

lr.render(r'M_3' = M_3 + delta^3 frac{ (n - 1) (n - 2)}{n^2}/

- frac{3delta M_2}{n}')

lr.render(r'M_4' = M_4 + frac{delta^4 (n - 1) /

(n^2 - 3n + 3)}{n^3} + frac{6delta^2 M_2}/

{n^2} - frac{4delta M_3}{n}')

lr.render(r'g_1 = frac{sqrt{n} M_3}{M_2^{3/2}}')

lr.render(r'g_2 = frac{n M_4}{M_2^2}-3.')

结果如下:

您可能会发现有用的另一个小部件是 RcWidget,它设置 matplotlib 设置,如以下屏幕截图所示:

下载数据


有时,我们需要样本数据来测试算法或原型可视化。在 dautil.data 模块中,您将找到许多用于数据检索的实用程序。模块中的一些实用程序在现有的 pandas 函数之上添加了一个缓存层,例如从世界银行和 Yahoo! 下载数据的 pandas 函数。您还可以获取音频,人口统计,Facebook 和营销数据。

数据存储在特殊数据目录下,该目录取决于操作系统。以下示例代码从 SPAN Facebook 数据集加载数据并计算 clique 数:

import networkx as nx

import dautil as dl

 

 

fb_file = dl.data.SPANFB().load()

G = nx.read_edgelist(fb_file,

                     create_using=nx.Graph(),

                     nodetype=int)

 

print('Graph Clique Number',

     nx.graph_clique_number(G.subgraph(list(range(2048)))))

绘制实用程序


Ivan 在书中经常可视化数据。绘图有助于我们了解数据的结构,并帮助您形成假设或研究问题。通常,我们想要绘制多个变量,但我们希望很容易看出它是什么。matplotlib 中的标准解决方案是循环颜色。但是,Ivan 更喜欢循环线宽和线条样式。以下单元测试演示了他对此问题的解决方案:

 def test_cycle_plotter_plot(self):

       m_ax = Mock()

       cp = plotting.CyclePlotter(m_ax)

       cp.plot([0], [0])

       m_ax.plot.assert_called_with([0], [0], '-', lw=1)

       cp.plot([0], [1])

       m_ax.plot.assert_called_with([0], [1], '--', lw=2)

       cp.plot([1], [0])

       m_ax.plot.assert_called_with([1], [0], '-.', lw=1)

该 dautil.plotting 模块目前也有次要情节,直方图,回归图使用的辅助工具,并处理彩色地图。下面的示例代码(标签的代码已被省略)演示了条形图实用程序功能和 dautil.data 的实用程序功能,它下载了股票价格数据:

import dautil as dl

import numpy as np

import matplotlib.pyplot as plt

 

 

ratios = []

STOCKS = ['AAPL', 'INTC', 'MSFT', 'KO', 'DIS', 'MCD', 'NKE', 'IBM']

 

for symbol in STOCKS:

   ohlc = dl.data.OHLC()

   P = ohlc.get(symbol)['Adj Close'].values

   N = len(P)

   mu = (np.log(P[-1]) - np.log(P[0]))/N

   var_a = 0

   var_b = 0

 

   for k in range(1, N):

       var_a = (np.log(P[k]) - np.log(P[k - 1]) - mu) ** 2

       var_a = var_a / N

 

   for k in range(1, N//2):

       var_b = (np.log(P[2 * k]) - np.log(P[2 * k - 2]) - 2 * mu) ** 2

       var_b = var_b / N

 

   ratios.append(var_b/var_a - 1)

 

_, ax = plt.subplots()

dl.plotting.bar(ax, STOCKS, ratios)

plt.show()

有关最终结果,请参阅以下屏幕截图:

代码执行随机游走测试并计算股票价格列表的相应比率。每当您运行代码时都会检索数据,因此您可能会得到不同的结果。

以下脚本演示了世界银行数据的线性回归实用程序和缓存下载程序(省略了水印和绘图标签的代码):

import dautil as dl

import matplotlib.pyplot as plt

import numpy as np

 

 

wb = dl.data.Worldbank()

countries = wb.get_countries()[['name', 'iso2c']]

inf_mort = wb.get_name('inf_mort')

gdp_pcap = wb.get_name('gdp_pcap')

df = wb.download(country=countries['iso2c'],

                 indicator=[inf_mort, gdp_pcap],

                start=2010, end=2010).dropna()

loglog = df.applymap(np.log10)

x = loglog[gdp_pcap]

y = loglog[inf_mort]

 

dl.options.mimic_seaborn()

fig, [ax, ax2] = plt.subplots(2, 1)

ax.set_ylim([0, 200])

ax.scatter(df[gdp_pcap], df[inf_mort])

ax2.scatter(x, y)

dl.plotting.plot_polyfit(ax2, x, y)

plt.show()

 代码应显示以下图像:

该计划下载 2010 年世界银行数据,并将婴儿死亡率与人均 GDP 进行对比。还示出了对数变换数据的线性拟合。

揭开 Docker 的神秘面纱


Docker 使用 Linux 内核功能来提供额外的虚拟化层。它由 Solomon Hykes 于 2013 年创建。Boot2Docker 允许我们在 Windows 和 Mac OS X 上安装 Docker。Boot2Docker 使用包含带有 Docker 的 Linux 环境的 VirtualBox VM。介绍中提到的 Ivan 的 Docker 镜像基于 continuumio / miniconda3 Docker 镜像。

安装 Boot2Docker 后,需要对其进行初始化。这只需要一次,Linux 用户不需要这一步:$ boot2docker init

Mac OS X 和 Windows 用户的下一步是启动 VM:

$ boot2docker start

通过启动示例容器来检查 Docker 环境:

$ docker run hello-world

Docker 镜像组织在一个类似于 GitHub 的存储库中。制作人推送图像,消费者拉动图像。您可以使用以下命令拉出 Ivan 的存储库。目前的大小为 387 MB。

$ docker pull ivanidris/pydacbk
退出移动版