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

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

詳細はこちら
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

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

Q&A

解決済

2回答

343閲覧

csvの指定した範囲の行の中で、-1以下となる数字の個数をカウントしてグラフ出力したい

Taiga_s

総合スコア8

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

Python

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

0グッド

0クリップ

投稿2019/11/13 08:13

読み込んだcsvの指定した範囲の行の中で、-1以下となる数字の個数の変化をグラフ出力したい

初心者です。

df = pd.read_csv('1104.csv') x = df['time'] y = df['gFz']-0.98 print(df) plt.figure(figsize=(16, 8)) plt.plot(x,y)

で下の結果が出るようなcsv(25.3MB)なのですが、
イメージ説明

これを、
0450行の間に-1以下である数字が2つある(num=0)
1
451行の間に-1以下である数字が2つある(num=1)
2452行の間に-1以下である数字が2つある(num=2)

8500
8950行の間に-1以下である数字が3つある(num=8500)

17500~17950行の間に-1以下である数字が0つある(num=17500)

と言った具合で、
ある範囲の行(450行)のうち、-1以下である数字の個数をカウントしていき、
その個数をグラフとして出力したいのです。

例えば↓のようなイメージです。

イメージ説明
イメージ説明

上の図の赤線のようなグラフを作りたいです。

上記のグラフ作成方法について分かる方いらっしゃいましたら、
ご回答いただけると幸いです。

よろしくお願い申し上げます。

該当のソースコード

自分なりにやってみましたが、

Python3

1import pandas as pd 2import matplotlib.pyplot as plt 3%matplotlib inline 4 5df = pd.read_csv('1104.csv') 6z = df['gFz'] 7N = len(df['time']) #サンプリング数 8num = 0 9while num<=N: 10 R = z[num:num + 450] 11 C = sum(x < -1 for x in R) 12 plt.plot(num,C) 13 plt.draw() 14 num += 1

と打つと、jupyter notebookが固まってしまいます。

発生している問題・エラーメッセージ

赤のバックカラーに、

/Users/ユーザー名/miniconda3/lib/python3.7/site-packages/ipykernel_launcher.py:7: DeprecationWarning: Calling np.sum(generator) is deprecated, and in the future will give a different result. Use np.sum(np.fromiter(generator)) or the python sum builtin instead.
import sys

と出てしまいます。

補足情報(FW/ツールのバージョンなど)

macOS Catalina 10.15
jupyter notebook

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

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

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

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

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

guest

回答2

0

ベストアンサー

単純に gFz列が-0.1以下の行を groupby(df.index//450) にてカウントするとよいのではないですか

Python

1import pandas as pd 2import numpy as np 3 4#乱数でダミーデータ生成 5df = pd.DataFrame(np.random.uniform(-2.0, 100., (17950,4)), 6 columns = ['gFx','gFy','gFz','TgF']) 7# gFzが-0.1以下の行を450行毎にカウント 8ret = (df['gFz']<=-0.1).groupby(df.index//450*450).sum() 9print(ret) 10#0 9.0 11#450 9.0 12#900 5.0 13#1350 13.0 14#1800 7.0 15#... 16#15750 3.0 17#16200 13.0 18#16650 6.0 19#17100 6.0 20#17550 9.0 21#Name: gFz, dtype: float64

追記

+1行ずつずらしていく

であれば groupby()ではなくrolling()で行うことができます。

Python

1import pandas as pd 2import numpy as np 3 4#乱数でダミーデータ生成 5df = pd.DataFrame(np.random.uniform(-2.0, 100., (17950,4)), 6 columns = ['gFx','gFy','gFz','TgF']) 7# gFzが-0.1以下の行を450行毎にカウント 8#ret = (df['gFz']<=-0.1).groupby(df.index//450*450).sum() 9ret = (df['gFz']<=-0.1).rolling(450).sum() 10print(ret)

投稿2019/11/14 23:51

編集2019/11/15 07:54
magichan

総合スコア15898

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

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

Taiga_s

2019/11/15 06:02

すみません。質問内容がとても悪かったです… やりたいこととしては、 「450行の中で-1以下の数字がいくつあるか」を1行ずつずらしながらカウントしていきたいです。 (0行を始めとして、「450行の範囲の中で-1以下がいくつあるかカウントする」を+1行ずつずらしていく) (※450行ずつずらしていくではないです) イメージ等あるので、↓のURL先でご回答いただけたら幸いです。 https://teratail.com/questions/223367?modal=q-comp
magichan

2019/11/15 07:54

回答を編集しました
Taiga_s

2019/11/15 10:44

うまくいきました!! rolling()という関数があったんですね。 お二人ともありがとうございました!! 悩みましたが、 ベストアンサーは、コードまで書いてくださった、 magichanさんを選ばせていただきます。 t_obaraさんも、初歩的な質問にも答えてくださり、感謝いたします。
guest

0

こんな感じでしょうか、実際に試していないのでうまくいかなければすいません。

python

1df = pd.read_csv('1104.csv') 2gdf = df.groupby(pd.Grouper(key='time', frep='60s') # 60sは適当に換算してください 3gdf.plot(x='gFz') 4

上記だと-1以下をカウントの部分が含まれていませんね。
以下でしょうか。

python

1df = pd.read_csv('1104.csv') 2n = 100 3gdf = df.groupby(df.index // n) # nは適当に設定してください 4gdf.apply(lambda x: (x<=-1).count()).plot(x='gFz')

投稿2019/11/13 09:19

編集2019/11/13 11:38
t_obara

総合スコア5488

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

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

Taiga_s

2019/11/13 10:03

ご回答、誠にありがとうございます。 試したところ、下記エラー(SyntaxError)が出ました。 gdf.sum().plot(x='gFz') ^ SyntaxError: invalid syntax
t_obara

2019/11/13 10:17

gdf = df.groupby(Grouper(key='time', freq='60s') ) ですね、最後の括弧が無かったようです。
Taiga_s

2019/11/13 10:52 編集

ご返信、ありがとうございます。 df = pd.read_csv('1104.csv') gdf = df.groupby(pd.Grouper(key='time', freq='60s')) # 60は適当に換算してください gdf.sum().plot(x='gFz') と打ったところ、下記のエラーが出ました。 TypeError Traceback (most recent call last) <ipython-input-17-bc00248f900b> in <module> 1 df = pd.read_csv('1104.csv') ----> 2 gdf = df.groupby(pd.Grouper(key='time', freq='60s')) # 60は適当に換算してください 3 gdf.sum().plot(x='gFz') TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'Float64Index' このエラーについて色々調べたのですが、結局わかりませんでした… 何度もすみません。
magichan

2019/11/14 23:33 編集

すみません。間違って投稿しました
Taiga_s

2019/11/15 05:42 編集

返信が遅れてすみません。 ```Python3 df = pd.read_csv('1104.csv') n = 100 gdf = df.groupby(df.index // n) # nは適当に設定してください gdf.apply(lambda x: (x<=-1).count()).plot(x='gFz') ``` と打ったところ、正の傾きの直線のグラフが表示されました。 他の値で試しても、同じような右肩上がりのグラフなので、 やりたいこととは違ってる感じです…
Taiga_s

2019/11/15 06:02

すみません。質問内容がとても悪かったです… やりたいこととしては、 「450行の中で-1以下の数字がいくつあるか」を1行ずつずらしながらカウントしていきたいです。 (0行を始めとして、「450行の範囲の中で-1以下がいくつあるかカウントする」を+1行ずつずらしていく) (※450行ずつずらしていくではないです) イメージ等あるので、↓のURL先でご回答いただけたら幸いです。 https://teratail.com/questions/223367?modal=q-comp
t_obara

2019/11/15 07:47

ずらしたいを実現するには、rollingを使えば良いのでは?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問