🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

733閲覧

python ファイル別のデータの移動平均処理を出す方法

ppgrow

総合スコア5

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/12/02 10:10

pythonにて 日ごとでファイルが分かれているものを数年分データを続けて移動平均処理をしたいです。

自分では ファイルを一旦数年分縦連結して処理を考えましたが、
かなり時間かかる上にメモリ使用が凄い状態
です。
今後もdataは増え続けるものです。

ファイルをまたいで計算し続ける方法をご教授お願い致します。

<現状rawdata>
日付      時間  グラム
2019/6/27 0:00:00 382
2019/6/27 0:01:00 100
2019/6/27 0:02:00 193
2019/6/27 0:03:00 339
:       :    :
2019/6/27 23:56:00 273
2019/6/27 23:57:00 473
2019/6/27 23:58:00 471
2019/6/27 23:59:00 333
=========================ここで各日ファイルが区切れています
2019/6/28 0:00:00 372
2019/6/28 0:01:00 454
2019/6/28 0:02:00 345

import glob import pandas as pd import numpy as np path = 'C:/path/raw/' write_1 = 'C:/path/idoumean/' # フォルダ内のcsvファイル取得 csv_files = glob.glob(path + '*.csv', recursive=True) for i in range(2000): d1_raw = pd.read_csv(csv_files[i], header = 0, encoding = 'cp932', engine = 'python')   # ファイルの連結 d2_raw = pd.concat([d2_raw, d1_raw], axis = 0) i += 1 # 移動平均処理 idou = pd.DataFrame() idou["日付"] = pp["日付"] idou["日付"] = pp["日付"] idou["グラム"]=d2_raw["グラム"].rolling(3).mean().round(1)

上のコードでも処理は可能ですが、
数時間たっても出来上がらない状態でpythonメモリ使用が96%などです。
宜しくお願い致します。

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

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

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

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

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

otn

2020/12/02 14:55 編集

データを全部メモリーに載せようとするから、大きくなるので、1行ずつ読んで処理すれば良いのでは?
ppgrow

2020/12/02 16:21

ご覧いただきましてありがとうございます。 初心者のため 一行づつ別ファイルからも読込むということが思いつきません。 開いて閉じて開いて閉じてということを2ページずつくらいするのでしょうか? 今後 10分ごと1時間ごとと移動平均単位をあげていく予定です。 一行ずつ読み込んで 移動平均処理をする方法をご教授いただけると幸いです。 宜しくお願い致します。
otn

2020/12/02 16:30

うーん、pandasばっかり使って、普通にファイルを読んだことがないんですかね。 回答に書いておきます。
guest

回答1

0

ベストアンサー

サンプル:
CSVのカラム1の5つの移動平均を、5行名以降の右端に追加。

Python

1import glob 2 3N = 5 4data = [0]*N 5i = 0 6 7for fname in sorted(glob.glob("~~~~~")): # 該当ファイルにマッチするファイルについて 8 with open(fname) as f: # オープンして、 9 while True: 10 line = f.readline() # 1行読んで、 11 if not line: break # EOFなら次のファイルに 12 line = line.rstrip("\n") # 改行を削除して 13 x = float(line.split(",")[0]) # カンマで分割して先頭のカラムを数値化 14 data[i%N] = x # 保存して 15 if i >= N: # データが5件目以降なら 16 line = f"{line},{sum(data)/N}" # 平均を取って追加して 17 print(line) # 出力して 18 i+=1 # 件数を数える

単純にカンマで区切れない場合はcsvライブラリを使ってください。

投稿2020/12/02 17:03

編集2020/12/02 17:05
otn

総合スコア85886

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

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

ppgrow

2020/12/02 23:10

ありがとうございます! おっしゃる通りpandasでファイル読込みばかりしております。 初めてopenの活用方法がぐたいてきにわかりました。 とても勉強になりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問