私はオブジェクト指向でのアプリケーション作成をPythonを用いて行っている者です。
現在、引数にてデータベースのカラムを選択し、そのカラムのデータを用いた計算をしたいと考えております。
例えば、
データベース
Data
カラム名 | 型 | キー |
---|---|---|
id | int | 主キー |
size | float | |
created_at | date |
Python
# コード def calc_sum(model, column_name): x = [] x.append(model.column_name) print(sum(x)) calc_sum(Data, size)
上記のコードを実行した際に、Dataモデル内のsizeカラムの全データの総和が得られるように質と考えています。
ですが、上記のコードをそのまま実行した場合、
NameError: name 'estimate_proxy_size' is not defined
ga
表示されます。
そこで、
Python
# コード def calc_sum(model, column_name): x = [] x.append(model.column_name) print(sum(x)) calc_sum(Data, "size") # 修正箇所
上記のように修正した場合は、
AttributeError: 'Data' object has no attribute 'column_name'
が表示されます。
データベースはSQLiteを用いております。
どのようにコードを変更すれば自分のやりたいことが実現できるのでしょうか?
また、自分のやりたい引数にカラム名を指定するということはできないのでしょうか?
ご回答よろしくお願いします。
追記
実際に実行したいコードを添付しておきます。
views.py
from flask import ( Blueprint, render_template, request, redirect, url_for, send_from_directory, current_app, make_response, jsonify ) from math import sqrt import uuid from apps.calc.forms import InputDataForm, CalcDataForm, DeleteDataForm from pathlib import Path from apps.calc.models import Data from apps.app import db import pandas as pd import os import matplotlib.pyplot as plt from apps.calc.classes.input import Input from apps.calc.classes.control_database import ControlDatabase from apps.calc.classes.calculate2 import Calclate calc = Blueprint( "calc", __name__, template_folder="templates", static_folder="static", ) avg_esp, avg_dh = 0, 0 sd_esp, sd_dh = 0, 0 sd_2 = 0 r, csd = 0, 0 control_database = ControlDatabase(Data) @calc.route('/result', methods=["GET", "POST"]) def calc_result(): global sum_result, avg_eps, avg_dh, sd_eps, sd_dh, r database_datas = control_database.get_alldata() calculate_eps = Calclate(database_datas, estimate_proxy_size) calculate_dh = Calclate(database_datas, development_hours) # 平均の計算 avg_eps = calculate_eps.calc_avg() avg_dh = calculate_dh.calc_avg() # 標準偏差の計算 sd_eps = calculate_eps.calc_sd() sd_dh = calculate_dh.calc_sd() return render_template("calc/result.html", avg1=avg_eps, avg2=avg_dh, sd1=sd_eps, sd2=sd_dh)
caluclate.py
from flask import ( Blueprint, render_template, request, redirect, url_for, send_from_directory, current_app, make_response, jsonify ) from math import sqrt import uuid from apps.calc.forms import InputDataForm, CalcDataForm, DeleteDataForm from pathlib import Path from apps.calc.models import Data from apps.app import db import pandas as pd import os import matplotlib.pyplot as plt from apps.calc.classes.input import Input from apps.calc.classes.control_database import ControlDatabase class Calclate: def __init__(self, datas, column_name): self.datas = datas self.column_name = column_name def retrun_datalist(self): data_list = [] column_name = self.column_name for data in self.datas: data_list.append(data.column_name) return data_list def select_data_column(self): pass # 総和の計算 def calc_sum(self): data_list = self.retrun_datalist() sum_result = sum(data_list) return sum_result # 平均の計算 def calc_avg(self): data_list = self.retrun_datalist() try: avg = self.calc_sum() / len(data_list) except ZeroDivisionError: avg = None return avg # 標準偏差の計算 def calc_sd(self): source_sd = [] data_list = self.retrun_datalist() avg = self.calc_avg() if avg == None: try: for i in range(len(data_list)): source_sd.append((data_list[i] - avg) ** 2) sd_2 = sum(source_sd) / len(source_sd) sd = round(sqrt(sd_2), 2) except ZeroDivisionError: sd = None return sd
models.py
from datetime import datetime from apps.app import db from werkzeug.security import generate_password_hash class Data(db.Model): __tablename__ = "datas" id = db.Column(db.Integer, primary_key=True) estimate_proxy_size = db.Column(db.Float) development_hours = db.Column(db.Float) created_at = db.Column(db.DateTime, default=datetime.now)
このコードで、Dataモデルのestimate_proxy_sizeやdevelopment_hoursの値の計算をしたいと考えています。
まだ回答がついていません
会員登録して回答してみよう