質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

2135閲覧

順次増えていくcsvファイルの差分のみ前処理してデータベースに格納する方法

MagMag

総合スコア80

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

1クリップ

投稿2020/03/25 22:08

工場に設置した設備からとったログcsvファイルを処理しており、そのファイルのデータベース化について教えていただけないでしょうか?

ここまでやったこと

工場のある工程で、1バッチ(1回の製造サイクル)毎に10個のセンサーから各々csvファイルが出てきます。Pandasを利用して、このcsvファイルを複数バッチ分前処理して、1つのDataFrameにまとめるところまでは完了しました。

困っていること

csvファイルは、一つのフォルダに人手でコピーしているのですが、次第に増えてきています。前処理は全csvファイルを読んで行うので、次第に処理が重くなっていきます。

実施したいこと

1、管理上、すべてのcsvファイルは1つのフォルダに保存したい(ファイル名でバッチ番号とセンサ名は識別可能)
2、全バッチ・全センサを統合したDataFrameをSqliteに格納にしたい
3、新しいバッチ分のcsvファイルが格納されたときは、新しいバッチ分だけPandasで前処理し、2に追加したい。

SQLに詳しくないのですが、上の太字部分をどう実現したらいいでしょうか?

今考えている流れ

イメージとして、以下を考えています。
1、ファイル名からバッチ番号とセンサ名を取得
2、SQLを使って、データベースに格納されているバッチ番号とセンサ名を取得
3、1と2を比較し、前処理すべき対象csvを特定
4、対象csvをpandasで処理し、Insertでデータベースに追加

SQLを使ったことがないので、この流れで問題ないでしょうか?
こういう方がよりシンプルにできるよ!などアドバイスいただけたら幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/03/26 01:28 編集

新しく発生した未処理のCSVファイルは、すべてバッチ処理対象としてよいのでしょうか。例えばdata01.csv, data02.csvの処理済みファイルがあって、新しくdata03.csv, data04.csvが発生したとき、同じフォルダー内にはdata01.csv~data04.csvの4つのファイルがあることになりますが、data03.csv, data04.csvの2つのファイルはとにかくバッチ処理する、ということでしょうか。 もしそうであれば、SQLを使うまでも無い気がしています。
MagMag

2020/03/26 09:41 編集

元データを保管するため、未処理csvファイルはそのままにしており、処理済みの各csvは作っていません。代わりに全データをまとめたDataFrameを作ってcsvにしています(解析するときには1つのDataFrameに乗っけるため)。 処理済みcsv保管フォルダを作って、そこに順次格納する方法もあると多いますし、おっしゃる通りSQLをつかなわなくても対応はできるところはあると思っています。ただ、1つのDataFrameにまとめた後はSQLの方が操作が早いかな、という感覚です。
guest

回答2

0

ベストアンサー

処理性能を考えるのであれば、極力SQLの発行回数を少なくする必要があります。
ですので、CSVのデータを一括したSQLで処理するようにします。

1.読み込んだファイルの内容を一時テーブルに格納する。
2.一時テーブルと格納用テーブルのキー(バッチ番号とセンサ名)で突合し格納する。

一時テーブルを使用すると、トランザクション毎に独立しているので、特段の制御なしにファイル単位での並列処理も可能になり時間短縮に寄与できます。

前処理と言われているものがどのようなものか分かりませんが、SQLで行えることなら2に含めた方が高速になります。

投稿2020/03/26 01:27

sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MagMag

2020/04/01 09:26

ありがとうございました!シンプルでわかりやすい構成だったので、この方法でトライアルしようと思っています。SQLは詳しくないですが、前処理には欠損値処理、外れ値処理、時間データのダウン/アップサンプリング等行っているので、Pandasでの処理で分けようと思います。
guest

0

こんにちは。

いろいろやりようはあると思います。細かい技術的なことで改善されることもあると思います。

一つの案は、
・SQLiteデータベースに、取り込まれたCSVファイル名のデータベースというものを作る。
バッチ番号、センサー名、CSVファイル名、保存フォルダ名、をデータ項目として持っていればいいと思います。

・バッチ実行履歴のCSVファイルは週次、月次などで保存フォルダを変える。

・CSVファイル名に日付、時間を入れる
日付で検索することで処理が早くなると思います。

・最新の保存フォルダをチェックして、取り込まれたCSVの履歴データベースの「CSVファイル名」(これも最新の保存フォルダにあるべきものに絞る)にないファイルが発生したら、結合できるCSVを適宜処理・結合して取り込む

こうすると、最新のものの入っている週や月だけ見ればよいので、CSVのファイル検索の処理が軽くなります。

一つの案です。沢山やり方はあると思います。

ご検討ください。

投稿2020/03/25 23:14

yi634

総合スコア37

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MagMag

2020/04/01 09:26

ありがとうございます。履歴ファイルという使い方もありですね。参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問