MST

星途 面试题库

面试题:Python中Plotly复杂可视化与数据处理结合

假设有一个包含多个城市多年的气温、降水量等气象数据的大型CSV文件。使用Python的Pandas读取数据,然后用Plotly创建一个复杂的交互式可视化界面。其中包括:1. 一个时间序列图展示某个城市气温随年份的变化;2. 一个交互式地图,不同城市用不同颜色标记,点击城市标记弹出该城市的平均降水量等信息;3. 一个相关性分析图表,展示气温与降水量之间的关系,并能通过滑块调整分析的时间范围。请阐述实现思路并给出关键代码片段。
41.8万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

实现思路

  1. 数据读取:使用Pandas读取CSV文件,对数据进行必要的清洗和预处理,确保数据格式正确。
  2. 时间序列图:筛选出特定城市的数据,按照年份聚合气温数据,使用Plotly的graph_objects创建时间序列图。
  3. 交互式地图:计算每个城市的平均降水量,使用Plotly的express创建地图,通过设置hover_data来展示点击城市弹出的信息。
  4. 相关性分析图表:根据滑块调整的时间范围筛选数据,计算气温与降水量的相关性,使用Plotly创建散点图展示关系。

关键代码片段

import pandas as pd
import plotly.graph_objects as go
import plotly.express as px
import numpy as np

# 数据读取
data = pd.read_csv('气象数据.csv')

# 将日期列转换为datetime类型
data['日期'] = pd.to_datetime(data['日期'])

# 提取年份
data['年份'] = data['日期'].dt.year

# 时间序列图
city = '目标城市'
city_data = data[data['城市'] == city]
yearly_temperature = city_data.groupby('年份')['气温'].mean().reset_index()

fig1 = go.Figure(data=go.Scatter(x=yearly_temperature['年份'], y=yearly_temperature['气温'],
                                 mode='lines+markers'))
fig1.update_layout(title=f'{city}气温随年份变化',
                   xaxis_title='年份',
                   yaxis_title='平均气温')

# 交互式地图
city_precipitation = data.groupby('城市')['降水量'].mean().reset_index()

fig2 = px.scatter_mapbox(city_precipitation, lat=city_precipitation['纬度'], lon=city_precipitation['经度'],
                         color='降水量', hover_data=['城市', '降水量'])
fig2.update_layout(mapbox_style='open-street-map')

# 相关性分析图表
min_year = data['年份'].min()
max_year = data['年份'].max()

fig3 = go.Figure()
fig3.add_trace(go.Scatter(x=[], y=[], mode='markers'))

fig3.update_layout(
    xaxis_title='气温',
    yaxis_title='降水量',
    title='气温与降水量相关性分析',
    sliders=[
        {
            'active': 0,
            'currentvalue': {'prefix': '时间范围: '},
            'pad': {'t': 50},
            'len': 0.9,
            'x': 0.1,
            'y': 0,
            'steps': [
                {
                    'args': [[i], {'x': [data[(data['年份'] >= i) & (data['年份'] <= i + 5)]['气温']],
                                   'y': [data[(data['年份'] >= i) & (data['年份'] <= i + 5)]['降水量']}]],
                    'label': f'{i}-{i + 5}',
                    'method': 'update'
                } for i in range(min_year, max_year - 5 + 1, 5)
            ]
        }
    ]
)