Python与Stata的数据交互

最近拿到了Stata的船新版本——Stata16,就迫不及待地玩了两天。总的来说,Stata16不论在UI上,还是在功能上,都比之前的版本进步了许多。

特别值得一说的是,Stata终于牵手Python了——用户可以在直接进入Python的交互模式,或者运行Python的脚本。这样就可以借他山之石以攻玉。比如说,我们用Python爬取的数据,然后交由Stata进行处理;或者将Stata中的数据交由Python的Matplotlib库绘制三维图像等。这是Stata发展历程中的一大进步。

当然,Stata与Python的结合过程中仍然存在大量问题,需要Stata的开发人员持续改进。这一篇我们将结合Stata的Python开发文档(连接:https://www.stata.com/python/api16/index.html),来介绍二者之间的数据交互问题。

1. 进入Python交互模式

首先,你得确保的电脑上已经安装了Python,并且Stata中执行Python的路径设置正确。然后,你可以通过在命令窗口输入:

python

接着你就进入了如下图的Python交互模式:

然后你就可以数据Python的代码,Stata会自己调用Python解释器进行解释,然后输出结果。

比如,输入以下代码用于打印乘法口诀:

for i in range(1, 10):

for j in range(1, i+1):

print("%d*%d=%-4.0d" % (j, i, i*j), end="")

print("")

注意缩进!!Python对于缩进有严格规定。结果如下:

最后,你可以输入end以结束Python交互模式。

2. 从Tushare获取数据

Tushare是一个免费、开源的python财经数据接口包,在此向大家安利这个包,大家可以通过这个链接(https://tushare.pro/register?reg=224853)去注册使用。当然不注册也可以用。

由于Stata的Python API文档中关于Data类的介绍中已经举了一些使用Python获取Stata中数据的例子(链接https://www.stata.com/python/api16/Data.html#examples)。

因此,在这里,我就只介绍如何使用Python获取的数据存储到Stata中。这里我们主要使用的是sfi(Stata Function Interface)模块中的Data类。

Data类中add族方法用于向当前Stata数据集中添加观察值或变量;get族方法用于获取当前Stata数据集中的观察值;set族方法用于设置当前数据集的一些属性;store族方法用于将数据保存到当前Stata数据集中。

看下面代码:

# 获取Tushare存款利率数据

clear

python:

from sfi import Data

import tushare as ts

# 创建数据集和变量

df = ts.get_deposit_rate()

Data.addObs(df.shape[0])

Data.addVarStrL('date')

Data.addVarStrL('deposit_type')

Data.addVarStrL('rate')

# 存储数据

Data.store('date', None, df.iloc[:,0])

Data.store('deposit_type', None, df['deposit_type'])

Data.store('rate', None, df['rate'])

end

br

第3行,用于进入Python交互模式; 第4~5行,导入相关的包; 第8行,从Tushare上获取存款基准利率; 第9行,调用Data类中的addObs()方法,用于给当前Stata数据集(空)中创建若干个观察值,相当于Stata中的命令set obs 100。df.shape[0]将返回数据的行数。 第10~12行,由于我已经知道了df中有3列数,且它们的类型都是object,因此这里将使用addVarStrL()方法创建3个字符串变量,变量名分别为date,deposit_type和rate。尽管已经创建了变量,但此时Stata数据集中仍然没有存储数据。 第15~17行,将df中的数据使用store()方法存储到刚才创建的变量中。 第19行,退出Python交互模式。

结果如下:

3. 多个变量

上述数据中只有3列数据,所以可以不辞辛苦地对每一个变量分别进行处理,那么如果变量很多呢?一个个地设置变量类型,然后存储数据,那将太麻烦了。因此,要写个循环。

代码如下:

clear

python:

from sfi import Data

import tushare as ts

# 创建数据集和变量

df = ts.day_boxoffice()

Data.addObs(df.shape[0])

for i in range(0, df.shape[1]):

Data.addVarStrL(df.iloc[:, i].name)

# 存储数据

for i in range(0, df.shape[1]):

Data.store(df.iloc[:, i].name, None, df.iloc[:, i])

end

br

上述代码,是用于获取当日票房的数据的。比较简单,就不赘述了,结果如下:

4. 多数据类型

也许你发现了,我们存到Stata中的数据都是字符串形式,这是因为上述df中的数据类型都是object类型,只能将其处理成字符串形式。那如果有些数据中包含整数或者浮点数呢?

在这里需要知道,Pandas库是基于Numpy库进行构建的。因此Pandas中的DataFrame的基本数据类型就是Numpy的基础数据类型,如下:

基于此,获取沪深300的历史数据的过程如下:

clear

python:

from sfi import Data

import matplotlib.pyplot as plt

import numpy as np

import tushare as ts

# 定义数据类型

intList = [np.int8, np.int16, np.int32, np.int64,

np.uint8, np.uint16, np.uint32, np.uint64]

floatList = [np.float16, np.float32, np.float64]

# 获取数据

df = ts.get_hist_data('hs300')

df = df.reset_index() # 将索引转化为列

# 添加变量

Data.addObs(df.shape[0])

for i in range(0, df.shape[1]):

if df.iloc[:, i].dtype in intList:

Data.addVarInt(df.iloc[:, i].name)

elif df.iloc[:, i].dtype in floatList:

Data.addVarFloat(df.iloc[:, i].name)

else:

Data.addVarStrL(df.iloc[:, i].name)

# 存储数据

for i in range(0, df.shape[1]):

Data.store(df.iloc[:, i].name, None, df.iloc[:, i])

# 绘制图形

df[['close', 'ma5', 'ma10', 'ma20']].plot(

kind='line',

figsize=(16, 9),

grid=True,

title='HS300',

fontsize=12)

plt.show()

end

br

第9~12行用于将int型和float的数据类型分别放到两个列表中。 第21~27行用于根据不同的数据类型来创建不同类型的变量; 第33~40行用于绘图。

获取数据结果如下:

绘制的图:

5. 还需要改进的地方

在Stata中运行Python代码是其一个长足的进步,但就目前来看,仍有许多改进的地方。

首先,SFI中没有将DataFrame数据直接转化为Stata当前数据集中的数据的相关API,还需要进一步的编程来实现,不是很方便

其次,Data类中没有设置时间日期类型变量的方法。这就使得任何时间变量要么以字符串的形式保存,要么转化为时间戳以整数或浮点数的形式保存(并且Stata和Python中关于时间戳的定义并不相同),因此,时间日期变量的处理就相当麻烦。

中肯地说,瑕不掩瑜。

python和stata_Python与Stata的数据交互相关推荐

  1. python 当前时间的前一天_Python与Stata的数据交互

    Python与Stata的数据交互 最近拿到了Stata的船新版本--Stata16,就迫不及待地玩了两天.总的来说,Stata16不论在UI上,还是在功能上,都比之前的版本进步了许多. 特别值得一说 ...

  2. Python和Stata的数据交互

    最近拿到了Stata的船新版本--Stata16,就迫不及待地玩了两天.总的来说,Stata16不论在UI上,还是在功能上,都比之前的版本进步了许多. 特别值得一说的是,Stata终于牵手Python ...

  3. Slog3_如何使用Python与Mysql进行数据交互

    ArthurSlog SLog-3 Year·1 Guangzhou·China July 9th 2018 自己的梦想需要你自己去实现 开发环境MacOS(High Sierra 10.13.5) ...

  4. python函数手册 stata_Python 与 Stata 配合批量转换数据

    作者:胡国恒 (武汉大学社会保障中心) Stata 连享会: 提要: 数据处理过程中,研究者常会遇到收集的数据与预期采用的工具不匹配问题.目前,常用的方式是 Datatransfer 等数据格式转换器 ...

  5. django前端引用数据_「基于Python技术的智慧中医商业项目」Django前端网站篇-5.资讯的数据交互...

    如果你对中医感兴趣欢迎留言讨论,觉得我的内容对你有帮助的话,能够请我喝一杯沪上阿姨不禁万分感谢. 内容简介 本章介绍Django搭建中医网站项目平台前端建设之资讯模块的数据交互的内容.其中由于代码量较 ...

  6. php和python交互-浅析PHP与Python进行数据交互

    最近,决定在一个项目用tp5进行APP接口开发,用Python做数据分析,然后这就面临一个问题:PHP和Python如何进行数据交互? 思路 我解决此问题的方法是利用了PHP的passthru函数来调 ...

  7. php和python交互-PHP与Python进行数据交互

    最近,决定在一个项目用tp5进行APP接口开发,用Python做数据分析,然后这就面临一个问题:PHP和Python如何进行数据交互? 思路 我解决此问题的方法是利用了PHP的passthru函数来调 ...

  8. php和python-浅析PHP与Python进行数据交互

    最近,决定在一个项目用tp5进行APP接口开发,用Python做数据分析,然后这就面临一个问题:PHP和Python如何进行数据交互? 思路 我解决此问题的方法是利用了PHP的passthru函数来调 ...

  9. 利用MQTT协议与阿里云数据交互的python程序

    利用MQTT协议与阿里云数据交互的python程序 设计目的 功能要求和关键问题 环境配置问题 本地程序如何连接云上设备 云上的数据交互问题 界面设计问题 阿里云相关操作 本地程序 设计目的 设计开发 ...

最新文章

  1. 【数据处理】python数据清洗通用手法:缺失值处理
  2. Java代码示例: 使用reflections工具类获取某接口下所有的实现类
  3. java员工信息管理_基于jsp的员工信息管理-JavaEE实现员工信息管理 - java项目源码...
  4. 我花 1 分钟写了一段爬虫,帮助小姐姐解放了双手
  5. 对两个字符串进行比较,取出两个字符串中一样部分的长度
  6. 太极计算机长沙,他设计了湖南最有尊严的建筑,诗意得让你想在里面加班
  7. 你提交代码前没有校验?巧用gitHooks解决
  8. Xamarin效果第一篇之时间轴
  9. VBA中Let与Set的区别
  10. 使用嵌套循环,打印 5 行 5 列的直角三角形
  11. 服务器虚拟化的主备,云服务器可以主备切换
  12. 吴颖二:12.27 什么是现货,如何操作才能盈利
  13. 使用java类加载器,报异常java.nio.file.InvalidPathException
  14. C语言基础第三次作业
  15. Android横竖屏切换的解决方法
  16. hmcl手机版_hmcl启动器手机版
  17. 计算机会计报表管理,职称计算机考试用友财务教程:会计报表子系统的主要功能...
  18. 编程语言python入门-Python基础教程,Python入门教程(非常详细)
  19. 2020哪款蓝牙耳机降噪效果更好?100-500平价蓝牙耳机测评推荐
  20. vue-版的老虎机抽奖活动效果折腾小记

热门文章

  1. 【论文总结】Meta-Learning for semi-supervised few-shot classification(附翻译)
  2. C# 转换图片的大小
  3. APAX-5017PG 项目开发全程记录 - 调试篇
  4. 中文劲爆的音乐歌曲 有什么 国内重金属摇滚音乐,激情音乐,舞曲,电音
  5. Java 小白 彩票中奖小程序
  6. 学生信息管理系统c语言讲解,学生信息管理系统C语言课程设计讲解.doc
  7. 重置 Winsock 目录解决电脑应用无法启动问题
  8. DBCP连接池配置详解
  9. Ubuntu 安装gcc 9.1 和 C++17
  10. Web3 中的身份与信任