热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python/下载数据

Python下载数据处理CSV文件分析CSV头文件提取并读取数据绘制气温图表使用datetime模块获取日期添加最低温度折线给图表区域着色处理JSON文件下载json文件数据提取相


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

datetime中设置日期和时间格式的实参

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

另外可以使用requests模块get&#xff08;&#xff09;方法获取数据

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



提取相关数据

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

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


绘制收盘价折线图

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

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

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

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

数据统计分析

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


封装函数—groupby()

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

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



数据筛选

查看月日均值

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

查看周日均值

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

推荐阅读
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • Node.js学习笔记(一)package.json及cnpm
    本文介绍了Node.js中包的概念,以及如何使用包来统一管理具有相互依赖关系的模块。同时还介绍了NPM(Node Package Manager)的基本介绍和使用方法,以及如何通过NPM下载第三方模块。 ... [详细]
  • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 如何更改电脑系统的自动校时服务器地址?
    本文介绍了如何通过注册表编辑器更改电脑系统的自动校时服务器地址。通过修改注册表中的数值数据或新建字符串数值的方式,可以将默认的时钟同步服务器地址更改为自己所需要的域名或IP地址。详细步骤包括双击时间区域,点击internet时间,勾选自动校正域名设置定时等操作。 ... [详细]
  • python3 nmap函数简介及使用方法
    本文介绍了python3 nmap函数的简介及使用方法,python-nmap是一个使用nmap进行端口扫描的python库,它可以生成nmap扫描报告,并帮助系统管理员进行自动化扫描任务和生成报告。同时,它也支持nmap脚本输出。文章详细介绍了python-nmap的几个py文件的功能和用途,包括__init__.py、nmap.py和test.py。__init__.py主要导入基本信息,nmap.py用于调用nmap的功能进行扫描,test.py用于测试是否可以利用nmap的扫描功能。 ... [详细]
  • 微信官方授权及获取OpenId的方法,服务器通过SpringBoot实现
    主要步骤:前端获取到code(wx.login),传入服务器服务器通过参数AppID和AppSecret访问官方接口,获取到OpenId ... [详细]
author-avatar
菜鸟一号
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有