私はオブジェクト指向でのアプリケーション作成をPythonを用いて行っている者です。
現在、引数にてデータベースのカラムを選択し、そのカラムのデータを用いた計算をしたいと考えております。
例えば、
データベース
Data
カラム名 | 型 | キー |
---|---|---|
id | int | 主キー |
size | float | |
created_at | date |
Python
1# コード 2def calc_sum(model, column_name): 3 x = [] 4 x.append(model.column_name) 5 print(sum(x)) 6 7calc_sum(Data, size)
上記のコードを実行した際に、Dataモデル内のsizeカラムの全データの総和が得られるように質と考えています。
ですが、上記のコードをそのまま実行した場合、
NameError: name 'estimate_proxy_size' is not defined
ga
表示されます。
そこで、
Python
1# コード 2def calc_sum(model, column_name): 3 x = [] 4 x.append(model.column_name) 5 print(sum(x)) 6 7calc_sum(Data, "size") # 修正箇所
上記のように修正した場合は、
AttributeError: 'Data' object has no attribute 'column_name'
が表示されます。
データベースはSQLiteを用いております。
どのようにコードを変更すれば自分のやりたいことが実現できるのでしょうか?
また、自分のやりたい引数にカラム名を指定するということはできないのでしょうか?
ご回答よろしくお願いします。
追記
実際に実行したいコードを添付しておきます。
views.py
1from flask import ( 2 Blueprint, 3 render_template, 4 request, 5 redirect, 6 url_for, 7 send_from_directory, 8 current_app, 9 make_response, 10 jsonify 11) 12from math import sqrt 13import uuid 14from apps.calc.forms import InputDataForm, CalcDataForm, DeleteDataForm 15from pathlib import Path 16from apps.calc.models import Data 17from apps.app import db 18import pandas as pd 19import os 20import matplotlib.pyplot as plt 21from apps.calc.classes.input import Input 22from apps.calc.classes.control_database import ControlDatabase 23from apps.calc.classes.calculate2 import Calclate 24 25 26calc = Blueprint( 27 "calc", 28 __name__, 29 template_folder="templates", 30 static_folder="static", 31) 32 33avg_esp, avg_dh = 0, 0 34sd_esp, sd_dh = 0, 0 35sd_2 = 0 36r, csd = 0, 0 37 38 39control_database = ControlDatabase(Data) 40 41@calc.route('/result', methods=["GET", "POST"]) 42def calc_result(): 43 global sum_result, avg_eps, avg_dh, sd_eps, sd_dh, r 44 45 database_datas = control_database.get_alldata() 46 calculate_eps = Calclate(database_datas, estimate_proxy_size) 47 calculate_dh = Calclate(database_datas, development_hours) 48 49 # 平均の計算 50 avg_eps = calculate_eps.calc_avg() 51 avg_dh = calculate_dh.calc_avg() 52 53 # 標準偏差の計算 54 sd_eps = calculate_eps.calc_sd() 55 sd_dh = calculate_dh.calc_sd() 56 57 58 return render_template("calc/result.html", avg1=avg_eps, avg2=avg_dh, sd1=sd_eps, sd2=sd_dh)
caluclate.py
1from flask import ( 2 Blueprint, 3 render_template, 4 request, 5 redirect, 6 url_for, 7 send_from_directory, 8 current_app, 9 make_response, 10 jsonify 11) 12from math import sqrt 13import uuid 14from apps.calc.forms import InputDataForm, CalcDataForm, DeleteDataForm 15from pathlib import Path 16from apps.calc.models import Data 17from apps.app import db 18import pandas as pd 19import os 20import matplotlib.pyplot as plt 21from apps.calc.classes.input import Input 22from apps.calc.classes.control_database import ControlDatabase 23 24 25class Calclate: 26 27 def __init__(self, datas, column_name): 28 29 self.datas = datas 30 self.column_name = column_name 31 32 def retrun_datalist(self): 33 data_list = [] 34 column_name = self.column_name 35 for data in self.datas: 36 data_list.append(data.column_name) 37 38 return data_list 39 40 def select_data_column(self): 41 pass 42 43 # 総和の計算 44 def calc_sum(self): 45 data_list = self.retrun_datalist() 46 sum_result = sum(data_list) 47 48 return sum_result 49 50 # 平均の計算 51 def calc_avg(self): 52 data_list = self.retrun_datalist() 53 try: 54 avg = self.calc_sum() / len(data_list) 55 56 except ZeroDivisionError: 57 avg = None 58 59 return avg 60 # 標準偏差の計算 61 def calc_sd(self): 62 source_sd = [] 63 data_list = self.retrun_datalist() 64 avg = self.calc_avg() 65 if avg == None: 66 try: 67 for i in range(len(data_list)): 68 source_sd.append((data_list[i] - avg) ** 2) 69 70 sd_2 = sum(source_sd) / len(source_sd) 71 sd = round(sqrt(sd_2), 2) 72 73 except ZeroDivisionError: 74 sd = None 75 76 return sd
models.py
1from datetime import datetime 2 3from apps.app import db 4from werkzeug.security import generate_password_hash 5 6 7class Data(db.Model): 8 __tablename__ = "datas" 9 id = db.Column(db.Integer, primary_key=True) 10 estimate_proxy_size = db.Column(db.Float) 11 development_hours = db.Column(db.Float) 12 created_at = db.Column(db.DateTime, default=datetime.now)
このコードで、Dataモデルのestimate_proxy_sizeやdevelopment_hoursの値の計算をしたいと考えています。