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

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

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

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

Q&A

1回答

1462閲覧

為替レートのローソク足(始値、高値、安値、終値)を任意の時間で抽出したいのですが、、、

y_masa.teratail

総合スコア13

Python

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

0グッド

0クリップ

投稿2021/05/02 15:26

編集2021/05/05 04:03

プログラミング初学者です。
質問の仕方等、至らない点があるとは思いますが、多めに見ていただけると幸いです。
↓以下本文です。

為替レートのローソク足(始値、高値、安値、終値)から任意の時間(5分、10分等)でデータを抽出したく、下記のようにコードを組みました。

OHLC(始値、高値、安値、終値)のデータフレームは作成できたのですが、
def文で関数を定義するとうまく実行されません、、

エラー内容としましてはDataErrorが出力されており、
これはdataM1のデータフレームの作成方法に誤りがあるということなのでしょうか。
それとも関数定義の仕方が間違っているのでしょうか。

以下に参考にしたページを載せさせて頂きました。
詳しい方、ご教示頂けないでしょうか。
よろしくお願いいたします。

参考ページ
csvファイル参照


以下、ppaulさんに回答頂いた内容について実践してみた内容となります。

どこかに数字ではないデータが入っている可能性があるということで、
ppaulさんに私的頂いたdtypeにてデータ型の確認を行ったところ、
以下のような結果が得られました。

python

1print(dataM1['Open'].dtype) 2print(dataM1['High'].dtype) 3print(dataM1['Low'].dtype) 4print(dataM1['Close'].dtype) 5print(dataM1['A'].dtype) 6print(dataM1['f'].dtype) 7 8float64 9float64 10float64 11float64 12object 13int64

この結果より、Aの列に数字でないデータが入っている可能性があるということで、
ヒストリカルデータを別のサイトから取得し、同様に実行してみました。
参照データ
以下dtypeでの実行結果です。

python

1print(dataM1['Open'].dtype) 2print(dataM1['High'].dtype) 3print(dataM1['Low'].dtype) 4print(dataM1['Close'].dtype) 5print(dataM1['A'].dtype) 6print(dataM1['f'].dtype) 7 8float64 9float64 10float64 11float64 12object 13int64

やはりAの列でobjectが表示されてしまいます。
(無料ダウンロードのデータだと効率よく使用できないようになっている、、?


python

1#pandasとnumpyをインポート 2import pandas as pd 3import numpy as np 4 5#OHLCのデータフレーム作成 6dataM1 = pd.read_csv('data.csv' , names = ('A','Open','High','Low','Close','F')) 7dataM1.index = pd.to_datetime(pd.Series(dataM1.index)+' '+dataM1.reset_index()['A']) 8dataM1.index.name = 'Time' 9dataM1.drop(['A','F'] , axis=1).head() 10 11#マルチタイムフレームの作成 12def make_mtf_ohlc(dataM1, tf): 13 x = dataM1.resample(tf).ohlc() 14 O = x['Open']['open'] 15 H = x['High']['high'] 16 L = x['Low']['low'] 17 C = x['Close']['close'] 18 ret = pd.DataFrame({'Open': O, 'High': H, 'Low': L, 'Close': C}, 19 columns=['Open','High','Low','Close']) 20 return ret.dropna() 21 22ohlc_1h = make_mtf_ohlc(dataM1, '1H') 23ohlc_1h 24 25#エラー内容 26DataError Traceback (most recent call last) 27<ipython-input-4-5bc21324f74e> in <module> 28 9 return ret.dropna() 29 10 30---> 11 ohlc_1h = make_mtf_ohlc(dataM1, '1H') 31 12 ohlc_1h 32 33<ipython-input-4-5bc21324f74e> in make_mtf_ohlc(dataM1, tf) 34 1 def make_mtf_ohlc(dataM1, tf): 35----> 2 x = dataM1.resample(tf).ohlc() 36 3 O = x['Open']['open'] 37 4 H = x['High']['high'] 38 5 L = x['Low']['low'] 39 40~/anaconda3/lib/python3.7/site-packages/pandas/core/resample.py in f(self, _method, *args, **kwargs) 41 863 def f(self, _method=method, *args, **kwargs): 42 864 nv.validate_resampler_func(_method, args, kwargs) 43--> 865 return self._downsample(_method) 44 866 f.__doc__ = getattr(GroupBy, method).__doc__ 45 867 setattr(Resampler, method, f) 46 47~/anaconda3/lib/python3.7/site-packages/pandas/core/resample.py in _downsample(self, how, **kwargs) 48 1018 # we want to call the actual grouper method here 49 1019 result = obj.groupby( 50-> 1020 self.grouper, axis=self.axis).aggregate(how, **kwargs) 51 1021 52 1022 result = self._apply_loffset(result) 53 54~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/generic.py in aggregate(self, arg, *args, **kwargs) 55 1313 @Appender(_shared_docs['aggregate']) 56 1314 def aggregate(self, arg, *args, **kwargs): 57-> 1315 return super(DataFrameGroupBy, self).aggregate(arg, *args, **kwargs) 58 1316 59 1317 agg = aggregate 60 61~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/generic.py in aggregate(self, arg, *args, **kwargs) 62 184 63 185 _level = kwargs.pop('_level', None) 64--> 186 result, how = self._aggregate(arg, _level=_level, *args, **kwargs) 65 187 if how is None: 66 188 return result 67 68~/anaconda3/lib/python3.7/site-packages/pandas/core/base.py in _aggregate(self, arg, *args, **kwargs) 69 354 if isinstance(arg, compat.string_types): 70 355 return self._try_aggregate_string_function(arg, *args, 71--> 356 **kwargs), None 72 357 73 358 if isinstance(arg, dict): 74 75~/anaconda3/lib/python3.7/site-packages/pandas/core/base.py in _try_aggregate_string_function(self, arg, *args, **kwargs) 76 310 if f is not None: 77 311 if callable(f): 78--> 312 return f(*args, **kwargs) 79 313 80 314 # people may try to aggregate on a non-callable attribute 81 82~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/groupby.py in ohlc(self) 83 1317 84 1318 return self._apply_to_column_groupbys( 85-> 1319 lambda x: x._cython_agg_general('ohlc')) 86 1320 87 1321 @Appender(DataFrame.describe.__doc__) 88 89~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/generic.py in _apply_to_column_groupbys(self, func) 90 1490 (func(col_groupby) for _, col_groupby 91 1491 in self._iterate_column_groupbys()), 92-> 1492 keys=self._selected_obj.columns, axis=1) 93 1493 94 1494 def _fill(self, direction, limit=None): 95 96~/anaconda3/lib/python3.7/site-packages/pandas/core/reshape/concat.py in concat(objs, axis, join, join_axes, ignore_index, keys, levels, names, verify_integrity, sort, copy) 97 226 keys=keys, levels=levels, names=names, 98 227 verify_integrity=verify_integrity, 99--> 228 copy=copy, sort=sort) 100 229 return op.get_result() 101 230 102 103~/anaconda3/lib/python3.7/site-packages/pandas/core/reshape/concat.py in __init__(self, objs, axis, join, join_axes, keys, levels, names, ignore_index, verify_integrity, copy, sort) 104 257 objs = [objs[k] for k in keys] 105 258 else: 106--> 259 objs = list(objs) 107 260 108 261 if len(objs) == 0: 109 110~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/generic.py in <genexpr>(.0) 111 1488 from pandas.core.reshape.concat import concat 112 1489 return concat( 113-> 1490 (func(col_groupby) for _, col_groupby 114 1491 in self._iterate_column_groupbys()), 115 1492 keys=self._selected_obj.columns, axis=1) 116 117~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/groupby.py in <lambda>(x) 118 1317 119 1318 return self._apply_to_column_groupbys( 120-> 1319 lambda x: x._cython_agg_general('ohlc')) 121 1320 122 1321 @Appender(DataFrame.describe.__doc__) 123 124~/anaconda3/lib/python3.7/site-packages/pandas/core/groupby/groupby.py in _cython_agg_general(self, how, alt, numeric_only, min_count) 125 836 126 837 if len(output) == 0: 127--> 838 raise DataError('No numeric types to aggregate') 128 839 129 840 return self._wrap_aggregated_output(output, names) 130 131DataError: No numeric types to aggregate

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

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

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

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

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

guest

回答1

0

make_mtf_ohlcは正しく動いています。
従って、データが間違っているか、その加工に誤りがあるのでしょう。
エラーコード全文を載せていただければ、もう少しわかるかもしれません。

以下が確認テストの結果です。

python

1>>> import pandas as pd 2>>> import io 3>>> 4>>> indata = '''Time,Open,High,Low,Close 5... 2018-12-13 10:05,100,150,90,120 6... 2018-12-13 11:07,120,160,110,130 7... 2018-12-13 11:12,130,145,102,128 8... 2018-12-13 12:18,128,142,117,134''' 9>>> 10>>> with io.StringIO(indata) as f: 11... dataM1 = pd.read_csv(f, engine='python', parse_dates=[0]) 12... 13>>> dataM1.set_index('Time', inplace=True) 14>>> 15>>> def make_mtf_ohlc(dataM1, tf): 16... x = dataM1.resample(tf).ohlc() 17... O = x['Open']['open'] 18... H = x['High']['high'] 19... L = x['Low']['low'] 20... C = x['Close']['close'] 21... ret = pd.DataFrame({'Open': O, 'High': H, 'Low': L, 'Close': C}, 22... columns=['Open','High','Low','Close']) 23... return ret.dropna() 24... 25>>> ohlc_1h = make_mtf_ohlc(dataM1, '1H') 26>>> ohlc_1h 27 Open High Low Close 28Time 292018-12-13 10:00:00 100 150 90 120 302018-12-13 11:00:00 120 160 102 128 312018-12-13 12:00:00 128 142 117 134

確実ではありませんが、どこかに数字ではないデータが入っている可能性が高いですね。
以下のデータだとご質問に書かれているのと同じエラーが発生しています。

python

1>>> indata = '''Time,Open,High,Low,Close 2... 2018-12-13 10:05,100,150,90,120 3... 2018-12-13 11:07,120,なし,110,130 4... 2018-12-13 11:12,130,145,102,128 5... 2018-12-13 12:18,128,142,117,134''' 6>>> 7>>> with io.StringIO(indata) as f: 8... dataM1 = pd.read_csv(f, engine='python', parse_dates=[0]) 9... 10>>> dataM1.set_index('Time', inplace=True) 11>>> def make_mtf_ohlc(dataM1, tf): 12... x = dataM1.resample(tf).ohlc() 13... O = x['Open']['open'] 14... H = x['High']['high'] 15... L = x['Low']['low'] 16... C = x['Close']['close'] 17... ret = pd.DataFrame({'Open': O, 'High': H, 'Low': L, 'Close': C}, 18... columns=['Open','High','Low','Close']) 19... return ret.dropna() 20... 21>>> ohlc_1h = make_mtf_ohlc(dataM1, '1H') 22 Traceback (most recent call last): 23 File "<stdin>", line 1, in <module> 24 File "<stdin>", line 2, in make_mtf_ohlc 25 File "C:\Users\myname\anaconda3\lib\site-packages\pandas\core\resample.py", line 937, in g 26 return self._downsample(_method) 27 File "C:\Users\myname\anaconda3\lib\site-packages\pandas\core\resample.py", line 1041, in _downsample 28 result = obj.groupby(self.grouper, axis=self.axis).aggregate(how, **kwargs) 29 File "C:\Users\myname\anaconda3\lib\site-packages\pandas\core\groupby\generic.py", line 928, in aggregate 30 result, how = self._aggregate(func, *args, **kwargs) 31 File "C:\Users\myname\anaconda3\lib\site-packages\pandas\core\base.py", line 311, in _aggregate 32 return self._try_aggregate_string_function(arg, *args, **kwargs), None 33 File "C:\Users\myname\anaconda3\lib\site-packages\pandas\core\base.py", line 267, in _try_aggregate_string_function 34 return f(*args, **kwargs) 35 File "C:\Users\myname\anaconda3\lib\site-packages\pandas\core\groupby\groupby.py", line 1441, in ohlc 36 return self._apply_to_column_groupbys(lambda x: x._cython_agg_general("ohlc")) 37 File "C:\Users\myname\anaconda3\lib\site-packages\pandas\core\groupby\generic.py", line 1759, in _apply_to_column_groupbys 38 return concat( 39 File "C:\Users\myname\anaconda3\lib\site-packages\pandas\core\reshape\concat.py", line 271, in concat 40 op = _Concatenator( 41 File "C:\Users\myname\anaconda3\lib\site-packages\pandas\core\reshape\concat.py", line 326, in __init__ 42 objs = list(objs) 43 File "C:\Users\myname\anaconda3\lib\site-packages\pandas\core\groupby\generic.py", line 1760, in <genexpr> 44 (func(col_groupby) for _, col_groupby in self._iterate_column_groupbys()), 45 File "C:\Users\myname\anaconda3\lib\site-packages\pandas\core\groupby\groupby.py", line 1441, in <lambda> 46 return self._apply_to_column_groupbys(lambda x: x._cython_agg_general("ohlc")) 47 File "C:\Users\myname\anaconda3\lib\site-packages\pandas\core\groupby\groupby.py", line 908, in _cython_agg_general 48 raise DataError("No numeric types to aggregate") 49 pandas.core.base.DataError: No numeric types to aggregate

データのどの部分に問題があるかを調べるには、以下のようにやってみてください。

python

1>>> print(dataM1['Open'].dtype) 2int64 3>>> print(dataM1['High'].dtype) 4object 5>>> print(dataM1['Low'].dtype) 6int64 7>>> print(dataM1['Close'].dtype) 8int64

印字されるのがobjectのところに問題があります。

投稿2021/05/02 16:45

編集2021/05/03 14:51
ppaul

総合スコア24670

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

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

y_masa.teratail

2021/05/03 09:11

前回に引き続き回答頂き、ありがとうございます。 参照しているCSVファイルのURLと、エラー内容の全文を掲載し、更新させて頂きました。(長文となってしまい、申し訳ありません、、) よろしくお願い致します。
ppaul

2021/05/03 14:52

回答を更新しましたので、そちらをお読みください。
y_masa.teratail

2021/05/05 04:07

返信が遅くなってしまい、申し訳ありません。 返信頂き、本当にありがとうございます。 ppaulさんに指摘頂いた内容を実践してみました。 CSVファイルの参照先を変更してみたのですが、同じようなエラーが表示されてしまいます、、 この結果からどのような可能性があるかアドバイス頂きたく、返信させて頂きました。 内容を更新しましたので、一読いただければ幸いです。 何度もお手数おかけしますが、よろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問