互为你我:Python 与 Stata 对比

论坛 期权论坛 期权     
Stata连享会   2019-4-22 12:28   9318   0
来源: Comparison with Stata   
译者:郭李鹏 (山西晋城市财政局)
Stata 连享会:知乎 | 简书 | 码云
编者按: 不同语言和软件有其独特功能。在研究工作中,我们往往会同时采用多种工具完成我们的研究任务。本文通过实例对比 Python 和 Stata 在语法上的差别,以便于各位能在二者之间自如切换。事实上,两边的用户都在努力促成彼此的融合,介绍 Python 与 Stata 结合的文章如下:
  • 双剑合璧之Stata与Python:初识IPyStata - 知乎
  • Data Workflows in Stata and Python Data Workflows in Stata and Python
  • Python - Comparison with Stata — pandas 0.24.2 documentation
  • GitHub - jrfiedler/python-in-stata: Use Python within Stata
python 爬虫与文本分析专题-现场班

连享会-Python爬虫与文本分析现场班-山西大学 2019.5.17-19[h2]一起学空间计量……[/h2]
空间计量专题-西安 2019.6.27-30
特别说明
文中包含的链接在微信中无法生效。请点击本文底部左下角的
  1. 【阅读原文】
复制代码
,转入本文
  1. 【简书版】
复制代码

对于使用 Stata 的用户,本文通过对比演示如何用 pandas 实现 Stata 的基本操作。
如果你对 pandas 还不熟悉,你可以先通读一遍 10 分钟入门 pandas ,熟悉一下相关库。
通常我们按照如下方式导入 pandas 和 numpy 库,在本文后续部分,我们将使用 pd 和 np 分别代表相关库。
    1. In [1]: import pandas as pd
    复制代码

    1. In [2]: import numpy as np
    复制代码
请注意
本文通过调用
  1. df.head()
复制代码
命令来显示 pandas 数据集
  1. DataFrame
复制代码
的前 N ( 默认 5 ) 行数据。Stata 中对应命令为:
    1. list in 1/5
    复制代码
[h1]1. 数据结构[/h1][h2]1.1 常用术语对照[/h2]pandasStataDataFramedata setcolumnvariablerowobservationgroupbybysortNaN.[h2]1.2 DataFrame / Series[/h2]pandas 中的
  1. DataFrame
复制代码
类似于 Stata 数据集——一个二维数据,每列可以是不同的值类型。正如本文将要展示,几乎任何可以对 Stata 的数据集应用的操作都可以在 pandas 中完成。
  1. Series
复制代码
是表示
  1. DataFrame
复制代码
列的数据结构。Stata 没有针对列的单独数据结构,但通常,使用
  1. Series
复制代码
类似于引用 Stata 数据集中的列。
[h2]1.3 Index[/h2]每个
  1. DataFrame
复制代码
  1. Series
复制代码
都有一个
  1. Index
复制代码
索引——数据 的标签。Stata 没有一个完全类似的概念。在 Stata 中,除了可以用暗含索引
  1. _n
复制代码
访问行外,数据基本没有行标签。
在 pandas 中,即使没有指定索引,也可以使用默认整数索引(第一行= 0,第二行= 1,依次类推)。虽然使用单个索引或多个索引可以进行复杂的分析,并且是
  1. pandas
复制代码
的重要功能,但是为了与 Stata 比较,本文中将基本忽略行索引,只将
  1. DataFrame
复制代码
作为列的集合。获取更多有关使用索引的信息,请参阅索引文档。
[h1]2. Data Input / Output[/h1][h2]2.1 创建 DataFrame[/h2]Stata数据通过
  1. input
复制代码
语句赋值并指定列名。
    1. input x y
    复制代码
    1. 1 2
    复制代码
    1. 3 4
    复制代码
    1. 5 6
    复制代码
    1. end
    复制代码
创建
  1. DataFrame
复制代码
有很多,数据量较小时,最常用的方法是传入一个 Python 字典,其中字典每一个 key 对应一列,与 key 对应 value 是该列下所有数据。
    1. In [3]: df = pd.DataFrame({'x': [1, 3, 5], 'y': [2, 4, 6]})
    复制代码
    1. In [4]: df
    复制代码
    1. Out[4]:
    复制代码
    1.    x  y
    复制代码
    1. 0  1  2
    复制代码
    1. 1  3  4
    复制代码
    1. 2  5  6
    复制代码
[h2]2.2 读取外部数据[/h2]与 Stata 一样,pandas 可以从许多格式文件中读取数据。可以通过链接获取 pandas 测试数据集
  1. tips
复制代码
,我们将在下面的许多示例中使用到这份数据。
Stata 通过
  1. import delimited
复制代码
将 csv 数据文件读入内存中。如果
  1. tips.csv
复制代码
文件在当前工作目录中,我们可以按照以下方式导入。
    1. import delimited tips.csv
    复制代码
pandas 通过
  1. read_csv()
复制代码
方法读取 csv 文件,与 Stata 工作原理类似。此外,pandas 可以通过 url 自动下载数据集。
    1. In [5]: url = ('https://raw.github.com/pandas-dev'
    复制代码
    1. ...:       '/pandas/master/pandas/tests/data/tips.csv')
    复制代码
    1. ...:
    复制代码

    1. In [6]: tips = pd.read_csv(url)
    复制代码

    1. In [7]: tips.head()
    复制代码
    1. Out[7]:
    复制代码
    1.    total_bill   tip     sex  smoker  day    time  size
    复制代码
    1. 0       16.99  1.01  Female     No  Sun  Dinner     2
    复制代码
    1. 1       10.34  1.66    Male     No  Sun  Dinner     3
    复制代码
    1. 2       21.01  3.50    Male     No  Sun  Dinner     3
    复制代码
    1. 3       23.68  3.31    Male     No  Sun  Dinner     2
    复制代码
    1. 4       24.59  3.61  Female     No  Sun  Dinner     4
    复制代码
  1. import delimited
复制代码
一样,
  1. read_csv()
复制代码
可以使用更多参数来导入数据。例如,如果数据是用 tab 分隔的,没有列名,并且存在于当前工作目录中, panda 命令将是:
    1. tips = pd.read_csv('tips.csv', sep='\t', header=None)
    复制代码

    1. # alternatively, read_table is an alias to read_csv with tab delimiter
    复制代码
    1. tips = pd.read_table('tips.csv', header=None)
    复制代码
pandas 还可以使用
  1. read_stata()
复制代码
函数读取
  1. .dta
复制代码
格式的 Stata 数据。
    1. df = pd.read_stata('data.dta')
    复制代码
除了 text/csv 和 Stata 文件之外,pandas 还支持许多种其他数据格式,如 Excel / SAS / HDF 5 / Parquet 和 SQL 数据库。这些都是通过
  1. pd.read_*
复制代码
相关命令读取的。有关详细信息,请参阅 IO 文档。
[h2]2.3 导出数据[/h2]在 Stata 中,与
  1. import delimited
复制代码
功能相反的函数是
  1. export delimited
复制代码

    1. export delimited tips2.csv
    复制代码
类似地,在 pandas 中,
  1. read_csv
复制代码
功能相反的函数是
  1. DataFrame.to_csv()
复制代码

    1. tips.to_csv('tips2.csv')
    复制代码
pandas 还可以使用
  1. DataFrame.to_stata()
复制代码
方法导出到 Stata 格式文件。
    1. tips.to_stata('tips2.dta')
    复制代码
[h1]3. 数据操作[/h1][h2]3.1 列操作[/h2]在 Stata 中,可以使用
  1. generate
复制代码
  1. replace
复制代码
在数据某一列或新产生一列上运算任意数学公式。
    1. replace total_bill = total_bill - 2
    复制代码
    1. generate new_bill = total_bill / 2
    复制代码
    1. drop new_bill
    复制代码
pandas 通过在
  1. DataFrame
复制代码
中 x 选定各个
  1. Series
复制代码
来进行类似的向量化操作。可以用同样的方法产生新的列。可以用
  1. DataFrame.drop()
复制代码
方法从 DataFrame 中删除列。
    1. In [8]: tips['total_bill'] = tips['total_bill'] - 2
    复制代码

    1. In [9]: tips['new_bill'] = tips['total_bill'] / 2
    复制代码

    1. In [10]: tips.head()
    复制代码
    1. Out[10]:
    复制代码
    1. total_bill   tip     sex smoker  day    time  size  new_bill
    复制代码
    1. 0       14.99  1.01  Female     No  Sun  Dinner     2     7.495
    复制代码
    1. 1        8.34  1.66    Male     No  Sun  Dinner     3     4.170
    复制代码
    1. 2       19.01  3.50    Male     No  Sun  Dinner     3     9.505
    复制代码
    1. 3       21.68  3.31    Male     No  Sun  Dinner     2    10.840
    复制代码
    1. 4       22.59  3.61  Female     No  Sun  Dinner     4    11.295
    复制代码

    1. In [11]: tips = tips.drop('new_bill', axis=1)
    复制代码
[h2]3.2 条件过滤[/h2]Stata 中使用
  1. if
复制代码
语句对一个或多个列的数据进行筛选。
    1. list if total_bill > 10
    复制代码
DataFrames 有多种过滤方式,最直观的是使用   boolean indexing 。
    1. In [12]: tips[tips['total_bill'] > 10].head()
    复制代码
    1. Out[12]:
    复制代码
    1.    total_bill   tip     sex  smoker  day    time  size
    复制代码
    1. 0       14.99  1.01  Female     No  Sun  Dinner     2
    复制代码
    1. 2       19.01  3.50    Male     No  Sun  Dinner     3
    复制代码
    1. 3       21.68  3.31    Male     No  Sun  Dinner     2
    复制代码
    1. 4       22.59  3.61  Female     No  Sun  Dinner     4
    复制代码
    1. 5       23.29  4.71    Male     No  Sun  Dinner     4
    复制代码
[h2]3.3 If 条件语句[/h2]在 Stata 中,可以使用 if 语句来创建新列。
    1. generate bucket = "low" if total_bill = 10
    复制代码
在 pandas 中也可以使用
  1. numpy
复制代码
  1. where
复制代码
方法来完成相同的操作。
  • [code]In [13]: tips['bucket'] = np.where(tips['total_bill']
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:190
帖子:39
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP