From 6ab144e3d13bef95e315b2f8fd85810ea7572f1b Mon Sep 17 00:00:00 2001 From: "[Luis Rodrigues]" Date: Sun, 19 May 2024 10:24:29 +0100 Subject: [PATCH] =?UTF-8?q?uso=20de=20fun=C3=A7=C3=B5es=20csv.DictReader()?= =?UTF-8?q?=20e=20csv.DictWriter()=20para=20ler=20e=20escrever=20ficheiros?= =?UTF-8?q?=20csv?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 - crypto_portfolio.py | 51 +++++++++--- historico_preco.csv | 1 - historico_precos.csv | 181 +++++++++++++++++++++++++++++++++++++++++++ portfolio.py | 61 +++++++++++++++ precos.csv | 0 6 files changed, 281 insertions(+), 16 deletions(-) delete mode 100644 historico_preco.csv create mode 100644 historico_precos.csv create mode 100644 portfolio.py create mode 100644 precos.csv diff --git a/README.md b/README.md index fd417c3..46758a2 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,3 @@ https://api.coingecko.com/api/v3/coins/bitcoin/market_chart?vs_currency=eur&days https://api.coingecko.com/api/v3/coins/bitcoin/ohlc?vs_currency=eur&days=365&precision=3 - - - diff --git a/crypto_portfolio.py b/crypto_portfolio.py index 33ea783..52ddb32 100644 --- a/crypto_portfolio.py +++ b/crypto_portfolio.py @@ -1,14 +1,33 @@ import requests import time -# import datetime -baseURL = 'https://api.coingecko.com/api/v3/' +base_url = 'https://api.coingecko.com/api/v3/' coin = 'bitcoin' vs_currency = 'eur' -days = '30' +days = '365' precision = '3' +intervalo = 'daily' -ohlc_endpoint = baseURL + 'coins/' + coin + '/ohlc?vs_currency=' + vs_currency + '&days=' + days + '&precision=' + precision +historico_precos_header = [ + "data", + "moeda", + "preco_abertura", + "preco_maximo", + "preco_minimo", + "preco_fecho" +] + +portfolio_headers = [ + "data", + "moeda", + "quantidade", + "movimento" +] + +# https://api.coingecko.com/api/v3/coins/bitcoin/market_chart?vs_currency=eur&days=365&interval=daily +url_historico_preco = base_url + 'coins/' + coin + '/market_chart?vs_currency=' + vs_currency + '&days=' + days + '&interval=' + intervalo + '&precision=' + precision +# https://api.coingecko.com/api/v3/coins/bitcoin/ohlc?vs_currency=eur&days=30&precision=3 +url_preco_ohlc = base_url + 'coins/' + coin + '/ohlc?vs_currency=' + vs_currency + '&days=' + days + '&precision=' + precision APY_KEY = "CG-K5RS5VXsdFDip2UvY3z8VjQP" @@ -17,17 +36,25 @@ headers = { 'x-cg-demo-api-key': APY_KEY } -#print(ohlc_endpoint) +# tipo de pesquisa +url_consulta = url_historico_preco -response = requests.get(ohlc_endpoint, headers= headers) +response = requests.get(url_consulta, headers= headers) if response.status_code == 200: data = response.json() - print(len(data)) - date = time.ctime(data[0][0]/1000) - date_as_string = time.strftime("%d/%m/%Y", time.gmtime(data[0][0]/1000)) - ohlc = [ data[0][1], data[0][2], data[0][3], data[0][4] ] + print(len(data['prices'])) + #print(data) + + for index in range(0, len(data['prices'])): + #date = time.ctime(data['prices'][index][0]/1000) + date_as_string = time.strftime("%d/%m/%Y", time.gmtime(data['prices'][index][0]/1000)) + price = data['prices'][index][1] + print(f'{date_as_string} -> {price}') + + # ohlc = [ data[0][1], data[0][2], data[0][3], data[0][4] ] + + # print(f'price of bitcoin in {date_as_string}:\nopen: {ohlc[0]}\nhigh: {ohlc[1]}\nlow: {ohlc[2]}\nclose: {ohlc[3]}') - print(f'price of bitcoin in {date_as_string}:\nopen: {ohlc[0]}\nhigh: {ohlc[1]}\nlow: {ohlc[2]}\nclose: {ohlc[3]}') else: - print('failed to retrive data') \ No newline at end of file + print('failed to retrive data') diff --git a/historico_preco.csv b/historico_preco.csv deleted file mode 100644 index 1d7fb36..0000000 --- a/historico_preco.csv +++ /dev/null @@ -1 +0,0 @@ -data,moeda,preco_abertura,preco_maximo,preco_minimo,preco_fecho \ No newline at end of file diff --git a/historico_precos.csv b/historico_precos.csv new file mode 100644 index 0000000..61dbcd2 --- /dev/null +++ b/historico_precos.csv @@ -0,0 +1,181 @@ +data_unix,criptomoeda,vs_currency,preco_abertura,preco_maximo,preco_minimo,preco_fecho +1713355200000,bitcoin,eur,59764.004,59780.489,59063.235,59074.252 +1713369600000,bitcoin,eur,58918.27,59133.883,56552.395,56864.602 +1713384000000,bitcoin,eur,56822.322,57997.435,56402.343,57301.294 +1713398400000,bitcoin,eur,57282.049,57820.207,56972.026,57478.363 +1713412800000,bitcoin,eur,57429.02,58262.439,57209.276,58048.276 +1713427200000,bitcoin,eur,58060.628,58122.991,56936.61,57311.959 +1713441600000,bitcoin,eur,57285.932,58979.922,57067.387,58756.027 +1713456000000,bitcoin,eur,58669.332,60049.857,57911.636,59717.552 +1713470400000,bitcoin,eur,59598.34,59898.385,58608.058,59560.426 +1713484800000,bitcoin,eur,59717.912,59918.23,59434.539,59623.562 +1713499200000,bitcoin,eur,59681.227,59681.227,56519.13,58162.602 +1713513600000,bitcoin,eur,58064.108,61045.359,58064.108,60554.231 +1713528000000,bitcoin,eur,60616.231,61393.969,60339.227,60977.394 +1713542400000,bitcoin,eur,60971.085,61311.245,59827.192,60495.172 +1713556800000,bitcoin,eur,60509.69,60772.588,59802.064,60367.297 +1713571200000,bitcoin,eur,60395.123,60524.011,59237.423,60012.937 +1713585600000,bitcoin,eur,59874.011,60074.088,59301.122,59936.202 +1713600000000,bitcoin,eur,59993.471,60266.905,59917.963,60000.677 +1713614400000,bitcoin,eur,59988.613,59988.613,59466.549,59836.851 +1713628800000,bitcoin,eur,59761.551,60955.354,59691.987,60755.668 +1713643200000,bitcoin,eur,60781.259,61314.618,60562.13,60805.715 +1713657600000,bitcoin,eur,60901.527,60923.55,60592.348,60862.269 +1713672000000,bitcoin,eur,60938.556,61593.293,60629.961,61143.226 +1713686400000,bitcoin,eur,61154.202,61202.193,60873.366,61069.528 +1713700800000,bitcoin,eur,61094.533,61376.334,60766.894,61175.368 +1713715200000,bitcoin,eur,61200.502,61280.684,60802.855,60986.746 +1713729600000,bitcoin,eur,60984.601,60984.601,60327.332,60775.547 +1713744000000,bitcoin,eur,60587.886,61155.753,60506.872,60924.519 +1713758400000,bitcoin,eur,60907.455,61896.493,60517.99,61896.493 +1713772800000,bitcoin,eur,61770.036,62364.853,61540.303,61992.226 +1713787200000,bitcoin,eur,61978.521,62133.222,61830.276,61966.167 +1713801600000,bitcoin,eur,61966.502,62455.16,61807.264,62014.949 +1713816000000,bitcoin,eur,62010.752,62680.938,61982.604,62333.08 +1713830400000,bitcoin,eur,62492.696,63079.898,62338.092,62738.591 +1713844800000,bitcoin,eur,62731.622,63007.936,62433.917,62433.917 +1713859200000,bitcoin,eur,62351.893,62669.885,61913.266,62025.768 +1713873600000,bitcoin,eur,61952.277,62209.706,61754.945,61947.752 +1713888000000,bitcoin,eur,61879.02,62737.658,61781.657,62202.933 +1713902400000,bitcoin,eur,62102.444,62487.804,62102.444,62104.228 +1713916800000,bitcoin,eur,62102.458,62125.735,61739.056,62051.586 +1713931200000,bitcoin,eur,62068.458,62432.363,62047.422,62223.781 +1713945600000,bitcoin,eur,62211.832,62640.182,62211.832,62372.446 +1713960000000,bitcoin,eur,62357.941,62431.122,61995.707,62194.979 +1713974400000,bitcoin,eur,62338.851,62468.011,60444.068,60504.559 +1713988800000,bitcoin,eur,60382.882,60804.572,59675.789,60023.083 +1714003200000,bitcoin,eur,59790.792,60196.845,59425.428,60081.616 +1714017600000,bitcoin,eur,60044.109,60444.851,59745.152,60081.572 +1714032000000,bitcoin,eur,60007.958,60087.996,59624.922,59749.086 +1714046400000,bitcoin,eur,59679.798,59843.651,59162.538,59572.513 +1714060800000,bitcoin,eur,59542.489,59832.508,58881.003,59832.508 +1714075200000,bitcoin,eur,59659.988,60396.868,59659.988,60231.051 +1714089600000,bitcoin,eur,60257.802,60639.319,60008.651,60110.989 +1714104000000,bitcoin,eur,60116.61,60273.204,59608.597,60053.969 +1714118400000,bitcoin,eur,60006.506,60175.579,59803.154,59956.834 +1714132800000,bitcoin,eur,59898.087,60162.065,59718.815,59890.135 +1714147200000,bitcoin,eur,59933.721,60478.313,59328.845,59405.034 +1714161600000,bitcoin,eur,59378.403,59882.278,59273.151,59708.565 +1714176000000,bitcoin,eur,59630.891,59895.267,59603.808,59659.007 +1714190400000,bitcoin,eur,59611.726,59644.229,58467.073,58998.063 +1714204800000,bitcoin,eur,58961.958,59007.491,58744.958,58893.261 +1714219200000,bitcoin,eur,58841.03,58894.744,58588.472,58720.809 +1714233600000,bitcoin,eur,58744.473,59173.239,58717.13,58747.667 +1714248000000,bitcoin,eur,58819.061,59381.558,58648.559,59193.789 +1714262400000,bitcoin,eur,59175.089,59381.323,59009.245,59381.323 +1714276800000,bitcoin,eur,59267.028,60073.75,59267.028,59835.503 +1714291200000,bitcoin,eur,59810.576,59837.037,59628.934,59727.724 +1714305600000,bitcoin,eur,59717.251,59764.377,59211.449,59321.727 +1714320000000,bitcoin,eur,59321.606,59638.573,59321.606,59374.035 +1714334400000,bitcoin,eur,59391.116,59767.129,59345.841,59627.195 +1714348800000,bitcoin,eur,59621.14,59621.14,58700.625,58876.98 +1714363200000,bitcoin,eur,58967.579,59113.879,58327.503,58387.16 +1714377600000,bitcoin,eur,58310.997,58355.595,57861.181,58198.224 +1714392000000,bitcoin,eur,58227.272,58479.666,58015.875,58062.365 +1714406400000,bitcoin,eur,58086.371,58787.391,57862.727,58755.077 +1714420800000,bitcoin,eur,58759.705,58840.797,58355.93,58611.266 +1714435200000,bitcoin,eur,58627.485,59817.571,58609.272,59532.805 +1714449600000,bitcoin,eur,59568.883,60256.035,58979.909,59496.917 +1714464000000,bitcoin,eur,59428.934,59493.392,59004.425,59017.863 +1714478400000,bitcoin,eur,58993.953,58993.953,56983.237,57108.094 +1714492800000,bitcoin,eur,57074.016,57462.906,56613.66,56704.629 +1714507200000,bitcoin,eur,56903.324,56931.424,55842.642,55842.642 +1714521600000,bitcoin,eur,55389.868,57013.56,55389.868,56955.303 +1714536000000,bitcoin,eur,56787.448,56900.479,55905.784,56488.279 +1714550400000,bitcoin,eur,56484.742,56539.149,53914.325,53984.048 +1714564800000,bitcoin,eur,53824.489,54140.556,53220.491,54106.734 +1714579200000,bitcoin,eur,54173.318,54453.134,53043.641,53161.957 +1714593600000,bitcoin,eur,53187.253,55351.766,53163.735,53519.521 +1714608000000,bitcoin,eur,53177.766,54548.077,53177.766,54392.861 +1714622400000,bitcoin,eur,54400.67,54510.031,53173.283,53644.88 +1714636800000,bitcoin,eur,53638.753,53918.091,53354.566,53736.23 +1714651200000,bitcoin,eur,53744.299,54734.23,53744.299,54734.23 +1714665600000,bitcoin,eur,54680.172,55517.807,54560.207,55290.196 +1714680000000,bitcoin,eur,55387.399,55472.451,55043.921,55273.284 +1714694400000,bitcoin,eur,55249.448,55604.694,54708.994,55109.428 +1714708800000,bitcoin,eur,55078.685,55876.828,54857.032,55623.005 +1714723200000,bitcoin,eur,55645.336,55713.228,55065.536,55113.934 +1714737600000,bitcoin,eur,55149.411,55455.92,54836.517,55112.147 +1714752000000,bitcoin,eur,55149.463,57508.221,54914.313,57292.76 +1714766400000,bitcoin,eur,57338.276,57605.107,57176.84,57528.36 +1714780800000,bitcoin,eur,57535.131,58653.721,57535.131,58355.754 +1714795200000,bitcoin,eur,58401.414,58800.495,58189.429,58216.952 +1714809600000,bitcoin,eur,58263.549,58892.401,58260.972,58494.804 +1714824000000,bitcoin,eur,58494.772,59757.693,58480.989,59272.107 +1714838400000,bitcoin,eur,59301.583,59554.202,58957.623,59044.373 +1714852800000,bitcoin,eur,59070.03,59416.645,58897.156,59416.645 +1714867200000,bitcoin,eur,59388.306,59594.08,59082.136,59266.863 +1714881600000,bitcoin,eur,59356.299,59564.874,58509.376,58722.065 +1714896000000,bitcoin,eur,58739.437,59318.56,58689.532,59208.631 +1714910400000,bitcoin,eur,59190.84,59349.264,59026.257,59270.521 +1714924800000,bitcoin,eur,59280.532,59818.553,59123.874,59781.136 +1714939200000,bitcoin,eur,59874.796,59881.276,59285.607,59315.032 +1714953600000,bitcoin,eur,59293.91,59674.582,59113.416,59488.79 +1714968000000,bitcoin,eur,59514.581,59868.451,59218.41,59313.262 +1714982400000,bitcoin,eur,59337.481,59886.04,59294.307,59886.04 +1714996800000,bitcoin,eur,59963.942,60808.132,59462.007,59518.755 +1715011200000,bitcoin,eur,59641.32,59643.277,58454.424,58977.099 +1715025600000,bitcoin,eur,59063.95,59063.95,58360.439,58605.379 +1715040000000,bitcoin,eur,58721.392,59021.146,58553.96,58653.248 +1715054400000,bitcoin,eur,58641.116,59426.852,58500.826,58725.725 +1715068800000,bitcoin,eur,58739.929,59286.065,58699.324,59154.914 +1715083200000,bitcoin,eur,59144.07,59771.898,58981.507,58981.507 +1715097600000,bitcoin,eur,58949.56,59763.701,58597.991,59185.123 +1715112000000,bitcoin,eur,59174.086,59282.937,58473.474,58662.467 +1715126400000,bitcoin,eur,58575.826,58713.821,57953.874,57997.643 +1715140800000,bitcoin,eur,57985.025,58605.739,57945.76,58605.739 +1715155200000,bitcoin,eur,58542.663,58583.182,57852.53,57895.955 +1715169600000,bitcoin,eur,57906.834,58120.745,57789.175,57991.403 +1715184000000,bitcoin,eur,57906.939,58292.183,57448.28,57936.13 +1715198400000,bitcoin,eur,57876.469,58390.94,57716.718,58002.596 +1715212800000,bitcoin,eur,57885.137,57885.137,56609.158,56957.966 +1715227200000,bitcoin,eur,56936.205,57437.692,56926.49,57410.593 +1715241600000,bitcoin,eur,57391.672,57488.354,56976.719,56976.719 +1715256000000,bitcoin,eur,57011.98,57229.323,56557.217,56917.44 +1715270400000,bitcoin,eur,56898.037,57774.22,56650.147,57602.299 +1715284800000,bitcoin,eur,57672.2,58106.113,57366.641,57982.468 +1715299200000,bitcoin,eur,57905.789,58735.011,57883.295,58566.916 +1715313600000,bitcoin,eur,58489.374,58489.374,58154.35,58362.548 +1715328000000,bitcoin,eur,58378.65,58813.487,58171.87,58562.705 +1715342400000,bitcoin,eur,58495.732,58649.137,58283.299,58649.137 +1715356800000,bitcoin,eur,58717.003,58867.203,56468.63,56505.479 +1715371200000,bitcoin,eur,56538.313,56787.288,55989.3,56411.626 +1715385600000,bitcoin,eur,56328.122,56570.348,56110.42,56489.043 +1715400000000,bitcoin,eur,56397.521,56656.367,56312.471,56336.727 +1715414400000,bitcoin,eur,56319.16,56660.365,56319.16,56554.133 +1715428800000,bitcoin,eur,56630.656,56630.656,56158.454,56388.137 +1715443200000,bitcoin,eur,56284.096,56988.582,56230.25,56719.879 +1715457600000,bitcoin,eur,56739.373,56890.672,56591.744,56703.941 +1715472000000,bitcoin,eur,56696.515,56706.667,56385.836,56385.836 +1715486400000,bitcoin,eur,56402.218,56667.512,56402.218,56539.232 +1715500800000,bitcoin,eur,56499.864,56678.829,56264.892,56303.234 +1715515200000,bitcoin,eur,56332.481,56852.77,56332.481,56657.575 +1715529600000,bitcoin,eur,56660.206,56969.754,56607.143,56885.013 +1715544000000,bitcoin,eur,56863.015,57249.036,56756.397,56967.745 +1715558400000,bitcoin,eur,56956.462,57100.996,56573.223,57100.996 +1715572800000,bitcoin,eur,57086.95,57289.673,56426.077,56711.045 +1715587200000,bitcoin,eur,56753.984,57666.666,56434.323,57666.666 +1715601600000,bitcoin,eur,57879.453,58563.072,57879.453,58089.626 +1715616000000,bitcoin,eur,58098.181,58495.658,57855.94,58495.658 +1715630400000,bitcoin,eur,58364.137,58658.702,58052.688,58530.598 +1715644800000,bitcoin,eur,58475.761,58528.843,58127.109,58257.947 +1715659200000,bitcoin,eur,58281.533,58484.789,57869.534,57892.809 +1715673600000,bitcoin,eur,57908.379,58153.352,57000.816,57455.78 +1715688000000,bitcoin,eur,57491.83,57491.83,56972.445,57227.436 +1715702400000,bitcoin,eur,57221.186,57414.888,56606.05,57080.828 +1715716800000,bitcoin,eur,57085.238,57085.238,56489.101,56945.882 +1715731200000,bitcoin,eur,56883.281,57066.736,56818.876,56927.171 +1715745600000,bitcoin,eur,56899.985,57191.209,56747.343,57164.267 +1715760000000,bitcoin,eur,57176.955,57394.914,57116.123,57394.914 +1715774400000,bitcoin,eur,57404.869,58108.165,57194.658,57746.826 +1715788800000,bitcoin,eur,57637.448,59801.802,57637.448,59668.207 +1715803200000,bitcoin,eur,59535.01,61031.33,59535.01,60763.851 +1715817600000,bitcoin,eur,60615.125,60992.218,60456.549,60811.295 +1715832000000,bitcoin,eur,60818.876,61142.694,60516.875,60709.752 +1715846400000,bitcoin,eur,60613.227,60942.82,60371.71,60790.27 +1715860800000,bitcoin,eur,60854.584,61070.525,60769.516,61006.795 +1715875200000,bitcoin,eur,61210.721,61210.721,60191.437,60597.909 +1715889600000,bitcoin,eur,60543.25,60561.33,59420.968,60024.16 +1715904000000,bitcoin,eur,60006.817,60286.127,59875.171,60054.302 +1715918400000,bitcoin,eur,60011.002,60600.03,60005.315,60463.319 +1715932800000,bitcoin,eur,60419.234,61112.357,60211.556,60983.861 diff --git a/portfolio.py b/portfolio.py new file mode 100644 index 0000000..f351ea5 --- /dev/null +++ b/portfolio.py @@ -0,0 +1,61 @@ +# script para criar um historico de preços de criptomoedas, guardado em ficheiro CSV, com intuito de utilizar este historico de precos para acompanhar evolução de portfolio de criptomoedas + +# aceder ao historico de preços OHLC de CoinGecko através da API +# máximo de requests mensal: 10000 (320/dia; 13/hora) +# . referenciar o uso da CoinGecko através de branding oficial e link para site (https://www.coingecko.com/en/branding) +# . documentação API: https://docs.coingecko.com/v3.0.1/reference/introduction +# . obter OHLC: https://docs.coingecko.com/v3.0.1/reference/coins-id-ohlc +import requests + +url_raiz_API = 'https://api.coingecko.com/api/v3/' + +criptomoeda = 'bitcoin' +vs_currency = 'eur' +dias = '30' +precisao = '3' +url_consulta_ohlc = 'coins/' + criptomoeda + '/ohlc?vs_currency=' + vs_currency + '&days=' + dias + '&precision=' + precisao + +url = url_raiz_API + url_consulta_ohlc + +CHAVE_API = 'CG-K5RS5VXsdFDip2UvY3z8VjQP' +headers = { + 'accept': 'application/json', + 'x-cg-demo-api-key': CHAVE_API +} + +resposta = requests.get(url, headers= headers) +# carregar dados já existentes em ficheiro CSV (criar ficheiro se não existir) +import csv +import os +cabecalho: list = [ 'data_unix', 'criptomoeda', 'vs_currency', 'preco_abertura', 'preco_maximo', 'preco_minimo', 'preco_fecho' ] +caminho_ficheiro_csv_historico_bitcoin = './historico_precos.csv' +if (os.path.exists(caminho_ficheiro_csv_historico_bitcoin) == False): + ficheiro = open(caminho_ficheiro_csv_historico_bitcoin, 'w+', newline='') + ficheiroCSV = csv.DictWriter(ficheiro, fieldnames=cabecalho) + ficheiroCSV.writeheader() + ficheiro.close() +with open(caminho_ficheiro_csv_historico_bitcoin, 'r', newline='') as ficheiro_csv_historico_precos: + ficheiroCSV = csv.DictReader(ficheiro_csv_historico_precos) + entradas: list = [] + for linha in ficheiroCSV: + entradas.append(linha) + +# converter dados de coingecko para o formato usado no ficheiro CSV +novas_linhas: list = [] +for linha_resposta in resposta.json(): + nova_entrada: dict = {} + nova_entrada[cabecalho[0]] = linha_resposta[0] + nova_entrada[cabecalho[1]] = criptomoeda + nova_entrada[cabecalho[2]] = vs_currency + nova_entrada[cabecalho[3]] = linha_resposta[1] + nova_entrada[cabecalho[4]] = linha_resposta[2] + nova_entrada[cabecalho[5]] = linha_resposta[3] + nova_entrada[cabecalho[6]] = linha_resposta[4] + novas_linhas.append(nova_entrada) +# eliminar registos que não sejam novos + +# gravar dados importados +with open(caminho_ficheiro_csv_historico_bitcoin, 'w+', newline='') as ficheiro_csv_historico_precos: + ficheiroCSV = csv.DictWriter(ficheiro_csv_historico_precos, fieldnames=cabecalho) + ficheiroCSV.writeheader() + ficheiroCSV.writerows(entradas) diff --git a/precos.csv b/precos.csv new file mode 100644 index 0000000..e69de29