以下代码按顺序执行,在ipython中执行,如果再PyCharm中,按包调用即可,如 Series([1, 2, 3, 4, 5], index=labels),使用 pd.Series([1, 2, 3, 4, 5], index=labels),pd为导入pandas时的昵称。

数据分析/创意产生

打开ipython

from IPython.display import IFrame
IFrame(src="http://pandas.pydata.org", width=800, height=350)
----------
<IPython.lib.display.IFrame at 0x222d1e0dc50>
import datetime
import pandas as pd
import pandas_datareader
from pandas import Series, DataFrame
print(pd.__version__)
----------
0.25.1
import matplotlib.pyplot as plt
import matplotlib as mpl
mpl.rc('figure', figsize=(8, 7))
mpl.__version__
----------
3.0.2

创建/加载时间序列数据

  • Python结构
  • 雅虎财经
  • CSV文件

Python结构

labels = ['a', 'b', 'c', 'd', 'e']
s = Series([1, 2, 3, 4, 5], index=labels)
s
----------
a    1
b    2
c    3
d    4
e    5
dtype: int64
'b' in s
----------
True
s['b']
----------
2
mapping = s.to_dict()
mapping
----------
{'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
Series(mapping)
----------
a    1
b    2
c    3
d    4
e    5
dtype: int64

雅虎财经

import pandas_datareader as pd_data
import datetime
aapl = pd_data.data.get_data_yahoo('AAPL',start=datetime.datetime(2006, 10, 1),end=datetime.datetime(2012, 1, 1))
aapl.head()
----------High        Low       Open      Close     Volume  Adj Close
Date
2006-10-02  10.838572  10.614285  10.728572  10.694285  178159800   9.283074
2006-10-03  10.707143  10.455714  10.635715  10.582857  197677200   9.186352
2006-10-04  10.780000  10.451428  10.585714  10.768572  207270700   9.347562
2006-10-05  10.880000  10.590000  10.647142  10.690000  170970800   9.279355
2006-10-06  10.720000  10.544286  10.631429  10.602858  116739700   9.203714

CSV文件

需要在当前目录下创建这个文件 data/aapl_ohlc.csv

Date,Open,High,Low,Close,Volume,Adj Close
2006-10-02,75.1,75.87,74.3,74.86,25451400,73.29
2006-10-03,74.45,74.95,73.19,74.08,28239600,72.52
2006-10-04,74.1,75.46,73.16,75.38,29610100,73.8
2006-10-05,74.53,76.16,74.13,74.83,24424400,73.26
2006-10-06,74.42,75.04,73.81,74.22,16677100,72.66
2006-10-09,73.8,75.08,73.53,74.63,15650800,73.06
2006-10-10,74.54,74.58,73.08,73.81,18985300,72.26
2006-10-11,73.42,73.98,72.6,73.23,20423400,71.69
2006-10-12,73.61,75.39,73.6,75.26,21173400,73.68
aapl.to_csv('data/aapl_ohlc.csv')
!head data/aapl_ohlc.csvdf = pd.read_csv('data/aapl_ohlc.csv', index_col='Date', parse_dates=True)
df.head()
----------High        Low       Open      Close     Volume  Adj Close
Date
2006-10-02  10.838572  10.614285  10.728572  10.694285  178159800   9.283074
2006-10-03  10.707143  10.455714  10.635715  10.582857  197677200   9.186352
2006-10-04  10.780000  10.451428  10.585714  10.768572  207270700   9.347562
2006-10-05  10.880000  10.590000  10.647142  10.690000  170970800   9.279355
2006-10-06  10.720000  10.544286  10.631429  10.602858  116739700   9.203714
df.index
----------
DatetimeIndex(['2006-10-02', '2006-10-03', '2006-10-04', '2006-10-05','2006-10-06', '2006-10-09', '2006-10-10', '2006-10-11','2006-10-12', '2006-10-13',...'2011-12-16', '2011-12-19', '2011-12-20', '2011-12-21','2011-12-22', '2011-12-23', '2011-12-27', '2011-12-28','2011-12-29', '2011-12-30'],dtype='datetime64[ns]', name='Date', length=1323, freq=None)

data.io的更换

原文中使用的 pandas.io.data 已经被弃用了,目前需要重新安装,本文中的使用方法为: import pandas_datareader as pd_data

官网:https://pandas-datareader.readthedocs.io/en/latest/
安装地址:https://pypi.org/project/pandas-datareader/

  • v0.8.0 是支持 Python 2.7 的最后一个版本,所以务必安装 v0.8.1 及以上版本.

Series 和 DataFrame :第一步

  • 索引
  • 切片
  • 创建新列
ts = df['Close'][-10:]
ts
----------
Date
2011-12-16    54.431427
2011-12-19    54.601429
2011-12-20    56.564285
2011-12-21    56.635715
2011-12-22    56.935715
2011-12-23    57.618572
2011-12-27    58.075714
2011-12-28    57.520000
2011-12-29    57.874287
2011-12-30    57.857143
Name: Close, dtype: float64

DataFrame是一系列对象的集合。将DataFrame列切割出来将返回一个系列。

type(ts)
----------
pandas.core.series.Series
date = ts.index[5]
date
----------
Timestamp('2011-12-23 00:00:00')
ts[date]
----------
57.61857223510742
ts[5]
----------
57.61857223510742

我们还可以选择多列。

df[['Open', 'Close']].head()
----------Open      Close
Date
2006-10-02  10.728572  10.694285
2006-10-03  10.635715  10.582857
2006-10-04  10.585714  10.768572
2006-10-05  10.647142  10.690000
2006-10-06  10.631429  10.602858

还可以动态添加新列

df['diff'] = df.Open - df.Close
df.head()
----------High        Low       Open  ...     Volume  Adj Close      diff
Date                                         ...
2006-10-02  10.838572  10.614285  10.728572  ...  178159800   9.283074  0.034286
2006-10-03  10.707143  10.455714  10.635715  ...  197677200   9.186352  0.052857
2006-10-04  10.780000  10.451428  10.585714  ...  207270700   9.347562 -0.182858
2006-10-05  10.880000  10.590000  10.647142  ...  170970800   9.279355 -0.042857
2006-10-06  10.720000  10.544286  10.631429  ...  116739700   9.203714  0.028571
[5 rows x 7 columns]

也能动态删除

del df['diff']
df.head()
----------High        Low       Open      Close     Volume  Adj Close
Date
2006-10-02  10.838572  10.614285  10.728572  10.694285  178159800   9.283074
2006-10-03  10.707143  10.455714  10.635715  10.582857  197677200   9.186352
2006-10-04  10.780000  10.451428  10.585714  10.768572  207270700   9.347562
2006-10-05  10.880000  10.590000  10.647142  10.690000  170970800   9.279355
2006-10-06  10.720000  10.544286  10.631429  10.602858  116739700   9.203714

常见的财务计算

  • Moving Average 动态均线
  • Returns 收益
close_px = df['Adj Close']mavg = close_px.rolling(40).mean()
mavg[-10:]
----------
Date
2011-12-16    48.202029
2011-12-19    48.168981
2011-12-20    48.138538
2011-12-21    48.134446
2011-12-22    48.128090
2011-12-23    48.123874
2011-12-27    48.128772
2011-12-28    48.122138

Returns 定义为:

rt=pt−pt−1pt−1=ptpt−1−1r_t = \frac{p_t - p_{t-1}}{p_{t-1}} = \frac{p_t}{p_{t-1}} - 1rt=pt1ptpt1=pt1pt1

rets = close_px / close_px.shift(1) - 1
rets.head()
----------
Date
2006-10-02         NaN
2006-10-03   -0.010419
2006-10-04    0.017549
2006-10-05   -0.007297
2006-10-06   -0.008152
Name: Adj Close, dtype: float64

或者用 .pct_change() ,得到的结果也是一样的

close_px.pct_change().head()
----------
Date
2006-10-02         NaN
2006-10-03   -0.010419
2006-10-04    0.017549
2006-10-05   -0.007297
2006-10-06   -0.008152
Name: Adj Close, dtype: float64

绘图基础

Series 和 DataFrames 有一个关联的 .plot() 命令 ( 在幕后使用Matplotlib )

import matplotlib.pyplot as plt
close_px.plot(label='AAPL')
mavg.plot(label='mavg')
plt.legend()
----------
<matplotlib.legend.Legend at 0x182f3a8cac8>

plt.show()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Q1KkfEk-1586415057997)(D:\workdata\2020\机器学习与深度学习\image\image-20200402162523592.png)]

可选:如果有时间的话…

import pandas as pd
import pandas_datareader as pdd
import datetimedf = pdd.data.get_data_yahoo(['AAPL', 'GE', 'GOOG', 'IBM', 'KO', 'MSFT', 'PEP'],start=datetime.datetime(2010, 1, 1),end=datetime.datetime(2013, 1, 1))['Adj Close']
df.head()
----------
Symbols          AAPL         GE        GOOG  ...         KO       MSFT        PEP
Date                                          ...
2009-12-31  26.131752  10.526512  308.832428  ...  19.278732  23.925440  44.622261
2010-01-04  26.538483  10.749147  312.204773  ...  19.292267  24.294369  44.945187
2010-01-05  26.584366  10.804806  310.829926  ...  19.058893  24.302216  45.488274
2010-01-06  26.161509  10.749147  302.994293  ...  19.052124  24.153070  45.033253
2010-01-07  26.113146  11.305734  295.940735  ...  19.004770  23.901886  44.747028
[5 rows x 7 columns]
import matplotlib.pyplot as pltrets = df.pct_change()plt.scatter(rets.PEP, rets.KO)
plt.xlabel('Returns PEP')
plt.ylabel('Returns KO')
----------
Text(0, 0.5, 'Returns KO')

plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u8DgxK7P-1586415057998)(D:\workdata\2020\机器学习与深度学习\image\image-20200402173026615.png)]

pandas的矩阵实际上要好一些,但我这里给出的是一个数组,如果要展示的话,还是用plt.show() 就行了

from pandas.plotting import scatter_matrix
scatter_matrix(rets, diagonal='kde', figsize=(10, 10))
----------
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x000001E6FFEE55C0>,<matplotlib.axes._subplots.AxesSubplot object at 0x000001E6FFF3C7F0>,...<matplotlib.axes._subplots.AxesSubplot object at 0x000001E6816D85F8>,<matplotlib.axes._subplots.AxesSubplot object at 0x000001E681701B70>]],dtype=object)

plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TvkjCnds-1586415057999)(D:\workdata\2020\机器学习与深度学习\image\image-20200402174915997.png)]

corr = rets.corr()
corr
----------
Symbols      AAPL        GE      GOOG       IBM        KO      MSFT       PEP
Symbols
AAPL     1.000000  0.457677  0.533692  0.502091  0.389567  0.473377  0.308979
GE       0.457677  1.000000  0.463039  0.609821  0.594637  0.600791  0.534035
GOOG     0.533692  0.463039  1.000000  0.471161  0.401712  0.473264  0.330564
IBM      0.502091  0.609821  0.471161  1.000000  0.600568  0.646600  0.490903
KO       0.389567  0.594637  0.401712  0.600568  1.000000  0.530160  0.635659
MSFT     0.473377  0.600791  0.473264  0.646600  0.530160  1.000000  0.477452
PEP      0.308979  0.534035  0.330564  0.490903  0.635659  0.477452  1.000000
plt.imshow(corr, cmap='hot', interpolation='none')
plt.colorbar()
plt.xticks(range(len(corr)), corr.columns)
plt.yticks(range(len(corr)), corr.columns);
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K3AlvvFS-1586415058000)(D:\workdata\2020\机器学习与深度学习\image\image-20200402175002817.png)]

我们经常感兴趣的一件事是预期回报与我们承担的风险之间的关系。这两者之间往往存在一种取舍。这里用 plt.annotate 在散布图上做标记。

plt.scatter(rets.mean(), rets.std())
plt.xlabel('Expected returns')
plt.ylabel('Risk')
for label, x, y in zip(rets.columns, rets.mean(), rets.std()):plt.annotate(label,xy=(x, y), xytext=(20, -20),textcoords='offset points', ha='right', va='bottom',bbox=dict(boxstyle='round,pad=0.5', fc='yellow', alpha=0.5),arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=0'))
plt.show()
----------

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TLxaHj7t-1586415058000)(D:\workdata\2020\机器学习与深度学习\image\image-20200402175925739.png)]

数据对齐和处理丢失的值

  • Join, merge, concatenate
  • 填充 NaNs

让我们从雅虎财经获取更多的证券,并建立一个调整后的收盘价的 DataFrame。

series_list = []
securities = ['AAPL', 'GOOG', 'IBM', 'MSFT']
for security in securities:s = pd.io.data.get_data_yahoo(security, start=datetime.datetime(2011, 10, 1), end=datetime.datetime(2013, 1, 1))['Adj Close']s.name = security # Rename series to match security nameseries_list.append(s)

pd.concat 可以把多个 Series 连接到一个 DataFrame 中。

df = pd.concat(series_list, axis=1)
df.head()
----------AAPL        GOOG         IBM       MSFT
Date
2011-09-30  47.285904  256.558350  130.822800  20.321293
2011-10-03  46.452591  246.834808  129.640747  20.027370
2011-10-04  46.192177  250.012894  130.725555  20.688694
2011-10-05  46.905209  251.407669  132.304108  21.137737
2011-10-06  46.796078  256.393982  135.924973  21.505136
import numpy as np
df.ix[0, 'AAPL'] = np.nan
df.ix[1, ['GOOG', 'IBM']] = np.nan
df.ix[[1, 2, 3], 'MSFT'] = np.nan
df.head()
----------AAPL        GOOG         IBM       MSFT
Date
2011-09-30        NaN  256.558350  130.822800  20.321293
2011-10-03  46.452591         NaN         NaN        NaN
2011-10-04  46.192177  250.012894  130.725555        NaN
2011-10-05  46.905209  251.407669  132.304108        NaN
2011-10-06  46.796078  256.393982  135.924973  21.505136

panda对缺少值的计算提供了强大的支持。

(df.AAPL + df.GOOG).head()
----------
Date
2011-09-30           NaN
2011-10-03           NaN
2011-10-04    296.205070
2011-10-05    298.312878
2011-10-06    303.190060
dtype: float64

一种常用的时间序列缺失值的估算方法是正向填充法。

df.ffill().head()
----------AAPL        GOOG         IBM       MSFT
Date
2011-09-30        NaN  256.558350  130.822800  20.321293
2011-10-03  46.452591  256.558350  130.822800  20.321293
2011-10-04  46.192177  250.012894  130.725555  20.321293
2011-10-05  46.905209  251.407669  132.304108  20.321293
2011-10-06  46.796078  256.393982  135.924973  21.505136

Python财务分析-Pandas基础相关推荐

  1. 【Python】Pandas基础:结构化数据处理

    python:Pandas基础:结构化数据处理 目录: 文章目录 @[toc] 一 pandas及其重要性 二 pandas的数据结构介绍 1 Series 2 DataFrame 3 索引对象 三 ...

  2. Python数据分析——Pandas基础:dt.datetime与pivot_table()数据透视表

    系列文章目录 Chapter 1:创建与探索DF.排序.子集化:Python数据分析--Pandas基础入门+代码(一) Chapter 2:聚合函数,groupby,统计分析:Python数据分析- ...

  3. Python财务分析-Pandas复制Google Trends

    复制利用谷歌趋势量化金融市场的交易行为 这是发表于<自然>的一篇论文: Quantifying Trading Behavior in Financial Markets Using Go ...

  4. 利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍 一、pandas 是什么 pandas 是基于 NumPy 的一个 Python 数据分析包,主

    利用Python进行数据分析(7) pandas基础: Series和DataFrame的简单介绍 一.pandas 是什么 pandas 是基于 NumPy 的一个 Python 数据分析包,主要目 ...

  5. Python科学计算之Pandas基础学习

    Python科学计算之Pandas基础学习 导入Pandas 我们首先要导入我们的演出明星--Pandas. 这是导入Pandas的标准方式.显然,我们不希望每时每刻都在程序中写'pandas',但是 ...

  6. PDF下载!《Python十大基础专题》《247个Python综合案例》《Pandas 20页学习笔记》...

    Python 技术栈 完整学习路线 如今书籍汗牛充栋,如何从零.循序渐进地掌握Python技术栈,成为很多读者朋友们关心的问题.最近,我特意按照Python技术栈的学习逻辑,把它划分为六个阶段,并且给 ...

  7. Python数据分析实战基础 | 初识Pandas

    这是Python数据分析实战基础的第一篇内容,主要是和Pandas来个简单的邂逅.已经熟练掌握Pandas的同学,可以加快手速滑动浏览或者直接略过本文. 01  重要的前言 这段时间和一些做数据分析的 ...

  8. pandas 把某一列中字符串变数值_Python学习教程:Python数据分析实战基础 | 初识Pandas...

    这段时间和一些做数据分析的同学闲聊,我发现数据分析技能入门阶段存在一个普遍性的问题,很多凭着兴趣入坑的同学,都能够很快熟悉Python基础语法,好像自己什么都会了一点,然而实际操作起来既不知从何操起, ...

  9. 【Python|Kaggle】机器学习系列之Pandas基础练习题(五)

    前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出-   自我介绍 ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计 ...

最新文章

  1. mysql 浏览器插件_Chrome浏览器BlazeMeter插件安装图解
  2. python基础学习中要懂的知识点:反射机制
  3. 我爱工程化 之 gulp 使用(一)
  4. 计算机自适应测试的应用 托福,计算机自适应测试系统的研究和应用.pdf
  5. vtune mysql user_intel vtune 介绍、安装和使用
  6. DataTemplate和ControlTemplate的关系
  7. vb.net word 自定义工具栏_Word双面快速简捷打印?
  8. 把你的火狐浏览器改成Chrome样式
  9. GridView(网格视图)+MotionEvent(触控事件)实现可以拖动排序的网格图
  10. SQL Server 版本变更检查
  11. FileUpload类别FileUpload1.FileName和FileUpload1.PostedFile.FileName差异
  12. 使用C#创建快捷方式
  13. java类型转换异常处理_类型转换中的错误处理
  14. 卸载奇安信天擎,流氓软件
  15. js eq()选择器的使用
  16. 世界更清晰,搜狐新闻客户端集成HUAWEI HiAI 亮相荣耀Play发布会!
  17. 国产 Linux 操作系统面临的困境
  18. 经纬坐标(BLH)数据创建.kml文件小工具设计 Java版
  19. C语言 深度剖析数据在内存中的存储(2)
  20. 【转】苹果警告中国开发者:不要绕过APP反追踪功能

热门文章

  1. [编程题]: 过河问题
  2. [前端bug词典]Already included file name ‘文件路径‘
  3. 单音信号对载波信号进行双边带幅度调制
  4. 第二单元:文字与列表
  5. 有26个字母a~z,找出所有字母组合,a、b、c、ab、abc、a~z 都是一个组合(顺序无关)
  6. 什么是STN黄绿模、什么是蓝模、什么是灰模
  7. 分析悬链线中心的横坐标位置
  8. 中国移动利润大幅上涨后,降低5G套餐,却悄悄提高固网宽带价格
  9. L1-012. 计算指数
  10. 星空联盟全面采用AWS以开创航空旅行新时代