数据分析处理绘图
1处理CSV文件格式数据
2处理GeoJSON 数据
处理CSV文件格式数据
CSV文件格式数据(类似于excel简单表格数据)
导入数据
创建对列表数据进行修改代码
from pathlib import Path
import csv
path = Path('weather_data/sitka_weather_07-2021_simple.csv')
lines = path.read_text().splitlines()
提取列表内容进行分行操作(将表头提取出来)
reader = csv.reader(lines) # csv.reader数据每行可进入for循环
header_row = next(reader) # 只返回列表第一行,并根据每行内容进行自动分部分读取
print(header_row)
提取单行单个元素(表头中的某种属性)
for index, column_header in enumerate(header_row):
# index对应索引,column_header对应每行分部分中的第一部分,enumerate可以将列表中提前出来的一行数据进一步处理
print(index, column_header)
提取最高温度
# 提取最⾼温度
highs = []
for row in reader: # 默认从第二行开始读取数据,第一行在读取表头时候已经读取过了
high = int(row[4])
highs.append(high)
print(highs)
根据最高温度绘制图形
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()
导入读取时间模块
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() # 横坐标数据进行倾斜
绘制全年数据
更改数据文件及标题
path = Path('weather_data/sitka_weather_2021_simple.csv')
ax.set_title("Daily High Temperatures, 2021", fontsize=24)
同一表格绘制俩条折线图
# 提取⽇期、最⾼温度和最低温度
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)
设置检错代码
以防列表数据缺陷或者有误
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)
绘制双线中间部分
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) # 绘制双线中间部分
处理GeoJSON 数据
GeoJSON 数据(字典列表多层嵌套复杂数据)
数据导入
创建读取数据文件
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)
查看某个数据汇总
# 查看数据集中的所有地震
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元素
提取多个信息
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])
根据提取数据绘图
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()
对提取出来的单个数据进行编组处理
import pandas as pd # pandas可以对数据进行分析处理
data = pd.DataFrame(
data=zip(lons, lats, titles, mags), columns=['经度', '纬度', '位置',
'震级']
)
print(data.head()) # data.head返回数据前五行便于了解数据
# 绘制散点图
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()
根据震级大小修改点尺寸
size='震级',size_max=10
捕捉异常
# 将数据作为字符串读取并转换为 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='震级',
设置单个散点数据说明
hover_name='位置'