Я пытался создать многостраничное приложение 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