python数据分析实例(1)
1.获取数据:
想要获得道指30只成分股的最新股价
import requests
import re
import pandas as pd def retrieve_dji_list():
try:
r = requests.get('https://money.cnn.com/data/dow30/')
except ConnectionError as err:
print(err)
search_pattern = re.compile('class="wsod_symbol">(.*?)<\/a>.*?<span.*?">(.*?)<\/span>.*?\n.*?class="wsod_stream">(.*?)<\/span>')
dji_list_in_text = re.findall(search_pattern, r.text)
dji_list = []
for item in dji_list_in_text:
dji_list.append([item[0], item[1], float(item[2])])
return dji_list dji_list = retrieve_dji_list()
djidf = pd.DataFrame(dji_list)
print(djidf)
整理数据, 改变列名, index等
cols=['code','name','lasttrade']
djidf.columns=cols # 改变列名
djidf.index=range(1,len(djidf)+1)
最后结果为:

数据的选择
djidf.code # 获取code列+index
djidf['code'] # 获取code列 , 两者同功能
djidf.loc[1:5,] # 前5行
djidf.loc[:,['code','lasttrade']] #所有行
djidf.loc[1:5,['code','lasttrade']] #1-5行, loc表示标签index
djidf.loc[1,['code','lasttrade']] #1行
djidf.at[1,'lasttrade'] # 只有一个值的时候可以用at
djidf.iloc[2:4,[0,2]] # 表示物理文职, 并且4取不到, 就只有第三行第四行
djidf.iat[1,2] # 单个值
简单的数据筛选: 平均股价, 股价大于180的公司名
djidf.lasttrade.mean() # 121.132
djidf[djidf.lasttrade>=180].name

找到股价前三名的公司 , 降序排列
tempdf=djidf.sort_values(by='lasttrade',ascending=False)
tempdf[:3].name
如何根据index排序呢? 专门有函数sort_index()
df=pd.DataFrame(np.random.randn(3,3),index=['c','b','a'],columns=list('xyz'))
df.sort_index() # 根据index 进行排序
*获取AXP公司过去一年的股价数据获取
import requests
import re
import json
import pandas as pd
from datetime import date
def retrieve_quotes_historical(stock_code):
quotes = []
url = 'https://finance.yahoo.com/quote/%s/history?p=%s' % (stock_code, stock_code)
try:
r = requests.get(url)
except ConnectionError as err:
print(err)
m = re.findall('"HistoricalPriceStore":{"prices":(.*?),"isPending"', r.text)
if m:
quotes = json.loads(m[0]) # m = ['[{...},{...},...]']
quotes = quotes[::-1] # 原先数据为date最新的在最前面
return [item for item in quotes if not 'type' in item]
quotes = retrieve_quotes_historical('AXP')
list1=[]
for i in range(len(quotes)):
x=date.fromtimestamp(quotes[i]['date'])
y=date.strftime(x,'%Y-%m-%d')
list1.append(y)
quotesdf_ori=pd.DataFrame(quotes,index=list1)
quotesdf_m = quotesdf_ori.drop(['adjclose'], axis = 1) #删除adjclose列
quotesdf=quotesdf_m.drop(['date'],axis=1)
print(quotesdf)
上述需要对时间进行处理, 将时间转为'%Y-%m-%d'的格式, 并且将这个时间作为一个list 成为quotesdf的index.

数据的筛选
quotesdf[(quotesdf.index>='2017-03-01') & (quotesdf.index<='2017-03-31')]
quotesdf[(quotesdf.index>='2017-11-30') & (quotesdf.index<='2018-03-31')&
(quotesdf.close>=90)]
简单计算
(1) 统计AXP股价涨跌的天数 (close>open)
len(quotesdf.close>quotesdf.open)
(2) 相邻两天的涨跌
import numpy as np
status=np.sign(np.diff(quotesdf.close))
status # 250 的长度, 比quotesdf 少1
status[np.where(status==1)].size # np.where(status==1)是由下标构成的array
#
上述统计还可以直接用describe函数, 得到基本统计信息
import pandas as pd
import numpy as np
index_df = pd.DataFrame(np.random.rand(3,3), index=['a','b','c'], columns=['index_1','index_2','index_3'])
index_df.describe() # 超级强大

(3) 统计2018一月的交易日天数
t=quotesdf[(quotesdf.index>='2018-01-01') & (quotesdf.index<'2018-02-01')]
len(t) #21
进一步, 如何统计近一年每个月的交易日天数?
统计每个月的出现天数就行了, 如何提取月份信息? 要把时间的字符串转化为 时间格式,
import time
list2=[]
for i in range(len(quotesdf)):
temp=time.strptime(quotesdf.index[i],'%Y-%m-%d')
list2.append(temp.tm_mon) # 取月份
tempdf=quotesdf.copy()
tempdf['month']=list2 # 新增一列月份的数据
print(tempdf['month'].value_counts()) # 计算每个月的出现次数
注意:
strptime 将字符串格式化为time结构, time 中会包含年份, 月份等信息
strftime 将time 结构格式化一个字符串, 之前生成quotesdf中用到过
上述方法略微麻烦, 如何快速知道每个月的交易日天数? groupby
# 统计每一月的股票开盘天数
x=tempdf.groupby('month').count()
# 统计近一年每个月的成交量
tempdf.groupby('month').sum().volume
# 先每个月进行求和, 但是这些对其他列也进行了求和, 属于无效计算, 如何避免?
tempdf.groupby('month').volume.sum() # 交换顺序即可
引申: 一般groupby 与apply 在一起用. 具体不展开了
def f(df):
return df.age.count()
data_df.groupby('taste of mooncake').apply(f)
(二) 合并DataFrame: append, concat, join
# append
p=quotesdf[:2]
q=quotesdf['2018-01-01':'2018-01-05']
p.append(q) # concat
pieces=[tempdf[:5],tempdf[len(tempdf)-5:]]
pd.concat(pieces)
两个结构不同的DataFrame 如何合并?
piece1=quotesdf[0:3]
piece2=tempdf[:3]
pd.concat([piece1,piece2],ignore_index=True)
piece2有month 但是piece1中没有这个字段

join函数中的各种参数, 可以用来实现SQL的各种合并功能.
#join 两个dataframe要有共同的字段(列名)
#djidf: code/name
#AKdf: volume/code/month
# 合并之后的字段: code/name/volume/month
pd.merge(djidf.drop(['lasttrade'],axis=1),AKdf, on='code')
python数据分析实例(1)的更多相关文章
- Python数据分析实例操作
import pandas as pd #导入pandas import matplotlib.pyplot as plt #导入matplotlib from pylab import * mpl. ...
- 【读书笔记与思考】《python数据分析与挖掘实战》-张良均
[读书笔记与思考]<python数据分析与挖掘实战>-张良均 最近看一些机器学习相关书籍,主要是为了拓宽视野.在阅读这本书前最吸引我的地方是实战篇,我通读全书后给我印象最深的还是实战篇.基 ...
- Python数据分析实战
Python数据分析实战(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1nlHM1IW8MYg3z79TUwIsWg 提取码:ux8t 复制这段内容后打开百度网盘手 ...
- python数据分析之pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]
1 引言 Pandas是作为Python数据分析著名的工具包,提供了多种数据选取的方法,方便实用.本文主要介绍Pandas的几种数据选取的方法. Pandas中,数据主要保存为Dataframe和Se ...
- 创建Python数据分析的Docker镜像+Docker自定义镜像commit,Dockerfile方式解析+pull,push,rmi操作
实例解析Docker如何通过commit,Dockerfile两种方式自定义Dcoker镜像,对自定义镜像的pull,push,rmi等常用操作,通过实例创建一个Python数据分析开发环境的Dock ...
- Python数据分析【炼数成金15周完整课程】
点击了解更多Python课程>>> Python数据分析[炼数成金15周完整课程] 课程简介: Python是一种面向对象.直译式计算机程序设计语言.也是一种功能强大而完善的通用型语 ...
- 【python数据分析实战】电影票房数据分析(二)数据可视化
目录 图1 每年的月票房走势图 图2 年票房总值.上映影片总数及观影人次 图3 单片总票房及日均票房 图4 单片票房及上映月份关系图 在上一部分<[python数据分析实战]电影票房数据分析(一 ...
- python&数据分析&数据挖掘--参考资料推荐书籍
1.要用python做数据分析,先得对python语言熟悉,推荐一本入门书 :笨方法学python (learn python the hard way),这本书用非常有趣的讲述方式介绍了python ...
- 《Python金融大数据分析》高清PDF版|百度网盘免费下载|Python数据分析
<Python金融大数据分析>高清PDF版|百度网盘免费下载|Python数据分析 提取码:mfku 内容简介 唯一一本详细讲解使用Python分析处理金融大数据的专业图书:金融应用开发领 ...
随机推荐
- 如何搭建SVN的客户端和使用
1.下载安装TortoiseSVN 首先我们需要从官方网站下载TortoiseSVN客户端工具 可以选择32位和64位.也可以直接使用搜索引擎搜索TortoiseSVN 也会出现直接的下载方式.这里不 ...
- CodeForces 461B Appleman and T
题目链接:http://codeforces.com/contest/461/problem/B 题目大意: 给定一课树,树上的节点有黑的也有白的,有这样一种分割树的方案,分割后每个子图只含有一个黑色 ...
- golang介绍
一.golang介绍 golang是Google开发的一种 静态强类型.编译型,并发型,并具有垃圾回收功能的编程语言. 二.语言特性 1..自动垃圾回收 2.支持函数多返回值 3.并发强 三.gol ...
- IE 11 flex布局兼容性问题 ---- 不支持min-height 和flex:1
由于最近项目要嵌入其它平台,所以要做IE11 的兼容,那就用IE11打开网页看一看,一看吓一跳,页脚直接到了页眉的下面,并把主要内容覆盖了,也就是stick footer 布局失效了,我写了一个简易的 ...
- Bugku 分析 中国菜刀
解压之后得到了一个流量包,只有不到10KB,美滋滋 先抓重点,过滤出http,只有6条数据记录,3条post,3条response,3条post都是一样的 随便打开一条pos 是一个assert断言, ...
- JVM运行时内存组成分为一些线程私
JVM运行时内存组成分为一些线程私有的,其他的是线程共享的. 线程私有 程序计数器:当前线程所执行的字节码的行号指示器. Java虚拟机栈:java方法执行的内存模型,每个方法被执行时都会创建一个栈帧 ...
- maven在windows及linux环境下安装
maven下载 下载地址:https://maven.apache.org/download.cgi maven在windows下安装 解压到D盘 修改配置文件 进入conf,打开settings.x ...
- xadmin+django2.0删除用户报错,get_deleted_objects() takes 3 positional arguments but 5 were given
解决方法:将xadmin/plugins/actions.py中的 if django_version > (2, 0): #deletable_objects, model_count, pe ...
- 51nod1812树的双直径(换根树DP)
传送门:http://www.51nod.com/Challenge/Problem.html#!#problemId=1812 题解:头一次写换根树DP. 求两条不相交的直径乘积最大,所以可以这样考 ...
- C++回顾day03---<输入输出流>
一:C++输入输出包含下面3个方面 (一)标准I/O 对系统指定的标准设备的输入和输出.即从键盘输入数据,输出到显示器屏幕.这种输入输出称为标准的输入输出. (二)文件I/O 以外存磁盘文件为对象进行 ...