Colaboratoryを使用して、暗号資産のデータをGoogleスプレッドシートに記入する方法

当ページのリンクには広告が含まれています。

ども♪真毅です。

↓良ければ応援クリックお願いします!
にほんブログ村 株ブログへ

Googleスプレッドシートにスプレッドシート暗号資産 取得用」、シート名「BTC_D」「BTC_M」「BTC_Y」「ETH_D」「ETH_M」「XRP_D」「XRP_M」を作成し、以下のプログラムをColaboratoryで実行すれば、データを取得できるはずです。

import sys
import time

import pandas as pd
import datetime as dt
import pandas_datareader.data as web
import matplotlib.pyplot as plt
import re
import requests
import io

# 認証のためのコード
from google.colab import auth
auth.authenticate_user()

import gspread
from google.auth import default
creds, _ = default()
gc = gspread.authorize(creds)

open = dt.date(1900,1,1)
stop = dt.date.today()

try:

  # 実行時間を測るStart
  start = time.time()
  print ("開始時間:{0}".format(time.strftime('%Y/%m/%d %H:%M:%S')) )

  def toAlpha(num):
    if num<=26:
        return chr(64+num)
    elif num%26==0:
        return toAlpha(num//26-1)+chr(90)
    else:
        return toAlpha(num//26)+chr(64+num%26)

  def WriteSheets(df,start_cell,filename,sheetname,Clearflg):
    ## スプレッドシートを開く(名前から)
    ss = gc.open(filename)
    # シートを特定する(シート名で特定)
    st = ss.worksheet(sheetname)

    col_lastnum = len(df.columns) # DataFrameの列数
    row_lastnum = len(df.index)   # DataFrameの行数

    start_cell_col = re.sub(r'[\d]', '', start_cell)
    start_cell_row = int(re.sub(r'[\D]', '', start_cell))

    # アルファベットから数字を返すラムダ式(A列~Z列まで)
    # 例:A→1、Z→26
    alpha2num = lambda c: ord(c) - ord('A') + 1

    # 展開を開始するセルからA1セルの差分
    row_diff = start_cell_row-1
    col_diff = alpha2num(start_cell_col)-alpha2num('A')

    cell_list = st.range(start_cell+':'+toAlpha(col_lastnum+1+col_diff)+str(row_lastnum+1+row_diff))

    for cell in cell_list:
        if cell.col == 1+col_diff and cell.row == 1+row_diff:
            val = ''
        elif cell.col == 1+col_diff:
            val = df.index[cell.row-(2+row_diff)]
        elif cell.row == 1+row_diff:
            val = df.columns[cell.col-(2+col_diff)]
        else:
            val = df.iloc[cell.row-(2+row_diff)][cell.col-(2+col_diff)]

        cell.value = str(val)

    if Clearflg == 1:
        st.clear()

    st.update_cells(cell_list)

  def getstooq(codes,term,open,stop):

    #CodesがListでない場合、Listに変換
    if type(codes) is not list:
      codes = eval("['" + codes + "']")

    cnt = 0
    for code in codes:
      URL = "https://stooq.com/q/d/l/?s=" + code + "&d1=" + open + "&d2=" + stop + "&i=" + term

      response = requests.get(URL, stream=True)
      df = pd.read_csv(io.BytesIO(response.content),sep=",")

      # 複数がListにある場合、Closeのみを取得
      if len(codes) != 1:
        df = df[["Date","Close"]]
        #日付を日付型に変換
        df["Date"] = pd.to_datetime(df["Date"])
        # Dateをインデックスに変更
        df = df.set_index("Date")
        # ヘッダーをCodeに変更
        df = df.rename(columns = {'Close':code})
      else:
        #日付を日付型に変換
        df["Date"] = pd.to_datetime(df["Date"])
        # Dateをインデックスに変更
        df = df.set_index("Date")

      if cnt == 0:
        dfs = df
      else:
        dfs = pd.merge(dfs, df, how='outer', left_index=True, right_index=True)

      cnt =+1

    #欠損値を前のデータで保管
    dfs = dfs.fillna(method = 'ffill')

    return dfs

  # d 日
  # w 週
  # M 月
  # q 四半期
  # Y 年

  df = getstooq("btc.v","d",open.strftime('%Y%m%d'),stop.strftime('%Y%m%d'))
  #スプレッドに記述
  WriteSheets(df,'A1','暗号資産 取得用','BTC_D',1)

  df = getstooq("btc.v","m",open.strftime('%Y%m%d'),stop.strftime('%Y%m%d'))
  #スプレッドに記述
  WriteSheets(df,'A1','暗号資産 取得用','BTC_M',1)

  df = getstooq("btc.v","y",open.strftime('%Y%m%d'),stop.strftime('%Y%m%d'))
  #スプレッドに記述
  WriteSheets(df,'A1','暗号資産 取得用','BTC_Y',1)

  df = getstooq("eth.v","d",open.strftime('%Y%m%d'),stop.strftime('%Y%m%d'))
  #スプレッドに記述
  WriteSheets(df,'A1','暗号資産 取得用','ETH_D',1)

  df = getstooq("eth.v","m",open.strftime('%Y%m%d'),stop.strftime('%Y%m%d'))
  #スプレッドに記述
  WriteSheets(df,'A1','暗号資産 取得用','ETH_M',1)

  df = getstooq("XRP.v","d",open.strftime('%Y%m%d'),stop.strftime('%Y%m%d'))
  #スプレッドに記述
  WriteSheets(df,'A1','暗号資産 取得用','XRP_D',1)

  df = getstooq("XRP.v","m",open.strftime('%Y%m%d'),stop.strftime('%Y%m%d'))
  #スプレッドに記述
  WriteSheets(df,'A1','暗号資産 取得用','XRP_M',1)

except Exception:

  e = sys.exc_info()[1]
  print("エラー",e.args)

finally:

  # 実行時間を測るEnd
  print ("終了時間:{0}".format(time.strftime('%Y/%m/%d %H:%M:%S')) )
  elapsed_time = time.time() - start
  print ("処理時間:{0}".format(elapsed_time) + "[sec]")
目次

各プログラムの説明

googleスプレッドと連携

# 認証のためのコード
from google.colab import auth
auth.authenticate_user()

import gspread
from google.auth import default
creds, _ = default()
gc = gspread.authorize(creds)

fredで取得する期間

open = dt.date(1900,1,1)
stop = dt.date.today()

googleスプレッドシートの行のアルファベットを数値に変換

  def toAlpha(num):
    if num<=26:
        return chr(64+num)
    elif num%26==0:
        return toAlpha(num//26-1)+chr(90)
    else:
        return toAlpha(num//26)+chr(64+num%26)

FREDからデータ取得

  def getstooq(codes,term,open,stop):

    #CodesがListでない場合、Listに変換
    if type(codes) is not list:
      codes = eval("['" + codes + "']")

    cnt = 0
    for code in codes:
      URL = "https://stooq.com/q/d/l/?s=" + code + "&d1=" + open + "&d2=" + stop + "&i=" + term

      response = requests.get(URL, stream=True)
      df = pd.read_csv(io.BytesIO(response.content),sep=",")

      # 複数がListにある場合、Closeのみを取得
      if len(codes) != 1:
        df = df[["Date","Close"]]
        #日付を日付型に変換
        df["Date"] = pd.to_datetime(df["Date"])
        # Dateをインデックスに変更
        df = df.set_index("Date")
        # ヘッダーをCodeに変更
        df = df.rename(columns = {'Close':code})
      else:
        #日付を日付型に変換
        df["Date"] = pd.to_datetime(df["Date"])
        # Dateをインデックスに変更
        df = df.set_index("Date")

      if cnt == 0:
        dfs = df
      else:
        dfs = pd.merge(dfs, df, how='outer', left_index=True, right_index=True)

      cnt =+1

    #欠損値を前のデータで保管
    dfs = dfs.fillna(method = 'ffill')

    return dfs

googleスプレッドシートに記述

  def WriteSheets(df,start_cell,filename,sheetname,Clearflg):
    ## スプレッドシートを開く(名前から)
    ss = gc.open(filename)
    # シートを特定する(シート名で特定)
    st = ss.worksheet(sheetname)

    col_lastnum = len(df.columns) # DataFrameの列数
    row_lastnum = len(df.index)   # DataFrameの行数

    start_cell_col = re.sub(r'[\d]', '', start_cell)
    start_cell_row = int(re.sub(r'[\D]', '', start_cell))

    # アルファベットから数字を返すラムダ式(A列~Z列まで)
    # 例:A→1、Z→26
    alpha2num = lambda c: ord(c) - ord('A') + 1

    # 展開を開始するセルからA1セルの差分
    row_diff = start_cell_row-1
    col_diff = alpha2num(start_cell_col)-alpha2num('A')

    cell_list = st.range(start_cell+':'+toAlpha(col_lastnum+1+col_diff)+str(row_lastnum+1+row_diff))

    for cell in cell_list:
        if cell.col == 1+col_diff and cell.row == 1+row_diff:
            val = ''
        elif cell.col == 1+col_diff:
            val = df.index[cell.row-(2+row_diff)]
        elif cell.row == 1+row_diff:
            val = df.columns[cell.col-(2+col_diff)]
        else:
            val = df.iloc[cell.row-(2+row_diff)][cell.col-(2+col_diff)]

        cell.value = str(val)

    if Clearflg == 1:
        st.clear()

    st.update_cells(cell_list)

暗号資産を指定している箇所

  df = getstooq("btc.v","d",open.strftime('%Y%m%d'),stop.strftime('%Y%m%d'))
  #スプレッドに記述
  WriteSheets(df,'A1','暗号資産 取得用','BTC_D',1)

  df = getstooq("btc.v","m",open.strftime('%Y%m%d'),stop.strftime('%Y%m%d'))
  #スプレッドに記述
  WriteSheets(df,'A1','暗号資産 取得用','BTC_M',1)

  df = getstooq("btc.v","y",open.strftime('%Y%m%d'),stop.strftime('%Y%m%d'))
  #スプレッドに記述
  WriteSheets(df,'A1','暗号資産 取得用','BTC_Y',1)

  df = getstooq("eth.v","d",open.strftime('%Y%m%d'),stop.strftime('%Y%m%d'))
  #スプレッドに記述
  WriteSheets(df,'A1','暗号資産 取得用','ETH_D',1)

  df = getstooq("eth.v","m",open.strftime('%Y%m%d'),stop.strftime('%Y%m%d'))
  #スプレッドに記述
  WriteSheets(df,'A1','暗号資産 取得用','ETH_M',1)

  df = getstooq("XRP.v","d",open.strftime('%Y%m%d'),stop.strftime('%Y%m%d'))
  #スプレッドに記述
  WriteSheets(df,'A1','暗号資産 取得用','XRP_D',1)

  df = getstooq("XRP.v","m",open.strftime('%Y%m%d'),stop.strftime('%Y%m%d'))
  #スプレッドに記述
  WriteSheets(df,'A1','暗号資産 取得用','XRP_M',1)

プログラムで取得できる暗号資産

  • ビットコイン
  • イーサリアム
  • リップル

プログラミングを学びたいなら、テックジムへ!

テックジムは、2016年に設立された自習型・定額制プログラミングスクールです。全国に12校(2023年11月現在)を展開しており、プログラミング初心者から経験者まで、幅広い層の受講者がいます。

テックジムの特徴は、以下の3点

  • 自習型で、自分のペースで学習できる

テックジムでは、講師による授業は行われません。受講生は、専用の教材とカリキュラムに沿って、自習でプログラミングを学習します。そのため、自分のペースで学習を進めることができ、プログラミングに集中することができます。

  • 200時間でビジネスで使えるスキルを身につけることができる

テックジムのカリキュラムは、プログラミング初心者でも200時間でビジネスで使えるスキルを身につけることができるように設計されています。カリキュラムは、基礎から実践まで、段階的に学習できるようになっており、受講生は着実にスキルを向上させることができます。

  • 転職・就職サポートも充実している

テックジムでは、転職・就職サポートも充実しています。転職・就職活動に必要なスキルや知識を身につけるための講座や、転職・就職相談会など、受講生のニーズに合わせてサポートを受けることができます。

テックジムで学んだら、こんなことができるようになります!

  • 自分のオリジナルのWebサイトやアプリを作れる
  • データサイエンスやAIを使って、ビジネスに貢献できる
  • プログラミングスキルを活かして、転職や就職に成功できる

テックジムは、プログラミングを学習したい人にとって、まさに理想のスクール!

  • 自分のペースで、効率的にプログラミングを学びたい人
  • ビジネスで使えるスキルを身につけたい人
  • 転職や就職に成功したい人

そんな方に、テックジムをぜひおすすめします。

テックジムに入会して、プログラミングのスキルを身につけて、新しい世界を切り拓きませんか


この記事が気に入ったら
いいね または フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

真毅のアバター 真毅 自由人

趣味はカメラ、ランニング、読書。職業はシステムエンジニア。昔はリサーチハウスで企業調査、産業分析を行っていました。目標は投資で稼いでゆっくり生きる。資格はFP2級、証券アナリスト。投資対象は日本株、米国ETF、金、暗号資産、不動産。金融資産と実物資産の両輪で資産形成。

お知らせ

当サイトはリンクフリーです。リンクを貼る際の許可は必要ありません。

いい記事だと思ったらじゃんじゃんリンクしてください♪

なお、本文の引用・写真の利用は出典元URLを貼っていただければOKです。

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

目次