Проблема с нарезкой данных (используя iloc и loc) в Dash (график) - PullRequest
0 голосов
/ 27 сентября 2019

Я пытался создать многостраничное приложение Dash, основываясь на том, как недопустимо упоминалось в https://community.plot.ly/t/splitting-callback-definitions-in-multiple-files/10583/2. Моя структура каталогов в значительной степени соответствует той же схеме:

run.py
project/
    __init__.py
    app.py
    server.py
    callbacks1.py
    tab1_layout.py
    tab1_callbacks.py
    wsgi.py

app.py походит на индексный файл, который имеет всеобъемлющий макет для панели мониторинга.Содержимое панели должно быть разбито по вкладкам, для чего я решил разделить код по файлам, предназначенным для содержимого этих вкладок, и соответствующим файлам для выделенных обратных вызовов (например, tab1_layout.py и tab1_callbacks.ру ).

Проблема возникла, когда я попытался написать обратный вызов с некоторыми манипуляциями / вычислениями с пандами в tab1_layout.py .И это было просто нарезка с использованием iloc / loc.По какой-то причине это вызывает ошибку позиционного индекса за пределами границ, когда я не сталкиваюсь с такой проблемой при выполнении тех же операций в блокноте Jupyter или даже в отдельном файле vanilla python.

Кроме перечисления через iloc / loc, я попробовал два других метода для вычисления dff, которые сработали:

########### different ways to calculate dff ###########

# direct listing using iloc
dff = dff_buff.iloc[[0, 1, 2, 4, 5, 25, 56]].reset_index(drop=True)

# chaining using append() from Pandas
chain_1 = dff_buff.iloc[0:3].append(dff_buff.iloc[4:6]) 
chain_2 = chain_1.append(dff_buff.iloc[25:26])
dff = chain_2.append(dff_buff.iloc[56:57])

# reset_index() without dropping and filtering based on old index
dff_buff_1 = dff_buff.reset_index()
dff = dff_buff_1[(dff_buff_1['index'] == 0) 
   | (dff_buff_1['index'] == 1) 
   | (dff_buff_1['index'] == 2)
   | (dff_buff_1['index'] == 4) 
   | (dff_buff_1['index'] == 5) 
   | (dff_buff_1['index'] == 25)
   | (dff_buff_1['index'] == 56)]

#######################################################

Однако даже после этого Dash выдает ошибку обратного вызова (KeyError: None) в функции sum (axis = 1) , что привело меня к мысли о том, что, возможно, эта ошибка в iloc / loc я не могу игнорировать.

Для справки (данные по адресу: https://github.com/darkreqnx/sales_file):

import numpy as np
import pandas as pd

xlsx = pd.ExcelFile('./data/sales_data.xlsx')
df_oper = pd.read_excel(xlsx, 'oper')

states_list = list(df_oper)[2:]
months_list = list(df_oper.month.value_counts(dropna=False).reset_index()['index'])

month_selected = 'Sep-15'
districts_selected = ['district_1', 'district_6']

op_tb1 = pd.DataFrame([], columns=['Quick figures'])
op_tb2 = pd.DataFrame([], columns=['No of units sold'])

dff_buff = df_oper[df_oper.month == month_selected].reset_index(drop=True)

#######################################################

# calculate dff

#######################################################

df1 = dff.copy()
df1['sales_metric'][0] = 'Primary Sales'
df1['sales_metric'][1] = 'Returned Sales'
df1['sales_metric'][2] = 'Accepted Sales'
df1['sales_metric'][3] = 'Net Sales'
df1['sales_metric'][4] = 'Invalid Sales'

df2 = df1.iloc[0:5]
df2['district_6'][2] = df1['district_6'].iloc[6]
df2['district_6'][3] = df1['district_6'].iloc[5]
df2['district_6'][4] = df1['district_6'].iloc[6] - df1['district_6'].iloc[5]

op_tb1['Quick figures'] = df2['sales_metric']
op_tb2['No of units sold'] = df2[districts_selected].sum(axis=1)


print(op_tb1)
print(op_tb2)


tr_breaker = input("\nend of code block check")

Еще одна интересная вещь, которую я обнаружил, заключалась в том, что ошибка позиционного индекса не возникала, когда я использовал iloc в iloc [start: stop] , вместо iloc [i1, i2, i3, ...] . Может кто-нибудь помочь мне понять, где я ошибаюсь с iloc / loc, а также помочьустранить проблему с помощью функции sum ()?

Журнал ошибок для проблемы iloc / loc:

Traceback (most recent call last):
  File "directory\project\tab1_callbacks.py", line 20, in table_content
    dff = dff_buff.iloc[[0, 1, 2, 4, 5, 25, 56]].reset_index(drop=True)
  File "user\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\indexing.py", line 1500, in __getitem__
    return self._getitem_axis(maybe_callable, axis=axis)
  File "user\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\indexing.py", line 2221, in _getitem_axis
    return self._get_list_axis(key, axis=axis)
  File "user\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\indexing.py", line 2203, in _get_list_axis
    raise IndexError("positional indexers are out-of-bounds")
IndexError: positional indexers are out-of-bounds

Журнал ошибок для проблемы .sum ():

Traceback (most recent call last):
  File "directory\project\project\tab1_callbacks.py", line 37, in table_content
    op_tb2['No of units sold'] = df2[districs_selected].sum(axis=1)
  File "user\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\frame.py", line 2927, in __getitem__
    indexer = self.columns.get_loc(key)
  File "user\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\indexes\base.py", line 2659, in get_loc
    return self._engine.get_loc(self._maybe_cast_indexer(key))
  File "pandas/_libs/index.pyx", line 108, in pandas._libs.index.IndexEngine.get_loc

  File "pandas/_libs/index.pyx", line 132, in pandas._libs.index.IndexEngine.get_loc

  File "pandas/_libs/hashtable_class_helper.pxi", line 1601, in pandas._libs.hashtable.PyObjectHashTable.get_item

  File "pandas/_libs/hashtable_class_helper.pxi", line 1608, in pandas._libs.hashtable.PyObjectHashTable.get_item

KeyError: None
...