数据分析处理绘图

1处理CSV文件格式数据
2处理GeoJSON 数据

处理CSV文件格式数据

CSV文件格式数据(类似于excel简单表格数据)

导入数据

Python从入门到实践project数据分析处理绘图_数据

Python从入门到实践project数据分析处理绘图_json_02

创建对列表数据进行修改代码

from pathlib import Path
import csv


path = Path('weather_data/sitka_weather_07-2021_simple.csv')
lines = path.read_text().splitlines()

Python从入门到实践project数据分析处理绘图_处理CSV文件格式数据_03

提取列表内容进行分行操作(将表头提取出来)

reader = csv.reader(lines)  # csv.reader数据每行可进入for循环
header_row = next(reader)  # 只返回列表第一行,并根据每行内容进行自动分部分读取
print(header_row)

Python从入门到实践project数据分析处理绘图_json_04

提取单行单个元素(表头中的某种属性)

for index, column_header in enumerate(header_row):
    # index对应索引,column_header对应每行分部分中的第一部分,enumerate可以将列表中提前出来的一行数据进一步处理
    print(index, column_header)

Python从入门到实践project数据分析处理绘图_数据分析处理绘图_05

提取最高温度

# 提取最⾼温度
highs = []
for row in reader:  # 默认从第二行开始读取数据,第一行在读取表头时候已经读取过了
    high = int(row[4])
    highs.append(high)
print(highs)

Python从入门到实践project数据分析处理绘图_数据_06

根据最高温度绘制图形

import matplotlib.pyplot as plt
# 根据最⾼温度绘图
plt.style.use('Solarize_Light2')
fig, ax = plt.subplots()
ax.plot(highs, color='red')
# 设置绘图的格式
ax.set_title("Daily High Temperatures, July 2021", fontsize=24)
ax.set_xlabel('', fontsize=16)
ax.set_ylabel("Temperature (F)", fontsize=16)
ax.tick_params(labelsize=16)
plt.show()

Python从入门到实践project数据分析处理绘图_处理CSV文件格式数据_07

导入读取时间模块

from datetime import datetime
# 提取⽇期和最⾼温度
dates, highs = [], []
for row in reader:  # 默认从第二行开始读取数据,第一行在读取表头时候已经读取过了
    current_date = datetime.strptime(row[2], '%Y-%m-%d')  # %Y指四位数年份,%m指俩位数月份
    high = int(row[4])
    dates.append(current_date)
    highs.append(high)
print(highs)

# 根据最⾼温度绘图
plt.style.use('Solarize_Light2')
fig, ax = plt.subplots()
ax.plot(current_date,highs, color='red')

横坐标数据过长可以倾斜

fig.autofmt_xdate()  # 横坐标数据进行倾斜

Python从入门到实践project数据分析处理绘图_数据分析处理绘图_08

绘制全年数据

更改数据文件及标题

path = Path('weather_data/sitka_weather_2021_simple.csv')
ax.set_title("Daily High Temperatures, 2021", fontsize=24)

Python从入门到实践project数据分析处理绘图_数据分析处理绘图_09

同一表格绘制俩条折线图

# 提取⽇期、最⾼温度和最低温度
dates, highs, lows = [], [], []
for row in reader:  # 默认从第二行开始读取数据,第一行在读取表头时候已经读取过了
    current_date = datetime.strptime(row[2], '%Y-%m-%d')  # %Y指四位数年份,%m指俩位数月份
    high = int(row[4])
    low = int(row[5])
    dates.append(current_date)
    highs.append(high)
    lows.append(low)
ax.set_title("Daily High and Low Temperatures, 2021", fontsize=24)

Python从入门到实践project数据分析处理绘图_处理CSV文件格式数据_10

设置检错代码

以防列表数据缺陷或者有误

try:
    high = int(row[4])
    low = int(row[5])
except ValueError:
    print(f"Missing data for {current_date}")
else:
    dates.append(current_date)
    highs.append(high)
    lows.append(low)

Python从入门到实践project数据分析处理绘图_数据_11

绘制双线中间部分

ax.plot(dates, highs, color='red', alpha=0.5)  # alpha改变颜色饱和度
ax.plot(dates, lows, color='blue', alpha=0.5)
ax.fill_between(dates, highs, lows, facecolor='blue', alpha=0.1)  # 绘制双线中间部分

Python从入门到实践project数据分析处理绘图_数据分析处理绘图_12

处理GeoJSON 数据

GeoJSON 数据(字典列表多层嵌套复杂数据)

数据导入

Python从入门到实践project数据分析处理绘图_处理GeoJSON 数据_13

创建读取数据文件

from pathlib import Path
import json

# 将数据作为字符串读取并转换为 Python 对象
path = Path('eq_data/eq_data_1_day_m1.geojson')
contents = path.read_text()
all_eq_data = json.loads(contents)  # 将字符串转换成Python可读取的结构(字典,列表...)

# 将数据⽂件转换为更易于阅读的版本
path = Path('eq_data/readable_eq_data.geojson')
readable_contents = json.dumps(all_eq_data, indent=4)  # 将转换后的结构再次转回字符串输出文件,indent缩进为4个空格
path.write_text(readable_contents)

Python从入门到实践project数据分析处理绘图_处理GeoJSON 数据_14

查看某个数据汇总

# 查看数据集中的所有地震
all_eq_dicts = all_eq_data['features']  # 提取单个属性元素 
print(len(all_eq_dicts))  # 查看提取属性数据元素长度

提取数据中的某一项

mags = []
for eq_dict in all_eq_dicts:
    mag = eq_dict['properties']['mag']  # 提取列表properties下的mag包含的数据
    mags.append(mag)
print(mags[:10])  # 打印列表前10元素

Python从入门到实践project数据分析处理绘图_处理GeoJSON 数据_15

提取多个信息

mags, titles, lons, lats = [], [], [], []
for eq_dict in all_eq_dicts:
    mag = eq_dict['properties']['mag']  # 提取列表properties下的mag包含的数据
    title = eq_dict['properties']['title']
    lon = eq_dict['geometry']['coordinates'][0]
    lat = eq_dict['geometry']['coordinates'][1]
    mags.append(mag)
    titles.append(title)
    lons.append(lon)
    lats.append(lat)
print(mags[:10])  # 打印列表前10元素
print(titles[:2])
print(lons[:5])
print(lats[:5])

Python从入门到实践project数据分析处理绘图_处理GeoJSON 数据_16

根据提取数据绘图

import plotly.express as px
# 绘制散点图
fig = px.scatter(
 x=lons,
 y=lats,
 labels={'x': '经度', 'y': '纬度'},
 range_x=[-200, 200],
 range_y=[-90, 90],
 width=800,
 height=800,
 title='全球地震散点图',
 )
fig.write_html('global_earthquakes.html')
fig.show()

Python从入门到实践project数据分析处理绘图_处理CSV文件格式数据_17

对提取出来的单个数据进行编组处理

import pandas as pd           # pandas可以对数据进行分析处理
data = pd.DataFrame(
 data=zip(lons, lats, titles, mags), columns=['经度', '纬度', '位置',
'震级']
)

Python从入门到实践project数据分析处理绘图_处理CSV文件格式数据_18

print(data.head())   # data.head返回数据前五行便于了解数据

Python从入门到实践project数据分析处理绘图_数据分析处理绘图_19

# 绘制散点图
fig = px.scatter(
 data, x='经度', y='纬度',
 labels={'x': '经度', 'y': '纬度'},
 range_x=[-200, 200],range_y=[-90, 90],
 width=800,height=800,
 title='全球地震散点图',
 )
fig.write_html('global_earthquakes.html')
fig.show()

Python从入门到实践project数据分析处理绘图_数据_20

根据震级大小修改点尺寸

size='震级',size_max=10

Python从入门到实践project数据分析处理绘图_数据_21

捕捉异常

# 将数据作为字符串读取并转换为 Python 对象
path = Path('eq_data/eq_data_30_day_m1.geojson')
try:
    contents = path.read_text()
except:
    contents = path.read_text(encoding='utf-8')

利⽤颜⾊渐变来呈现地震的震级

color='震级',

Python从入门到实践project数据分析处理绘图_处理GeoJSON 数据_22

Python从入门到实践project数据分析处理绘图_json_23


设置单个散点数据说明

hover_name='位置'

Python从入门到实践project数据分析处理绘图_json_24

Python从入门到实践project数据分析处理绘图_处理GeoJSON 数据_25