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

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

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

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

Q&A

解決済

1回答

968閲覧

python によるcsvデータの処理

teshiteshi

総合スコア5

Python

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

1グッド

2クリップ

投稿2020/01/27 01:12

編集2020/01/27 08:43

前提・実現したいこと

以下のようなcsvファイルを読み取ってデータをまとめる作業を行おうと考えています。

ダウンロードした時刻:2019/11/11 16:04:33 寺泊 寺泊 年 月 日 時 風速(m/s) 風向 2016 12 23 5 9.6 南南東 2016 12 23 6 9.8 南東 2016 12 23 7 10.6 東 2016 12 23 8 10.4 北東 2016 12 23 9 10.5 西 2016 12 23 10 9.1 西 2016 12 23 11 8.1 西北西 2016 12 23 12 7.8 西北西 2016 12 23 13 6.8 西北西 2016 12 23 14 6.3 北西 2016 12 23 15 6.2 北西 2016 12 23 16 6.5 北北西 2016 12 23 17 6.3 北北西 2016 12 23 18 6.3 北 2016 12 23 19 5.4 南西 2016 12 23 20 3.9 西南西 2016 12 23 21 4 南南西 2016 12 23 22 4.6 南 2016 12 23 23 4 南

処理の方法は
➀風速の値を2乗する。

➁次に角度補正を行いたいため、風向によってcosθを風速の2乗の値にかける
ex)上記のデータの場合
・風向は16方位に区切られているので、隣り合う方位の角度の間隔は22.5°
西を正面とし
西北西と西南西は22.5°、北西と南西は45°、北北西と南南西は67.5°

・この西を基準とした角度を基に、風速の2乗値にそれぞれcosθをかける
(10.5)^2×cos(0)+(9.1)^2×cos(0)+
(8.1)^2×cos(22.5)+(7.8)^2×cos(22.5)+(6.8)^2×cos(22.5)+
(6.3)^2×cos(45)+(6.2)^2×cos(45)+
(6.5)^2×cos(67.5)+(6.3)^2×cos(67.5)+
(5.4)^2×cos(45)+
(3.9)^2×cos(22.5)+
(4)^2×cos(67.5)

➂ ➁の値で、特定の風向(今回の場合'南南西','南西','西南西','西','西北西','北西','北北西')を満たすもの全部足し合わせる。

このような処理を行いたいと考えています。

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

現在特定の風向を満たす、風速の値を2乗して、それを足し合わせる
というところまでは動きましたが
➁のような、ある風向にはcos(22.5)をかけ、ある風向にはcos(45)をかけるといった処理ができずに悩んでおります。

該当のソースコード

今現在のプログラムを以下に示します。
長い文章になって申し訳ございません。
そこで今現在このような流れで動かしていこうかなと思っています。
以下に記します。

import csv import math cos0 = math.cos(math.radians(0)) cos225 = math.cos(math.radians(22.5)) cos45 = math.cos(math.radians(45)) cos675 = math.cos(math.radians(67.5)) f = open("test.csv", "r") reader = csv.reader(f) next(reader); next(reader); next(reader); next(reader); next(reader) Direction = ['南南西','南西','西南西','西','西北西','北西','北北西'] sum = 0 for row in reader: if not row[4].strip(): # 空行スキップ continue colE = float(row[4]) #この先からつまずいています。

この後に
➀ colEを全て二乗

➁ Directionの7方位で
方位が西のcolE(2乗したもの)にcos0を掛ける
方位が西南西・西北西のcolE(2乗したもの)にcos225を掛ける
方位が南西・北西のcolE(2乗したもの)にcos45を掛ける
方位が南南西・北北西のcolE(2乗したもの)にcos675を掛ける

➂2乗値を補正した値を足し合わせる

といった流れでできないかと考えています。

python

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

DrqYuto👍を押しています

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

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

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

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

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

teshiteshi

2020/01/27 08:02

見づらくてすいませんでした。 よろしくお願いいたします。
guest

回答1

0

ベストアンサー

➁のような、ある風向にはcos(22.5)をかけ、ある風向にはcos(45)をかけるといった処理ができずに悩んでおります。

pandasを使うと行を一括で処理できて楽です。

また、このデータでは西を基準にしましたが、ほかのデータでは東や南東や北北東など基準はそれぞれ違うので、処理するデータに合わせて、プログラムを少し書き換えて動かせるようなものをつくりたいと考えています。

最初に東を基準とした風向と角度のマップを求めておきます。
次に目的の方向から角度を補正し、補正した角度から風向を抽出すればよいです。

Python

1import pandas as pd 2from io import StringIO 3import numpy as np 4pd.set_option('display.unicode.east_asian_width', True) 5 6# テストデータ 7s = """風速,風向 89.6,南南東 99.8,南東 1010.6,東 1110.4,北東 1210.5,西 139.1,西 148.1,西北西 157.8,西北西 166.8,西北西 176.3,北西 186.2,北西 196.5,北北西 206.3,北北西 216.3,北 225.4,南西 233.9,西南西 244.0,南南西 254.6,南 264.0,南""" 27df = pd.read_csv(StringIO(s)) 28 29# 東針を基準とした反時計回りになす角度[rad] を求めておく 30angle_org = { d : i*22.5*np.pi/180 for i,d in enumerate(['東','東北東','北東','北北東','北','北北西','北西','西北西','西','西南西','南西','南南西','南','南南東','南東','東南東'])} 31 32# 東→西を基準となるように角度を補正 33angle_target = { k : v - angle_org['西'] for k,v in angle_org.items()} 34 35# 西を基準として風向を抽出=cos(角度)が0より大きい 36Direction = {k for k,v in angle_target.items() if np.cos(v) > 1e-3} # +-ぴったり90度(北と南)を除く範囲 37print(Direction) 38# {'北西', '南南西', '西北西', '西南西', '南西', '西', '北北西'} 39 40# 風向で行を抽出 41df = df[df['風向'].isin(Direction)] 42 43# 各行の風向から角度を求める 44df['角度'] = [angle_target[dir] for dir in df['風向']] 45df['角度_deg'] = df['角度']*180/np.pi # 確認表示用 46print(df) 47""" 48 風速 風向 角度 角度_deg 494 10.5 西 0.000000 0.0 505 9.1 西 0.000000 0.0 516 8.1 西北西 -0.392699 -22.5 527 7.8 西北西 -0.392699 -22.5 538 6.8 西北西 -0.392699 -22.5 549 6.3 北西 -0.785398 -45.0 5510 6.2 北西 -0.785398 -45.0 5611 6.5 北北西 -1.178097 -67.5 5712 6.3 北北西 -1.178097 -67.5 5814 5.4 南西 0.785398 45.0 5915 3.9 西南西 0.392699 22.5 6016 4.0 南南西 1.178097 67.5 61""" 62 63# 16方位で南南西・南西・西南西・西・西北西・北西・北北西を満たす風速の値を2乗 64print( (df['風速'] ** 2).sum()) 65# 586.1899999999999 66 67# 西を基準とした角度を基に、風速の2乗値にそれぞれcosθをかける 68print( (df['風速'] ** 2 * np.cos(df['角度'])).sum()) 69# 480.0024660782123

投稿2020/01/27 03:45

can110

総合スコア38262

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

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

teshiteshi

2020/01/27 09:20 編集

回答ありがとうございます! 初心者でしてうまく理解できず、自分で走らせるとエラーがでてしまいました。 実際に手作業で計算してみると、プログラム通りの結果になっていました。 最初の質問内容で 【また、このデータでは西を基準にしましたが、ほかのデータでは東や南東や北北東など基準はそれぞれ違うので、処理するデータに合わせて、プログラムを少し書き換えて動かせるようなものをつくりたいと考えています。 】 といきなり、全部に対応できるようなものが作れればと思っていましたが 全てに対応できずとも、まずは西を基準とすることだけ考えて、このデータのみに対応できるようなものを作ってみようと思います。 今質問内容を修正したのですが、またお力をお貸しいただけると幸いです。
can110

2020/01/27 09:30

回答コードをそのままコピペしたものでエラーが発生するのでしょうか? ちなみに回答コードは全方向に対応しています。 「~angle_org['西']~」の部分を「~angle_org['北東']~」のように修正するだけでよいです。
teshiteshi

2020/01/27 09:52

そのままコピペしたら動いています! ですが自分でコードを見ても使い方がわかりませんでした。 いくつかお聞きしたいことがあるのですがよろしいでしょうか。 ➀このコードは「s(テストデータ)」というものに対応していると思っているのですが、私のcsvファイルをこのコードでうごかしたい場合 df = pd.read_csv(StringIO(s)) の(s)を"test.csv"と書き直せばよいのですか? ➁この部分で「~angle_org['北東']~」とした場合 北東はcos0 北北東・東北東はcos22.5 北と東はcos45 北北西と東南東はcos67.5 その他の方位は合計に入らないとなっているのでしょうか? 教えていただいたコードから読み取れなくてすいません。
teshiteshi

2020/01/27 10:25

再度同じような質問をして、配慮が足りなかったです、申し訳ありませんでした。 どうか、この教えていただいたコードについては理解して動かしたいのです。 迷惑かもしれませんがお願いいたします。
can110

2020/01/27 10:53

おそらく「~.read_csv(ファイル名, sep='\s+', skiprows=3)」 のように区切り文字と読み飛ばす先頭行数を指定すればいけるかと思います。 うまくいかない場合は公式マニュアルなどを参考に試行錯誤してみてください。 > ➁この部分で~合計に入らないとなっているのでしょうか? 要は基準となる方位から左右90度未満の方角のみを抽出し、基準方位からみた角度を元にcosを出すようなコードになっています。 回答コードでは、抽出された方角、基準からの角度をprintするようにしているので 実際に動かしてみて、意図通りになっているか確認してみてください。
teshiteshi

2020/01/28 07:59

~.read_csv(ファイル名, sep='\s+', skiprows=3) ここを動かしたいファイルに合わせることで思うように動かせました!! 何度も何度も本当にありがとうございます。 失礼をおかけして申し訳ありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問