En Argentina muchas veces tenemos clientes que necesitan cargar sus ventas pasadas con el fin de tener una base histórica de datos en base a la cual hacer análisis. El problema en Argentina es que una venta en pesos a mediados del 2021 no es lo mismo que una venta en pesos a mediaddos del año 2025. Es comparar peras con bananas.
Como hacemos para normalizar los datos de ventas? Transformamos las ventas en pesos a ventas en dólares. Pero en dolar blue, ya que el dolar oficial era un dibujo. Si bien no es perfecto, es mucho más cercano a la realidad.
El tema es, de donde podemos obtener las cotizaciones históricas el dolar blue? Un buen lugar es de argentinadatos.com. Proveen un APIs para diferentes servicios, y uno para obtener el valor del dolar de forma histórica, como pueden ver en esta página.
Y la llamada de requests para obtener el dato es muy sencilla:
requests.get(
"https://api.argentinadatos.com/v1/cotizaciones/dolares/blue/2024/01/01"
)
Bien, ahora como podemos hacer para obtener todas las cotizaciones el dolar blue desde 2021 al día de hoy, con un script de xmlrpc como el siguiente:
#!/usr/bin/python3
import requests
import json
import time
from xmlrpc import client
from datetime import datetime,date,timedelta
import pandas as pd
url = 'http://111.111.111.111:8068'
common = client.ServerProxy('{}/xmlrpc/2/common'.format(url))
res = common.version()
dbname = 'myclientdb'
user = 'superamin'
pwd = 'root'
uid = common.authenticate(dbname, user, pwd, {})
print(uid)
models = client.ServerProxy('{}/xmlrpc/2/object'.format(url))
# prints Odoo version and UID to make sure we are connected
base_date = date(year=2021,month=6,day=28)
while str(base_date) <= '2025-01-01 00:00:00':
print(base_date)
year = base_date.year
month = base_date.month
day = base_date.day
res = requests.get(
"https://api.argentinadatos.com/v1/cotizaciones/dolares/blue/%s/%s/%s"%(year,str(month).zfill(2),str(day).zfill(2))
)
if res.status_code == 200:
print(res.json())
rjson = res.json()
date = base_date
tasa = rjson.get('venta',1)
print(date,tasa)
domain = [[['currency_id','=',1],['name','=',str(date)]]]
rate_id = models.execute_kw(dbname,uid,pwd,'res.currency.rate','search',domain)
vals = {
'currency_id': 1,
'name': str(date),
'inverse_company_rate': tasa
}
if not rate_id:
return_id = models.execute_kw(dbname,uid,pwd,'res.currency.rate','create',[vals])
print(return_id)
else:
return_id = models.execute_kw(dbname,uid,pwd,'res.currency.rate','write',[rate_id,vals])
print(return_id)
base_date = base_date + timedelta(days=1)