首页 > 解决方案 > 使用 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 个)是否更好,或者像我现在那样做更好,在使用它们时阅读它们。每次单击数据表中的一行以更新图形和表本身时,都会调用这些函数。

如果它更好(或不是),我也想怎么做,我不知道如何在开始时读取文件......使用全局变量?

谢谢!

标签: pythondjangopandasdataframe

解决方案


推荐阅读