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

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

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

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

ファイル

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

Python 3.x

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

Q&A

解決済

1回答

1843閲覧

要素数の異なるデータの結合 python

mn.py

総合スコア41

CSV

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

ファイル

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

Python 3.x

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

0グッド

0クリップ

投稿2020/03/25 13:51

編集2020/03/26 11:45
import csv divi={} price=[] with open('divi.csv',newline='') as csvfile: reader = csv.reader(csvfile) rui=0 for row1 in reader: break for row1 in reader: b=row1[1] rui=rui+int(b) divi[row1[0]]=rui date=row1[1] with open('price.csv',newline='') as csvfile: reader = csv.reader(csvfile) for row in reader: break for row in reader: date=row[0] if date in divi: print(date,row[1],(divi[date])) elif date not in divi: print(date,int(row[1])+rui) ここに言語を入力 ```ある投資信託データ10年分が入ったcsvファイルで練習しています。 divi.csvには半期毎の分配金額、price.csvにはdailyの基準価格、が入力されています。 divi.csvファイル 日付,分配金 20100627,1500 20101227,500 20110627,200 20111227,0 price.csvファイル 日付,基準価格 20100601,10000 20100602,10100 20100603,10150 • • • 20100626,10500 20100627,9000 (ここで配当落ちしてる) 20100628,9100 • • • 20101226,12000 20101227,11500 (ここで配当落ちしてる) [目的] price.csvファイルの基準価格にそれまでの累積分配金も足したい。 自分で書いたスクリプトを実行すると、分配金日当日の基準価格にだけ累積配当金が加算されてしまいます。 (そして、分配金日当日は加算前と加算後で同じ日付のデータが二行表示されます) 二人で練習していて一人がpandasで、私は使わないでとしているので、pandsを使わないで描きたいです。 いろいろ調べたんですが、初心者すぎて、もう何を調べれば良いのかわからなくなっています。 全部教えてください、というつもりはなく、何かヒントもらえるとありがたいです。 [これを書けるといいのかな?という想像] divi.csvファイルに足りない日付を足して、直前の累積分配金を入れる。 price.csvファイルを、日付をkeyにして結合(足し算?)。

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

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

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

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

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

quickquip

2020/03/25 14:25 編集

質問が書いてありませんね
meg_

2020/03/26 00:40

pandasを使いたくない理由は何ですか? ※pandasなら実装可能ですか?
FiroProchainezo

2020/03/26 04:25

現在できているソースを提示いただけませんか? それが出てこないなら作業依頼になるので、そういうところに依頼してください。
mn.py

2020/03/26 05:32

皆さますみませんでした。ソース追記しました。次回から気をつけます
FiroProchainezo

2020/03/26 06:00

ソース追加ありがとうございます。 pythonはインデントが正しく無いと動作しないのはご存じのことと思います。 正しくMarkdownでマークしていただかないとスペースが消えてしまうので、修正いただけませんか?
mn.py

2020/03/26 08:08

ありがとうございます。治しました(^^;;
FiroProchainezo

2020/03/26 08:32

修正ありがとうございます。 > pandsを使わないで行いたいのは、二人で練習していて一人がpandasを使ってやる、私は使わないでやる、という事になっているからです。 追加された文章のようですが、そういうことならご自身で解決しないと意味がないのでは? ソース中に`divi.csv`、`price.csv`という記述がありますが、質問文では`ファイル1`、`ファイル2`です。 どちらがどれにあたりますか?(考えればわかりますが) また、[やりたい事]と[したい事]という記述がありますが、なにか意味に違いがあるのでしょうか? [したい事]の方が長いように見えますが、「このスクリプトを~」からあとは、ソースの説明と背景の説明のように見えます。 最後に、「配当も含めて株価推移を見たい」の意味がわかりません。 株価はprice.csvあたりに入っているデータではないのですか? それを見れば推移では? divi.csvの配当列を足したのが「株価推移」ですか? 株価ということは単元株の価格と思いますが、配当金も単元単位なのですか? 配当を株価に足したら株価推移ではない気がするのですが、どういった定義なのでしょうか? 現在までの利益的なものが表示したいのかなとも思いましたが、株価+配当で利益ではないし、よくわかりません。(xxxで買って、yyyで売ったら、xxx-yyyが利益ですよね???) pandasを使って、一緒に作成の練習をしている方と暗黙の仕様を持っていたりしませんか?
mn.py

2020/03/26 11:47

ご親切にありがとうございます。分かりやすいかなと思い、株価としましたが、修正の通り投資信託データです。逆に分かりづらくしていた様ですみません。 アドバイスを受けて整理してみました。
mn.py

2020/03/26 11:50

また、 >最後に、「配当も含めて株価推移を見たい」の意味がわかりません。 株価はprice.csvあたりに入っているデータではないのですか? それを見れば推移では? divi.csvの配当列を足したのが「株価推移」ですか? 株価ということは単元株の価格と思いますが、配当金も単元単位なのですか? 配当を株価に足したら株価推移ではない気がするのですが、どういった定義なのでしょうか? こちらに関してですが、利益を外に分配しなかったとして基準価格の推移を見たいです。 ですので、全ての基準価格に都度、その時の累積分配金を足しこんでいきたいです。
guest

回答1

0

ベストアンサー

質問者様は、pandasではなくdictとlistを使用するということですね。

※ FiroProchainezoさんがコメントされているように、自学ですることに意味があるなら、この回答は読まずに自力でしたほうがいいと思います。単にそれぞれで学習して知識を共有するというのが目的であればお役に立ちればとおもいます!

Python

1 2import csv 3 4divi={} 5price=[] 6with open('divi.csv',newline='') as csvfile: 7 reader = csv.reader(csvfile) 8 rui=0 9 for row1 in reader: 10 break 11 for row1 in reader: 12 b=row1[1] 13 rui=rui+int(b) # 配当を累積するところ 14 divi[row1[0]]=rui # 累積した配当 15 date=row1[1] # ここはdate(日付)にrow1[1](配当)を代入しているのでおかしい。(たぶん不要) 16 17with open('price.csv',newline='') as csvfile: 18 reader = csv.reader(csvfile) 19 for row in reader: 20 break 21 for row in reader: 22 date=row[0] # ここはちゃんと日付が入っている 23 if date in divi: 24 print(date,row[1],(divi[date])) # 読み込んだdailyの株価データポイントに対して、半期ごとの配当の表に該当する日付ならば、「日付」「株価」「配当」を表示する。 25 elif date not in divi: 26 print(date,int(row[1])+rui) # それ以外の場合、「日付」「株価」に最終的な配当の累積結果を足したものを表示(本当に最終的な配当を足していい?) 27

質問者様のソースコードにコメントをつけ足しました。
だいたい理解しました。

>[やりたい事]
>配当も含めて株価推移を見たい(累積を足していきたい)
こちらは、できていますよね??

>[したい事]
>ファイル2の配当日以外の株価にも、それまでの累積配当金を足して表示したい。
こちらをできるようになりたいということですよね
株価を表示する際にその時点での配当の累積が分かっている状態にすればいいんです!

Python

1with open('price.csv',newline='') as csvfile: 2 reader = csv.reader(csvfile) 3 divi_now = divi[next(iter(divi))] 4 for row in reader: 5 break 6 for row in reader: 7 date=row[0] 8 if date in divi: 9 print(date,row[1],(divi[date])) 10 divi_now = divi[date] 11 else: 12 print(date,int(row[1])+rui, divi_now)

これでいいはずです。

まあ、pandasのほうが楽です。また、ここでは無理やり上記のやり方で修正しましたが、私が一から作る場合は、dateもdiviもリストにしたpandasのDataFrameを作ります。そのほうが、日付から直近の過去データがどこかがわかりますから。上記の方法では、printコンソールに表示する分には問題ないですが、それをつかって何か解析したいときに、保持するのが面倒で、また別のリストを作って保存するという若干冗長なプログラムになりますので、扱いづらいように思います。

投稿2020/03/26 10:58

Matsui_hero

総合スコア346

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

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

mn.py

2020/03/26 11:54

私の下手くそな説明をご理解いただいてありがとうございます! 何もかも初心者なので、なるべく細かく理解しながら進めていきたいな、と思いpandas使わないでやってみようとなりました。(こりゃpandas使ったほうが楽だわ!と自分で思える様になりたいな、という感じです) 単なるカンニングにならない様に、自分でもしっかりと考えます。 本当にありがとうございました。
mn.py

2020/03/26 11:55

いただいたソースコードとコメントを参考にしながら一度トライしてみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問