每月档案: 2013年八月

在哈佛用软件木工教授Python

BScO7AGIMAAvVZj.jpg-中

Mike用Python教Hamlet。照片版权Chris Erdmann: //twitter.com/libcce/status/371281901191196672

I’是纽约市名为Software Carpentry的组织的一部分。它使用志愿者向大学,大型政府组织和其他感兴趣的人群教授不同级别的编程。我之前曾在哥伦比亚大学任教,上周末在哈佛大学举办,由 克里斯·埃德曼,哈佛-史密森天体物理学中心的首席图书馆员。

在使用Software Carpentry之前,我的教学经验仅限于向亲朋好友讲解编程方面的内容,以及在日本为儿童和成人教英语和法语的一年时间的一部分。教学很难。它’批评老师很容易– I’我经常发现自己是如此,而没有考虑将复杂的概念传达给一群背景和动机各不相同的学生的努力和压力。一世’ve从我最近的两次SWC活动中得出了有关如何优化教学风格的一些结论:

星期六’s Teacher 线 -up

运作良好的事情

  • 幽默。迈克在教程中撒了一些有趣的轶事,这使全班都很活跃。
  • 相关和有趣的主题。哈姆雷特(Hamlet)是一个不错的选择,因为面向图书管理员的观众也喜欢在拼字游戏中作弊。字典带来了几个有趣的条目,例如:  grep “。* s。* s。* s。* s。* s。* s” |
  • 添加轶事来拯救人们谷歌搜索。我认为很多程序员’他们的活动仅仅是寻找一个’已经完成了您想做的事情,并做了一些修改–或连接构建块。因此,在结束时谈论诸如 附加 ()VS与加号等串联 第一 + 第二 我提到过类似的事情 双端队列 () 和   格式 () 一种 。

下次要记住的事情

  • 慢慢打字。我在MongoDB上工作很多,所以最终从 pymongo 进口 连接; c = 连接()每天进入终端20次以上。这可能会变得如此之快,这样的事情对于新来者来说似乎是令人困惑的。
  • 使用带有大字体和昏暗灯光的高对比度终端,使其从房间的背面超级容易看清。

什么can advanced programmers get 出 的 教学 such basic 事情 s?

  • 您’从老师和学生那里学到很多东西’s questions
  • 社区参与是简历中的一项重要资产,它向潜在的雇主表明您有能力/有能力培训未来的同事
  • 当在社会或商业上向非技术人员解释技术问题时,它有助于在教学过程中掌握现有的类比和轶事。
  • 您’会遇到许多志同道合的人,参与社区的感觉很棒。

什么did I learn?

  • 要求 图书馆。我通常使用 urllib2 从网页抓取HTML。事实证明,Urllib2只是一个用于HTTP请求的可扩展性更大的库,如下所示 stackoverflow说明.
  • 有关Git的更多信息。我在工作中使用SVN,因此不要’真的向github提交任何东西。 Git很难。 Erik是一位出色的讲师,从容不迫地从基础知识过渡到了.gitignore和diff之类的细节。
  • 什么“immutable”真正意思。我听到了很多这样的声音,这基本上意味着事情可以’被分配给一个对象。例如。的。 分裂 () myString . 分裂 ()可以’t成为变量。非常简单。

数据科学商业评论(O’Reilly, 2013)

封面

I’m目前正在参加 O’Reilly Blogger评论计划 – wh给博客作者提供了最近出版物的电子书。 

商业数据科学适应市场中一个有趣的缺口–希望能够了解什么是数据科学,如何招聘数据科学家或如何管理面向数据的团队的管理人员。它说它也适合有抱负的数据科学家,但我可能会建议 吴安德’机器学习课程 和  密码学’的Python入门课程 相反,如果你’认真对待将牙齿伸向田间的想法。

在介绍和百科全书之间的某个地方,它提供了每个子领域的相当全面的概述,包括我以前没有的区别’以前没有这么清楚地想过。作者大多不敢解释主题背后的数学。它陷入某种概率和线性代数–公认的简化符号。那里’没有真正提到实现(即,对示例进行编程),就像人们通常期望的那样’赖利;但是大多数有能力的读者现在至少会知道他们’re “looking 对于 ” perhaps 在 terms 的 包装 要安装,或者他们想尝试从头开始实施系统。它当然是为聪明,专业和远离大众科学而设计的。

尽管它非常彻底且有趣,但它可能会引起数据科学家的不安,因为数据科学家的经理是否真的必须阅读这样的书?–当然,在这样的权威地位,他们应该已经了解这些技术了吗? (一个极端的例子是一个脚注,其中甚至包含对Facebook的含义及其用途的描述)。通常,这种不平衡的层次结构是导致工作场所不必要的压力和复杂化的原因。但是,通常是这种情况,因此在这种情况下也许会很有用。

我认为,总的来说,我希望本书有所不同–关于如何将现有的数据科学知识应用于业务场景的更深入的案例研究。尽管如此,它’这是一个有趣的,智能的百科全书指南,其解释和可访问性清晰明了–我非常怀疑我能否在这方面写出更好的指南。现有的数据科学家会发现许多清晰的类比,向技术水平不高的人解释他们的技术,我认为,就其本身而言,看一看就够了

当literal_eval失败时:使用星号表示法读取日期时间对象

python中的一项重要功能是 AST (( 抽象语法树 ) 图书馆 ’s 文字评估一种 。这使您可以读取python数据类型的字符串版本:

1
2
3
4
5
6
7
8
9
>>> AST 进口 文字评估
>>> #带有一些琐碎信息的示例字典
>>> myDict = “ {'someKey':1,'otherother':2}”
>>> #让我们使用函数进行解析
>>> testEval = 文字评估( myDict )
>>> 打印 testEval
{ 'someKey' : 1, “ otherKey”: 2}
>>> 类型 ( testEval )
< 类型 'dict' >

像这样导入字典类似于 解析JSON 使用Python’s  json . 负载 解码器。但是它也有缺点’s 的 JSON’s的限制性数据类型,如我们在字典中包含例如datetime对象时所见:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
>>> myDict = “ {'someKey':1,'rightNow':datetime.datetime(2013,8,10,21,46,52,638649)}“
>>>
>>> 文字评估( myDict )
追溯 ( 最近 呼叫 持续 ):
   文件 "<stdin>", 线 1, <模组>
   文件 “ /root/anaconda/lib/python2.7/ast.py”, 线 80, 文字评估
     返回 _兑换 ( 节点 _or_string)
   文件 “ /root/anaconda/lib/python2.7/ast.py”, 线 63, _兑换
     压缩 ( 节点 ., 节点 . 价值观 ))
   文件 “ /root/anaconda/lib/python2.7/ast.py”, 线 62, <基因>
     返回 字典 (( _兑换 (k), _兑换 (v)) 对于 k, v
   文件 “ /root/anaconda/lib/python2.7/ast.py”, 线 79, _兑换
     提高 ValueError (“格式错误的字符串”)
ValueError : 畸形的

因此,您可以尝试编写一些代码来自己解析字典数据类型。这变得非常棘手,但是最终您可能可以容纳所有常见的数据类型:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
定义 read_dict (d):
    “接受包含字典的字符串。
    试图对此进行解析并返回字典。”
    parsed_dict = {} #结果
    #删除{}并分成大块
    d = d[1:-1]. 分裂 ( ',' )
    #遍历大块并尝试解释它们
     对于 kv_pair d:
        #由中央结肠分裂
         kv_pair = kv_pair . 分裂 ( “:” )
        #解释键和值
        k = 我是什么 ( kv_pair [0])
        v = 我是什么 ( kv_pair [1])
        #添加到最终解析的字典中
        parsed_dict[k] = v
     返回 parsed_dict
 
定义 我是什么 ( 事情 ):
    “解释字符串的简单尝试
    数据类型。可以处理字符串和整数”
    #删除任何反引号
     如果 事情 .以。。开始( “” ) 要么 事情 .以。。开始( “” ):
         事情 = 事情 [1:-1]
 
    #Now检查数据类型(尽管还有更多方法)
     如果 事情 . 等轴 ():
         返回 整型 ( 事情 ) #返回数字
     其他 :
         返回 事情 #返回字符串
    #如果任何一个都无法识别,则返回错误
     返回 “数据损坏”

但这仍然没有’真正解决我们的日期时间对象问题:

1
2
3
4
5
>>> read_dict ( myDict )
追溯 ( 最近 呼叫 持续 ):
   文件 "<stdin>", 线 1, <模组>
   文件 "<stdin>", 线 13, read_dict
IndexError: 清单 指数 范围

这是本文重点所在。起初我以为我可以处理日期时间’通过提取类来格式化  约会时间 . 约会时间 (2013, 8, 10, 21, 46, 52, 638649)作为一个元组,可以通过发现方括号,然后将其返回到日期时间,例如: 

1
2
3
4
5
>>> x = (2013, 8, 10, 21, 46, 52, 638649)
>>> parsedDate = 约会时间 (x)
追溯 ( 最近 呼叫 持续 ):
   文件 "<stdin>", 线 1, <模组>
TypeError : 一个 整数 需要

但显然不是。必须提取元组–不是通过lambda或列表理解,而是实际上使用星号表示法:

1
2
3
>>> parsedDate = 约会时间 (*x)
>>> 打印 parsedDate
2013-08-10 21:46:52.638649

星号(*)将x等可迭代程序解压缩为该函数的位置参数。简单!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
定义 我是什么 ( 事情 ):
    “解释字符串的简单尝试
    数据类型。可以处理str,int,datetime”
    #删除任何反引号
     如果 事情 .以。。开始( “” ) 要么 事情 .以。。开始( “” ):
         事情 = 事情 [1:-1]
 
    #现在检查某些数据类型
     如果 事情 . 等轴 ():
         返回 整型 ( 事情 ) #返回数字
     小精灵 事情 .以。。开始('约会时间'):
        #获取括号之间的数字
         事情 = 事情 . 分裂 ( '(' )[1]. 分裂 ( ')' )[0]
        #解析数字,解压缩为日期时间并返回
         返回 约会时间 (*[ 整型 (x) 对于 x 事情 ])
     其他 :
         返回 事情 #返回字符串
    #如果任何一个都无法识别,则返回错误
     返回 “数据损坏”