Я пытаюсь отобразить разные фреймы данных в зависимости от ввода пользователя.
Я создал скрипт, запрашивающий ввод пользователя: myscript.py
import libs.mssql as mssql
db = mssql.Database()
table_name = input("Please key in A, B or C: ")
table = db.WAP(table_name)
print(table)
input("Press Enter to exit.")
Скрипт должен распечататьвывод на основе приведенной ниже функции класса:
class Database():
def __init__(self):
self.cnxn = pyodbc.connect(cnxn details)
def WAP(self, table_name):
sql = "EXECUTE Contract_Balance"
df = pd.read_sql(sql, self.cnxn)
A_filter = (df.Table_Name == 'A')
B_filter = (df.Table_Name == 'B') & (df.Product != 'C')
C_filter = (df.Table_Name == 'C') & (df.Product == 'C')
# Copy from df based on filters
A = df[A_filter].copy()
B = df[B_filter].copy()
C = df[C_filter].copy()
myDict = {"A": A, "B": B, "C": C}
if table_name in ('A', 'C'):
table = myDict[table_name]
group = ['Delivery', 'Product']
elif table_name == 'B':
table = myDict[table_name]
group = ['Delivery', 'Region']
return np.round(
table.groupby(group).\
apply(lambda x: pd.Series([np.average(x.Product_Price, weights=x.Balance),x.Balance.sum()],index=['Product_Price', 'Balance'])).\
unstack().\
swaplevel(1,0,axis=1).\
sort_index(axis=1).\
replace(np.nan, 0)
, 2).replace(0, '')
Переменные: table
и group
.
На основании ввода пользователя для table
(A, B или C)переменная group
также изменится и повлияет на конечный вывод.
myscript.py
завершится неудачно с ошибкой: AttributeError: 'str' object has no attribute 'groupby'
, из-за того, что Python анализирует ввод пользователя как строку, поэтому переменные A,B и C (которые были определены в функции класса WAP
) не возвращаются.
Ожидаемый результат состоит в том, что myscript.py
выводит правильную таблицу и группу на основе пользовательского ввода A
,B
или C
Редактировать: добавить словарь и поиск его с помощью вызова функции решает эту проблему