面试题答案
一键面试1. Pandas数据读取和处理性能优化
- 分块读取:
使用
chunksize
参数逐块读取数据。例如:
import pandas as pd
chunk_size = 100000
for chunk in pd.read_csv('large_user_behavior_data.csv', chunksize = chunk_size):
# 对每一块数据进行初步处理,如筛选需要的列
relevant_chunk = chunk[['user_id', 'page', '停留时间', '用户群体']]
# 这里可以进一步对每块数据进行计算,如统计每个页面的停留时间总和等
# 处理完后可以将结果追加到新的DataFrame或者文件中
这样可以避免一次性将大量数据读入内存,降低内存压力。
- 数据类型指定:
在读取数据时,根据数据的实际类型指定
dtype
。例如,如果user_id
是整数类型,可以指定为np.int32
(假设数据范围合适),如果停留时间
是浮点数,且不需要高精度,可以指定为np.float32
。
dtypes = {
'user_id': 'int32',
'page':'string',
'停留时间': 'float32',
'用户群体':'string'
}
data = pd.read_csv('large_user_behavior_data.csv', dtype = dtypes)
这样可以减少内存占用,提升处理速度。
- 筛选必要列: 只读取需要的列,减少数据量。例如:
data = pd.read_csv('large_user_behavior_data.csv', usecols = ['user_id', 'page', '停留时间', '用户群体'])
- 减少中间数据存储: 在数据处理过程中,尽量避免创建过多不必要的中间DataFrame。例如,在进行多步数据清洗和计算时,链式调用方法:
data = pd.read_csv('large_user_behavior_data.csv')
result = data[['user_id', 'page', '停留时间', '用户群体']].query('停留时间 > 0').groupby(['user_id', '用户群体']).agg({'停留时间':'sum'}).reset_index()
2. Bokeh高效渲染大规模数据可视化图表并保持交互性
- 数据抽样:
在不影响分析结论的前提下,对数据进行抽样。例如,可以使用
DataFrame.sample
方法抽取一定比例的数据进行可视化。
sampled_data = data.sample(frac = 0.1) # 抽取10%的数据
- 使用Bokeh的聚合功能: Bokeh支持对数据进行聚合展示。例如,在展示不同用户群体的停留时间分布时,可以先在Pandas中进行聚合计算,再传递给Bokeh。
grouped_data = data.groupby('用户群体').agg({'停留时间': ['mean','median','std']}).reset_index()
grouped_data.columns = ['用户群体','平均停留时间', '中位数停留时间', '标准差']
然后使用Bokeh的ColumnDataSource
和相应的绘图函数(如figure
)来绘制图表。
from bokeh.plotting import figure, show, ColumnDataSource
source = ColumnDataSource(grouped_data)
p = figure(x_range = grouped_data['用户群体'], title = '不同用户群体停留时间统计',
toolbar_location = None, tools = '')
p.vbar(x = '用户群体', top = '平均停留时间', width = 0.9, source = source)
show(p)
- 利用Bokeh的分层绘制: 对于不同类型的可视化元素,如散点图和直方图同时展示时,可以分层绘制。先绘制基础层(如直方图),再在其上绘制交互层(如散点图),这样可以减少渲染压力。
- 使用Bokeh服务器: Bokeh服务器可以动态加载和更新数据,实现实时交互。可以将数据处理逻辑放在服务器端,根据用户的交互(如缩放、选择等)动态处理和更新数据,然后重新渲染图表。例如:
from bokeh.application import Application
from bokeh.application.handlers.function import FunctionHandler
from bokeh.plotting import figure, show, ColumnDataSource
from bokeh.models import Button
from bokeh.layouts import column
def modify_doc(doc):
data = pd.read_csv('large_user_behavior_data.csv')
source = ColumnDataSource(data)
p = figure(title = '用户停留时间分布', tools = 'pan,zoom_in,zoom_out,reset')
p.scatter('停留时间', '用户群体', source = source)
def update_data():
new_data = data.sample(frac = 0.1)
source.data = ColumnDataSource(new_data).data
button = Button(label = '重新抽样', button_type = 'primary')
button.on_click(update_data)
doc.add_root(column(p, button))
app = Application(FunctionHandler(modify_doc))
# 启动Bokeh服务器来运行这个应用
通过以上方法,可以在处理大规模数据时优化Pandas数据读取和处理性能,并利用Bokeh的特性高效地渲染大规模数据可视化图表且保持良好的交互性。