前提・実現したいこと
Python フレームワークdashを使って
- URLにアクセスして、ファイル選択のボタンを表示
- ファイル選択のボタンを押してファイルの選択画面を表示
- テストデータを選択して、ファイルをアップロード
- 作成した回帰モデルを用いてテストデータから推論を行う
- 推論完了後、ダウンロードボタンを表示
- ダウンロードを押して得られた予測データをCSV形式でダウンロード
発生している問題・エラーメッセージ
アップロード部分と読み込むテストcsvファイルのつなげ方がわかりません。
該当のソースコード
Python
1#import 省略 2external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css'] 3 4 5 6 7app = dash.Dash(prevent_initial_callbacks=True) 8app.layout = html.Div( 9 [ dcc.Upload( 10 id='upload-data', 11 children=html.Div([ 12 'Drag and Drop or ', 13 html.A('Select Files') 14 ]), 15 style={ 16 'width': '100%', 17 'height': '60px', 18 'lineHeight': '60px', 19 'borderWidth': '1px', 20 'borderStyle': 'dashed', 21 'borderRadius': '5px', 22 'textAlign': 'center', 23 'margin': '10px' 24 }, 25 # Allow multiple files to be uploaded 26 multiple=True 27 ), 28 html.Div(id='output-data-upload'), 29 html.Button("Download CSV", id="btn_csv"), 30 dcc.Download(id="download-dataframe-csv"), 31 ] 32) 33 34 35 36def parse_contents(contents, filename, date): 37 content_type, content_string = contents.split(',') 38 39 decoded = base64.b64decode(content_string) 40 try: 41 if 'csv' in filename: 42 # Assume that the user uploaded a CSV file 43 df = pd.read_csv( 44 io.StringIO(decoded.decode('utf-8'))) 45 elif 'xls' in filename: 46 # Assume that the user uploaded an excel file 47 df = pd.read_excel(io.BytesIO(decoded)) 48 except Exception as e: 49 print(e) 50 return html.Div([ 51 'There was an error processing this file.' 52 ] 53 ) 54 55 return html.Div([ 56 html.H5(filename), 57 html.H6(datetime.datetime.fromtimestamp(date)), 58 59 dash_table.DataTable( 60 data=df.to_dict('records'), 61 columns=[{'name': i, 'id': i} for i in df.columns] 62 ), 63 64 html.Hr(), # horizontal line 65 66 # For debugging, display the raw contents provided by the web browser 67 html.Div('Raw Content'), 68 html.Pre(contents[0:213] + '...', style={ 69 'whiteSpace': 'pre-wrap', 70 'wordBreak': 'break-all' 71 }) 72 ]) 73 74 75@app.callback(Output('output-data-upload', 'children'), 76 Input('upload-data', 'contents'), 77 State('upload-data', 'filename'), 78 State('upload-data', 'last_modified')) 79def update_output(list_of_contents, list_of_names, list_of_dates): 80 if list_of_contents is not None: 81 children = [ 82 parse_contents(c, n, d) for c, n, d in 83 zip(list_of_contents, list_of_names, list_of_dates)] 84 return children 85 86 87 88trainX = pd.read_csv("train_x.csv") 89trainY = pd.read_csv("train_y.csv") 90trainX = trainX.dropna(how='any', axis=1) 91obj = trainX.select_dtypes(include=object) 92time_st_begin = obj["期間・時間 勤務開始日"] 93time_date_begin = pd.to_datetime(time_st_begin,format='%Y/%m/%d') 94time_st_begin_work = obj["掲載期間 開始日"] 95time_date_begin_work = pd.to_datetime(time_st_begin_work,format='%Y/%m/%d') 96time_st_finish = obj["掲載期間 終了日"] 97time_date_finish = pd.to_datetime(time_st_finish,format='%Y/%m/%d') 98date = pd.concat([time_date_begin,time_date_begin_work,time_date_finish],axis=1) 99date_st = pd.concat([time_st_begin,time_st_begin_work,time_st_finish],axis=1) 100date_in = date.astype(int) 101trainX = trainX.select_dtypes(include='number') 102trainX = pd.concat([trainX,date_in],axis=1) 103trainX = trainX.drop(['お仕事No.','対象者設定 年齢下限','30代活躍中', '20代活躍中', '公開区分', '資格取得支援制度あり', 104'固定残業制', '産休育休取得事例あり','CAD関連のスキルを活かす', '給与/交通費 給与支払区分', '対象者設定 年齢上限', 105'新卒・第二新卒歓迎', '社会保険制度あり','Dip JobsリスティングS', '対象者設定 性別', 'ルーティンワークがメイン', 106'ミドル(40〜)活躍中', 'WEB登録OK','残業月10時間未満', '履歴書不要', '研修制度あり', '週1日からOK', 'DTP関連のスキルを活かす', 107'雇用形態','勤務地固定', '就業形態区分', '検索対象エリア', '土日祝のみ勤務', '英語以外の語学力を活かす', '経験者優遇', 108'PCスキル不要', 'Excelのスキルを活かす', '大量募集', '扶養控除内', '土日祝休み', '休日休暇(日曜日)', 109'短時間勤務OK(1日4h以内)', '平日休みあり', '休日休暇(土曜日)', '休日休暇(月曜日)', '休日休暇(水曜日)', 110'週4日勤務','オフィスが禁煙・分煙', '週2・3日OK', '休日休暇(金曜日)', '休日休暇(火曜日)', '休日休暇(木曜日)', 111'シフト勤務','勤務先公開'],axis=1) 112y = trainY["応募数 合計"] 113X = trainX 114y_array = np.array(y) 115X_array = np.array(X) 116X_train, X_test, y_train, y_test = train_test_split(X_array, y_array, test_size=0.4, random_state=0) 117rfr = RandomForestRegressor(random_state=0) 118rfr.fit(X_train, y_train) 119y_pred = rfr.predict(X_test) 120rmse_score = np.sqrt(mean_squared_error(y_pred, y_test)) 121 122print(rmse_score) 123#ここの部分をアップロードとつなげたい!!!!!!!!!! 124test2 = pd.read_csv('test_x.csv') 125time_st_begin2 = test2["期間・時間 勤務開始日"] 126time_date_begin2 = pd.to_datetime(time_st_begin2,format='%Y/%m/%d') 127time_st_begin_work2 = test2["掲載期間 開始日"] 128time_date_begin_work2 = pd.to_datetime(time_st_begin_work2,format='%Y/%m/%d') 129time_st_finish2 = test2["掲載期間 終了日"] 130time_date_finish2 = pd.to_datetime(time_st_finish2,format='%Y/%m/%d') 131date2 = pd.concat([time_date_begin2,time_date_begin_work2,time_date_finish2],axis=1) 132date_st2 = pd.concat([time_st_begin2,time_st_begin_work2,time_st_finish2],axis=1) 133date_in2 = date2.astype(int) 134test2 = test2.select_dtypes(include='number') 135X_test2 = pd.concat([test2,date_in2],axis=1) 136X_test2 = X_test2[['英語力不要', '英語力を活かす', 'Wordのスキルを活かす', '期間・時間 勤務期間', '外資系企業', '掲載期間 開始日', 137 '掲載期間 終了日', '残業月20時間以上', '派遣形態', '紹介予定派遣', 'Accessのスキルを活かす', '未経験OK', 138 '車通勤OK', '給与/交通費 交通費', '制服あり', '交通費別途支給', '16時前退社OK', '休日休暇(祝日)', 139 '服装自由', '残業なし', '残業月20時間未満', '10時以降出社OK', '学校・公的機関(官公庁)', '社員食堂あり', 140 'PowerPointのスキルを活かす', '大手企業', '職場の様子', '駅から徒歩5分以内', '派遣スタッフ活躍中', 141 '1日7時間以下勤務OK', '正社員登用あり', '仕事の仕方', '勤務地 都道府県コード', '職種コード', '会社概要 業界コード', 142 '期間・時間 勤務開始日', '勤務地 市区町村コード', 'フラグオプション選択', '給与/交通費 給与下限']] 143pred2 = rfr.predict(X_test2) 144submittest = pd.DataFrame(pred2) 145submittest.columns = ["応募数 合計"] 146workNo = pd.DataFrame(test2['お仕事No.']) 147df =pd.concat([workNo, submittest],axis=1) 148 149 150 151@app.callback( 152 Output("download-dataframe-csv", "data"), 153 Input("btn_csv", "n_clicks"), 154 prevent_initial_call=True, 155) 156def func(n_clicks): 157 return dcc.send_data_frame(df.to_csv, "submit.csv") 158 159 160if __name__ == "__main__": 161 app.run_server(debug=True)
試したこと
予測データをCSVファイルにしてダウンロードすることはできました。
補足情報(FW/ツールのバージョンなど)
コードが汚いのは許してくだい。
あなたの回答
tips
プレビュー