Python/下载数据

  • 处理CSV文件
    • 分析CSV头文件
    • 提取并读取数据
    • 绘制气温图表
    • 使用datetime模块获取日期
    • 添加最低温度折线
    • 给图表区域着色
  • 处理JSON文件
    • 下载json文件数据
    • 提取相关数据
    • 绘制收盘价折线图
    • 数据统计分析
      • 封装函数---==groupby()==
      • 数据筛选

本篇将访问并可视化以两种常见格式存储的数据:CSV和JSON。将使用Python模块csv来处理CSV格式存储的天气数据,找出两个不同地区在一段时间内的最高温度和最低温度。然后,我们将使用matplotlib根据下载的数据创建一个图表,展示两个不同地区的气温变化:阿拉斯加锡特卡和加州死亡谷;将使用模块json来访问以JSON格式存储的交易收盘价数据,并使用Pygal绘制图形以探索价格变化的周期性

处理CSV文件

从书籍配套资源下载源代码,获得数据文件sitka_weather_07-2014.csv到project文件夹下

分析CSV头文件

打开srv文件,获取srv首行头文件数据,且对应其其索引打印出来

# highs_lows.py
import csvfrom sqlalchemy import columnfile_name = 'sitka_weather_07-2014.csv'
with open(file_name) as f:reader = csv.reader(f)header_row = next(reader)# 调用next()一次,因此得到的是文件的第一行数据for index, column_header in enumerate(header_row):        # 使用enumerate()获得每个元素的索引及其值print(index, column_header)

提取并读取数据

获取Max temperature列的数据

# highs_lows.py--snip--with open(filename) as f:highs=[]--snip--for row in reader:highs.append(int(row[1]))# 从首行文件头可知处于第二列的 Max TemperatureF 及为高温度print(highs)

绘制气温图表

将所获取的highs利用matplotlib的pyplot模块,用plot()绘制出折线图

# highs_lows.py
--snip--
fig = plt.figure(dpi=128, figsize=(10, 6))
plt.plot(highs, c='red')plt.title('Daily high temperatures, July 2014', fontsize=24)
plt.xlabel('Daily', fontsize=16)
plt.ylabel('Temperature (F)', fontsize=16)
plt.tick_params(axis='both', which='major', labelsize=16)plt.show()

使用datetime模块获取日期

使用datetime模块中的datetime类,调用strptime()方法接收各种实参,并因此决定解读日期

>>>from datetime import datetime
>>>first_data = datetime.strptime('2014-7-1', '%Y-%m-%d')
>>>Xprint(first_date)
2014-07-01 00:00:00

# highs_lows.py
import csv
from matplotlib import pyplot as plt
from datetime import datetimefile_name = 'sitka_weather_07-2014.csv'
with open(file_name) as f:reader = csv.reader(f)header_row = next(reader)head_file = {}dates, highs = [], []# 调用next()一次,因此得到的是文件的第一行数据for index, column_header in enumerate(header_row):# 使用enumerate()获得每个元素的索引及其值head_file[index] = [column_header]#print(index, column_header)for row in reader:# 提取每行数据highs.append(int(row[1]))# 从首行文件头可知处于第二列的 Max TemperatureF 及为高温度current_date = datetime.strptime(row[0], "%Y-%m-%d")dates.append(current_date)# print(highs)fig = plt.figure(dpi=128, figsize=(10, 6))
plt.plot(dates, highs, c='red')plt.title('Daily high temperatures, July 2014', fontsize=24)
plt.xlabel('Daily', fontsize=16)
fig.autofmt_xdate()
# 绘制倾斜的日期
plt.ylabel('Temperature (F)', fontsize=16)
plt.tick_params(axis='both', which='major', labelsize=16)plt.show()

添加最低温度折线

新增lows列表变量,记录2014的最低温度值,用于后续plot()方法中绘制出来

# highs_lows.py
import csv
from matplotlib import pyplot as plt
from datetime import datetimefile_name = 'sitka_weather_2014.csv'
with open(file_name) as f:reader = csv.reader(f)header_row = next(reader)head_file = {}dates, highs, lows = [], [], []# 调用next()一次,因此得到的是文件的第一行数据for index, column_header in enumerate(header_row):# 使用enumerate()获得每个元素的索引及其值head_file[index] = [column_header]#print(index, column_header)for row in reader:# 提取每行数据highs.append(int(row[1]))lows.append(int(row[3]))# 从首行文件头可知处于第二列的 Max TemperatureF 及为高温度current_date = datetime.strptime(row[0], "%Y-%m-%d")dates.append(current_date)# print(highs)fig = plt.figure(dpi=128, figsize=(10, 6))
plt.plot(dates, highs, c='red')
plt.plot(dates, lows, c='blue')plt.title('Daily high temperatures, 2014', fontsize=20)
plt.xlabel('Daily', fontsize=16)
fig.autofmt_xdate()
# 绘制倾斜的日期
plt.ylabel('Temperature (F)', fontsize=16)
plt.tick_params(axis='both', which='major', labelsize=10)plt.show()

给图表区域着色

之前的案例已经显示了最高、低温度的折线,使用fill_between()方法,接收一个x值和两个y值,并填充两个y值系列之间的空间

# highs_lows.py
fig=plt.figure(dpi=128, figsize=(10, 6))
plt.plot(dates, highs, c='red', alpha=0.5)
plt.plot(dates, lows, c='blue', alpha=0.5)
plt.fill_between(dates, highs, lows, facecolor='blue', alpha=0.1)
# alpha参数指定颜色的透明度,0为完全透明,1为完全不透明

处理JSON文件

本节将使用到JSON格式的交易收盘价数据,并使用json模块处理它们,对收盘价数据进行可视化,以探索价格变化的周期性
需下载btc_close_2017.json文件
这个文件里是python列表,每个元素是包含5个键值对的字典dic:日期,月份,周数,周几,收盘价

下载json文件数据

从Github上下载btc_close_2017.json数据

# btc_close_2017.py
from urllib.request import urlopen
import json
json_url = <.json文件url路径> # 'https://raw.githubsercontent.com/muxuezi/btc/master/btc_close_2017.json'
response=urlopen(json_url)
# python向Github服务器发送请求btc_close_2017.json
req=response.read()
# 读取数据
with open(<.json文件物理地址>, 'wb') as f:# 将数据写入文件f.write(req)file_urllib=json.loads(req)
# 加载json格式,将文件内容转换成python能处理的格式,与直接下载的文件内容一致
print(file_urllib)

另外可以使用requests模块get()方法获取数据

import requests
json_url = <.json文件url地址>
req=requests.get(json.url)with open (<.json文件物理地址>, 'w') as f:f.write(req.text)# req的text属性可直接读取文件数据,返回字符串
file_requests=req.json()
# 将json文件的数据转换成python列表file_requests,与此前file_urllib内容相同

提取相关数据

import json
filename='btc_close_2017.json'
with open(filename) as f:btc_data=json.load(f)for btc_dict in btc_date:date = btc_dict['date']month = int(btc_dict['month'])week = int(btc_dict['week'])weekday = btc_dict['weekday']close = float(btc_dict['close'])print(' the date is {}, the month is {}, the week is {}, the weekday is {}, the close price is {} RMB'.format(date, month, week, weekday, close))

即可打印列表中每个字典的键值对

绘制收盘价折线图

本例使用pygal来实现收盘价的折线图

# btc_close_2017.py
import json
import pygal
filename='btc_close_2017.json'
with open(filename) as f:btc_data=json.load(f)dates=[]
months=[]
weeks=[]
weekdays=[]
close=[]
for btc_dict in btc_date:dates.append(btc_dict['date'])months.append(int(btc_dict['month']))weeks.append(int(btc_dict['week']))weekdays.append(btc_dict['weekday'])close.append(float(btc_dict['close']))
print(len(dates))
line_chart = pygal.Line(x_label_rotation=20, show_minor_x_labels=False)
# x_laber_rotation=20,令x坐标标签顺时针转20,show_minor_x_laberls=False,令不用显示所有x轴标签
line_chart._title = "close price"
line_chart.x_labels = dates
N = 20
line_chart._x_labels_major = dates[::N]
# 设置_xlabels_major属性,令x轴坐标隔20个显示一次
line_chart.add('close price', close)
line_chart.render_to_file('images/close price picture.svg')

研究时间序列的趋势,周期性,噪声;一般对非线性的趋势消除,进行logtransformation对数变换

import math
-snip-
print(len(dates))
line_chart = pygal.Line(x_label_rotation=20, show_minor_x_labels=False)
# x_laber_rotation=20,令x坐标标签顺时针转20,show_minor_x_laberls=False,令不用显示所有x轴标签
line_chart._title = "close price logtransfomation"
line_chart.x_labels = dates
N = 20
line_chart.x_labels_major = dates[::N]
# 设置_xlabels_major属性,令x轴坐标隔20个显示一次
close_log=[math.log10(n) for n in close]
line_chart.add('close price logtransformation', close_log)
line_chart.render_to_file('images/close price logtransformation picture.svg')

数据统计分析

利用json文件中的数据,绘制日均值,以及每周各天的日均值。可以将之前绘图代码封装成函数draw_line(x_data, y_data, title, y_legend),以便重复调用

封装函数—groupby()

python中的groupby函数主要的作用是进行数据的分组以及分组后的组内运算,for key group in groupby(列表, lambda c: c.function()),实际上挑选规则是通过函数完成的,只要作用于函数的两个元素key相同,就能被分到同一组,返回key对应的每一组group;
y_list = [v for _, v in y]这一行代码还不理解,显然-就是key, [ ]就是一个生成器,用于获取对应key的group中的元素

from itertools import groupby
# groupby函数的主要作用是进行数据分组以及分组后的组内运算
def draw_line(x_data, y_data, title, y_legend):xy_map = []for x, y in groupby(sorted(zip(x_data, y_data)), key=lambda _: _[0]):y_list = [v for _, v in y]xy_map.append([x, sum(y_list)/len(y_list)])x_unique, y_mean = [*zip(*xy_map)]line_chart = pygal.Line()line_chart.title = titleline_chart.x_labels = x_uniqueline_chart.add(y_legend, y_mean)line_chart.render_to_file('images/'+title+'.svg')return line_chart

数据筛选

查看月日均值

# btc_close_2017.py
-snip-
idx_month = dates.index('2017-12-01')
# index()方法用于从列表中找出某个值第一个匹配项的索引值
line_chart_month = draw_line(months[:idx_month], close[:idx_month],'close monthly average price', 'monthly average price')
line_chart_month

查看周日均值

# btc_close_2017.py
-snip-
idx_month = dates.index('2017-12-01')
# index()方法用于从列表中找出某个值第一个匹配项的索引值
line_chart_month = draw_line(weeks[1:idx_month], close[1:idx_month],'close weekly average price', 'weekly average price')
line_chart_month

Python/下载数据相关推荐

  1. 16 使用Python下载数据

    在本章中,你将从网上下载数据,并对这些数据进行可视化.网上的数据多得难以置信,且大多未经过仔细检查.如果能够对这些数据进行分析,你就能发现别人没有发现的规律和关联. 我们将访问并可视化以两种常见格式存 ...

  2. 使用python各种方法下载数据

    python下载数据的各种方法 python下载数据的各种方法 我一开始写的下载代码 带有断点续传的request库方法(不一定能行) wget方法 python下载数据的各种方法 上一篇我写了怎么去 ...

  3. python下载文件到本地-Python下载网络文本数据到本地内存的四种实现方法示例

    本文实例讲述了Python下载网络文本数据到本地内存的四种实现方法.分享给大家供大家参考,具体如下: import urllib.request import requests from io imp ...

  4. python利用tushare下载数据并计算当日收益率

    python利用tushare下载数据并计算当日收益率 计算股票收益率的程序主要有以下几部分构成: 1.获取股票接口数据函数:pro_daily_stock() 2.计算收益率函数:cal_stock ...

  5. 利用python下载fnl数据方法

    (1)下载python,网上下载方法很多,此处不再赘述,记得下载和电脑系统版本匹配的就好: (2)去ncar官网注册 https://rda.ucar.edu/ 先进行注册,需要注意的是注册最好用教育 ...

  6. NCEP再分析数据(FNL)Python下载

    NCEP再分析数据(FNL)Python下载 楼主第一次接触WRF模型,最近在摸索该如何使用WRF和相关数据如何下载,简单记录一下. 数据网址: https://rda.ucar.edu/datase ...

  7. python批量下载数据|工具箱

    现在很多数据提供HTTPServer下载服务,在这里介绍一种普遍适用的利用URL批量下载数据的python方法 前言 很多数据支持FTP下载,也提供OPeNDAP方式下载.两者的差异是显而易见的: ( ...

  8. 利用python下载哨兵1号轨道数据

    python下载哨兵一号轨道数据 最近因为项目需要,突然想起来自己曾写过这么一份脚本,就顺便修改了一下.首先明确一下我们的目标,根据已经下载的哨兵1号影像文件,下载哨兵1号对应的精密轨道数据.哨兵轨道 ...

  9. python下载所有股票日交易数据

    python下载所有股票日交易数据 一.下载 一.下载 #使用的变量a.b.c.d.e def DownStockData(StockCode):#引用 requests文件import reques ...

  10. 如何用python批量下载数据_Python批量下载地理空间数据云数据!Python无所不能!...

    模拟登录 这里要用到两个包:requests和json.requests使用前得先安装:pip install requests. In [3]: 进群:548377875 即可获取数十套PDF哦! ...

最新文章

  1. 在window平台运行Dubbo的一个小demo
  2. 机器学习(十九)——PageRank算法, KNN, loss function详解
  3. flink sql 部署_在FlinkSQL中使用SQL client时,如何使用 query配置?
  4. 雨果vs.杰基尔:比较领先的静态网站生成器
  5. C++设置不定参数方法 简单示例
  6. 想转行数据分析,看完这篇再做决定
  7. 利用Python进行数据分析--数据规整化:清理、转换、合并、重塑
  8. BGP联邦原理及配置实例
  9. python异步io协程读文件_Python协程中的并行异步IO
  10. Ubuntu上安装gcc
  11. 射频电路设计——传输线理论
  12. 考核指标如CTR/CVR/ROI/ARPU等
  13. 升级计算机的图形卡和驱动程序,Win10更新显卡驱动程序后无法开机怎么办?解决方案...
  14. [科普] 狭义相对论
  15. 【Python表白小程序】七夕表白神器(赶紧收藏起来)
  16. python中扑克牌类设计_创建扑克牌类Python
  17. 李飞飞在谷歌开发者大会宣布谷歌AI中国中心正式成立
  18. oracle人民币大写转换
  19. 微信h5获取用户openid:基于vue3+springBoot
  20. 《红楼梦》人物关系有多复杂?一张图帮你理清楚!

热门文章

  1. 手把手教你写一个微信小程序(前端+Java后端)
  2. 物联网轻松上云实践 之 HaaS样板间
  3. Linux 拷贝文件
  4. python遍历json_python3如何遍历json数据
  5. 临近空间大气环境特性
  6. 转帖 美国 工程索引 收录中国科技论文的最新规定
  7. wav格式怎么转换成flac?
  8. 工业相机二次开发简约教程
  9. android 6.0 创建文件或文件夹失败
  10. Immervision推出由计算机视觉社区开发的首台具有智能视觉的仿人机器人JOYCE