python - 使用 pandas 读取一次并保持许多 csv 文件打开或每次读取和关闭
问题描述
我正在用 Django 做一个项目,在这个项目中我用 Plotly 生成几个图表,并对我用 pandas 读取、写入和修改(也下载或删除)的 CSV 文件进行操作。
这些文件取决于用户所属的公司,例如,如果属于TOYOTA公司,则文件在data/toyota,如果属于Honda,则在data/honda。
我的问题是哪个更好,读取用户登录时将使用的 50 个 csv,或者根据需要读取和关闭 csv。例如,在我的 url example.com/analysis 中,调用了这些函数:
@login_required
def analysis(request):
data_report = pd.read_csv(f'data/{request.user.company}/test/data_report.csv', sep=';',
encoding='utf-8')
context = {}
for column in data_report.columns:
context[column] = data_report.loc[0, column]
data_roles = pd.read_csv(f'data/{request.user.company}/test/data_roles.csv', sep=';',
encoding='utf-8')
# Here more code that doesn't matter ...
graphs = []
marker = {
'color': 'rgb(0,150,209)',
'opacity': 0.5,
}
graphs.append(
go.Scatter(x=n_users, y=n_perms, mode='markers', name='Line y1', marker=marker)
)
layout = {
'xaxis_title': 'Number of users',
'yaxis_title': 'Number of permissions',
'height': 400,
}
plot_div = plot({'data': graphs, 'layout': layout},
output_type='div')
context['plot_div'] = plot_div
return render(request, 'analysis.html', context)
@method_decorator(csrf_exempt)
def update_pie_chart(request):
if request.method == 'POST' and request.is_ajax():
selected = request.POST.get('selected')
data_report = pd.read_csv('data/{request.user.company}/Django_test/data_report.csv', sep=';',
encoding='utf-8')
total_attr = data_report.loc[0, 'total_attr']
attributes_metrics = pd.read_csv('data/{request.user.company}/attributes_metrics.csv',
sep=';',
encoding='utf-8', )
# Here more code that doesn't matter ...
fig = go.Figure(
data=[
go.Pie(
values=[n, total_attr - n],
textinfo='none',
showlegend=False,
hole=0.5,
marker=marker,
hoverinfo=['none', 'none'],
)
],
layout=layout,
)
return JsonResponse(fig.to_json(), safe=False)
@method_decorator(csrf_exempt)
def update_bar_chart(request):
if request.method == 'POST' and request.is_ajax():
selected = request.POST.get('selected')
attributes_vol = pd.read_csv('data/{user.request.company}/attributes_vol.csv', sep=';',
encoding='utf-8')
attributes_vol = attributes_vol.fillna('')
rows = attributes_vol.loc[attributes_vol['attribute'] == selected]
x_axis = []
y_axis = []
freq = []
for i, row in rows.iterrows():
x_axis.append(row['value'])
y_axis.append(row['n'])
for i in range(len(y_axis)):
freq.append(round(y_axis[i] / sum(y_axis), 2))
# Here more code that doesn't matter ...
fig = go.Figure(
data=[
go.Bar(
x=x_axis if len(x_axis) <= 10 else x_axis[:10],
y=freq,
marker=marker,
)
],
layout=layout,
)
return JsonResponse(fig.to_json(), safe=False)
def analysis_attributes_list(request):
if request.is_ajax():
attributes_metrics = pd.read_csv('data/{user.request.company}/attributes_metrics.csv', sep=';',
encoding='utf-8')
attributes_metrics = attributes_metrics.fillna('')
top_chart = attributes_metrics.values.tolist()
data = {
'top_chart': top_chart,
}
return JsonResponse(data, safe=False)
ETC...
所以问题是,当用户登录时,使用 pd.read_csv() 读取所有将要使用的 CSV(大约 50 个)是否更好,或者像我现在那样做更好,在使用它们时阅读它们。每次单击数据表中的一行以更新图形和表本身时,都会调用这些函数。
如果它更好(或不是),我也想怎么做,我不知道如何在开始时读取文件......使用全局变量?
谢谢!
解决方案
推荐阅读
- php - 如何从类中调用php函数并返回vue js中的值?
- php - Laravel 表单显示正确的数据但在数据库中存储不正确的值
- node.js - NodeJS 中的回调函数文档,尤其是 net.createServer
- android-studio - 如何像这样在状态栏顶部添加图像并将其移动到Android Studio中的进度值
- javascript - 遇到未捕获的类型错误:无法读取未定义的属性“设置”
- java - java mapstruct 1.3.1忽略双向DTO映射列表中的属性
- r - 在R中制作一个连续数字列表
- javascript - 复选框单击清除 contenteditable div 选择
- forms - 如何在 Contact Form 7 中删除已发送消息的边框,并使整个消息在 5 秒后消失?
- python - 在 SQLAlchemy 中创建动态类