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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

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

Q&A

解決済

1回答

752閲覧

csvファイルの数値が下がったところを求めたいです。

oroororo

総合スコア2

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

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

0グッド

0クリップ

投稿2020/10/23 00:27

編集2020/10/23 01:35

前提・実現したいこと

Pythonを独学で学んでいる初心者です。
データをcsvファイルにして、yのデータについて1行ずつデータを読み込み、2つ前のデータよりも10%減少したときの数値を取得したいです。

イメージ説明

試したこと

with open("xxx.csv")as f: reader = csv.reader(f) l = [row for row in reader] y=(l[1][1]) yy=int(y) for b in range(1,501):   row=1+1*b y=(l[row][1]) if yy< 0.9*(yy-2): break print ('10%減少',row)

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

y=(l[row][1]) IndexError: list index out of range

とエラーが出てしまいます。
また、yに伴うxの数字も取得もしたいです。そちらも教えていただけたらと思います。

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

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

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

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

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

dodox86

2020/10/23 00:50

> x=(l[1][row])のところで  とありますが、ご提示のコードにはその部分が見当たりません。 また、Pythonはインデント(字下げ)の位置がとても大事なプログラミング言語です。コードはマークダウン記法を用いて読みやすくするようにしてください。インデントも崩れ、読みづらいとそれだけで回答は離れがちになります) https://teratail.com/help/question-tips#questionTips3-5-1 https://teratail.com/questions/238564 あたりを参考にしてソースコードを適切に表示するようにしてください。
oroororo

2020/10/23 01:37

コードの間違い修正しました。 コード入力用の書き方があったのですね、、、ご指摘ありがとうございます。
meg_

2020/10/23 01:49

> y=(l[row][1]) エラーが発生したときの"row"の値を確認してください。エラーの理由が分かるはずです。(エラーが起きたらデバッグしましょう)
guest

回答1

0

ベストアンサー

おそらく、ヘッダー行を除いて500個のデータを用意している(ちゃんと質問文に書きましょう)。
すると、ヘッダー行も含めて501行になり、それを読み込んだリストlインデックスの範囲は0~500までである。

さて、forによる繰り返し処理でrange(1, 501)により1~500の連番が順次生成され、row = 1 + 1 * b(これはrow = b + 1と書いても同じ)により、最後の周回におけるrowの値は501になる。リストlのインデックスをはみ出しており、提示されたエラーが発生する。

ほかにも、

  • 「2回前の値」を取得できていない。yyは最初のデータのyの値のまま変わらない。yy - 2は、yyの値から2減らした値を計算するだけで、「2回前の値」ではない。
  • 「2回前の値」が必要なら、繰り返し処理の最初のデータは、(2回前のl[1]と比較する)l[3]でないといけないのでは。
  • 最後の結果の表示でrowを使おうとしているが、rowはforループ内でのみ使われているため、スコープ(通用範囲)はforループ内部だけ。ループを脱出した後ではrowの値は取得できない。

といった点が問題になる。

Python

1import csv 2 3with open("xxx.csv")as f: 4 reader = csv.reader(f) 5 lst = [row for row in reader] 6 7# print(lst) 8lst[1:] = [list(map(int, x)) for x in lst[1:]] 9# print(lst) 10 11for i in range(3, len(lst)): 12 if lst[i][1] < 0.9 * lst[i - 2][1]: 13 print('10%減少', *lst[i]) 14 break

投稿2020/10/23 01:38

編集2020/10/23 01:52
Daregada

総合スコア11990

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

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

oroororo

2020/10/23 10:14

無事できました! さまざまなご指摘とても勉強になりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問