Guest User

Untitled

a guest
Mar 9th, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.06 KB | None | 0 0
  1. from flask import Flask, request, redirect, url_for
  2. import mysql.connector
  3. import numpy as np
  4. import json
  5. import datetime
  6. from datetime import timedelta
  7. import sys
  8. # pip install python-dateutil
  9. from dateutil.relativedelta import relativedelta
  10.  
  11. app = Flask(__name__)
  12.  
  13. @app.route('/')
  14. def leadtime():
  15. name = "service1"
  16. d = "1d"
  17. d_op = d[-1]
  18. d = int(d[0]) * 7 if d[1] == "w" else int(d[0])
  19. start = '2017/11/20 00:00:00'
  20. end = '2018/3/10 00:00:00'
  21. # notice: 後述する str"ft"time ではなく str"pt"time
  22. start_datetime = datetime.datetime.strptime(start, "%Y/%m/%d %H:%M:%S")
  23. end_datetime = datetime.datetime.strptime(end, "%Y/%m/%d %H:%M:%S")
  24.  
  25. return leadtime_daily(name, d, d_op, start_datetime, end_datetime)
  26.  
  27. def leadtime_daily(name, d, d_op, start_datetime, end_datetime):
  28. ret = []
  29. conn = db_connect()
  30. cur = conn.cursor(dictionary=True)
  31. sql = "select * from sample where name = %s and start_time >= %s and start_time < %s and end_time < %s"
  32. try:
  33. while start_datetime < end_datetime:
  34. # get (start ~ start + [d]day) data
  35. # if end_time = null, we skip such line
  36. if(d_op == "d" or d_op == "w"):
  37. start_datetime_add_delta = start_datetime + timedelta(d)
  38. elif(d_op == "m"):
  39. start_datetime_add_delta = start_datetime + relativedelta(months = d)
  40. else:
  41. raise
  42. # SQLの実行
  43. cur.execute(sql, (
  44. name,
  45. start_datetime.strftime("%Y/%m/%d %H:%M:%S"),
  46. start_datetime_add_delta.strftime("%Y/%m/%d %H:%M:%S"),
  47. end_datetime.strftime("%Y/%m/%d %H:%M:%S")
  48. ))
  49. # 平均の計算
  50. leadtime_ave = calc_leadtime_ave(cur.fetchall())
  51.  
  52. # JSON形式に整形
  53. ret.append({"date": start_datetime.strftime("%Y/%m/%d"), "leadtime": round(leadtime_ave, 3)})
  54. start_datetime = start_datetime_add_delta
  55. return json.dumps({
  56. "status": "ok",
  57. "result": {
  58. "type": "leadtimeAve",
  59. "data": ret
  60. }
  61. })
  62. except Exception as e:
  63. return json.dumps({
  64. "status": "ng",
  65. "result": {
  66. "type": "error",
  67. "data": ""
  68. }
  69. })
  70. finally:
  71. cur.close()
  72. conn.close()
  73.  
  74. def calc_leadtime_ave(lines):
  75. leadtime_sum = timedelta(0) # 初期化
  76. count = 0
  77. for line in lines:
  78. # notice: start=2/25 12:00:00 end=2/26 00:00:00 の場合 end-start = 0.5(日)となる
  79. leadtime_sum += line["end_time"] - line["start_time"]
  80. count += 1
  81. return (leadtime_sum / timedelta(count)) if count != 0 else 0
  82.  
  83. def db_connect():
  84. conn = mysql.connector.connect(
  85. host = 'localhost',
  86. port = 3306,
  87. user = 'root',
  88. password = 'hogehoge',
  89. database = "practice"
  90. )
  91. return conn
  92.  
  93. if __name__ == '__main__':
  94. #app.debug = True
  95. app.run(host='0.0.0.0') # host='0.0.0.0'は重要
Add Comment
Please, Sign In to add comment