如何将带有预测模型的Python函数应用到Flask应用程序中

时间:2017-10-27 15:10:38

标签: python json pandas dataframe flask

我有一个由两个逻辑部分组成的代码:在Flask中接收POST json请求和使用预测模型的函数。所以这里是代码表示的样子:

from flask import Flask
from flask import request
import io
import json
import pandas as pd
import numpy as np
from fbprophet import Prophet

app = Flask(__name__) 

@app.route('/postjson', methods = ['POST'])

def postJsonHandler():

  print (request.is_json)
  content = request.get_json()
  df = pd.io.json.json_normalize(content, ['Days', 'Orders'])
  print (df)
  return 'JSON posted'

app.run(host='0.0.0.0', port= 8090)

以下是具有模型功能的部分:

def TimeSeries ():

  df['Days'] = pd.to_datetime(df['Days'])
  df = df.rename(columns={'Days': 'ds',
                    'Orders': 'y'})

  my_model = Prophet(interval_width=0.95, yearly_seasonality=False, daily_seasonality=False, weekly_seasonality=True)

  df['y'] = np.log(df['y'])

  my_model.fit(df)

  future_dates = my_model.make_future_dataframe(periods=30)

  forecast = my_model.predict(future_dates)

  yhat=forecast.yhat
  ser=np.exp(yhat)
  df_upd=pd.DataFrame(ser[-30:])
  df_upd.reset_index(drop=True, inplace=True)
  js=df_upd.to_dict(orient='split')
  del js['index']
  res=json.dumps(js)    

  return res

我的问题将通过以下方式进行:

  1. 如何从第一部分函数postJsonHandler()传递结果数据帧df并将其用作第二部分函数TimeSeries()中的输入?
  2. 如何在Flask环境中集成我的预测函数TimeSeries(),以便能够一次运行所有内容 - 接收json请求,将其转换为pandas数据帧,以json格式计算预测结果并将其传输到服务器
  3. 非常感谢!

1 个答案:

答案 0 :(得分:1)

您将功能组合在一起:

from flask import Flask
from flask import request
import io
import json
import pandas as pd
import numpy as np
from fbprophet import Prophet

app = Flask(__name__) 

my_model = Prophet(interval_width=0.95, yearly_seasonality=False, daily_seasonality=False, weekly_seasonality=True)

@app.route('/postjson', methods = ['POST'])

def postJsonHandler():

  print (request.is_json)
  content = request.get_json()
  df = pd.io.json.json_normalize(content, ['Days', 'Orders'])
  df['Days'] = pd.to_datetime(df['Days'])
  df = df.rename(columns={'Days': 'ds',
                    'Orders': 'y'})

  df['y'] = np.log(df['y'])

  my_model.fit(df)

  future_dates = my_model.make_future_dataframe(periods=30)

  forecast = my_model.predict(future_dates)

  yhat=forecast.yhat
  ser=np.exp(yhat)
  df_upd=pd.DataFrame(ser[-30:])
  df_upd.reset_index(drop=True, inplace=True)
  js=df_upd.to_dict(orient='split')
  del js['index']
  res=json.dumps(js)  



app.run(host='0.0.0.0', port= 8090