Packages

SEC Cik-Ticker Mapper SecCikTickerMapper.Getter.ticker(CIK) returns a ticker symbol SecCikTickerMapper.Getter.cik(Ticker) returns a cik

Current section

Files

Jump to
Raw

priv/seeds.exs

defmodule SecCikTickerMapper.Seeder do
alias SecCikTickerMapper.Repo
alias SecCikTickerMapper.Company
alias SecCikTickerMapper.Ticker
alias SecCikTickerMapper.CompanyTicker
def seed! do
"priv/data/cik-ticker-2.csv"
|> read_csv_file_and_return_maps
|> Enum.each(fn(x) -> generate(x) end)
end
defp read_csv_file_and_return_maps(filename) do
File.read!(filename)
|> String.split("\n")
|> tl
|> Enum.map(fn(x) -> extract_cik_ticker(x) end)
end
defp extract_cik_ticker(cik_comma_symbol) do
pair = cik_comma_symbol |> String.split(",")
cik = pair |> hd |> String.rjust(10, ?0)
symbol = List.last(pair)
%{cik: cik, symbol: symbol}
end
defp create_or_update_company(cik) do
company = Repo.get_by(Company, cik: cik)
if company do
IO.puts "Company with cik: #{cik} already exists!"
else
company = create_company(cik)
IO.puts "Created Company with cik: #{cik}"
end
company
end
defp create_company(cik) do
company = %Company{cik: cik} |> Repo.insert!
end
defp create_or_update_ticker(symbol) do
ticker = Repo.get_by(Ticker, symbol: symbol)
if ticker do
IO.puts "Ticker with symbol: #{symbol} already exists!"
else
ticker = create_ticker(symbol)
IO.puts "Created Ticker with symbol: #{symbol}"
end
ticker
end
defp create_ticker(symbol) do
ticker = %Ticker{symbol: symbol} |> Repo.insert!
end
defp create_or_update_company_ticker(company, ticker) do
company_ticker = Repo.get_by(CompanyTicker, company_id: company.id, ticker_id: ticker.id)
if company_ticker do
IO.puts "CompanyTicker #{company.id}, #{ticker.id} already exists!"
else
company_ticker = create_company_ticker(company, ticker)
IO.puts "Created CompanyTicker #{company.id}, #{ticker.id}"
end
company_ticker
end
defp create_company_ticker(company, ticker) do
company_ticker = %CompanyTicker{company_id: company.id, ticker_id: ticker.id} |> Repo.insert!
end
defp generate(attrs) do
company = create_or_update_company(attrs.cik)
ticker = create_or_update_ticker(attrs.symbol)
create_or_update_company_ticker(company, ticker)
end
end
defmodule SecCikTickerMapper.FindAndMatchLatestCompany do
@doc """
This code in seed! below does the following:
1. go down each of the tickers
2. if there is no current_company_id (it's nil), then check how
many company_tickers there are for that one
3. if there is one, then give it that company_id's cik
4. if there is more than one, then give it the company_id based on the biggest cik
"""
alias SecCikTickerMapper.Repo
alias SecCikTickerMapper.Company
alias SecCikTickerMapper.Ticker
alias SecCikTickerMapper.CompanyTicker
import Ecto.Query
def run! do
tickers = Repo.all(Ticker)
tickers
|> Enum.each(
fn(ticker) ->
if ticker.current_company_id == nil do
cts = Repo.all(from ct in CompanyTicker, where: ct.ticker_id ==^ticker.id)
ct_count = cts |> length
if ct_count == 1 do
ct = cts |> hd
IO.puts "Seeding Single-owned Ticker: #{ticker.symbol} with current_company_id: #{ct.company_id}"
Ecto.Changeset.change(ticker, %{current_company_id: ct.company_id})
|> Repo.update!
else
ct = cts |> Enum.map(fn(ct) -> %{company_id: ct.company_id, ticker_id: ct.ticker_id, cik: Repo.get(Company, ct.company_id).cik} end)
|> Enum.max_by(fn(x) -> x.cik end)
IO.puts "Seeding Multiple-owned Ticker: #{ticker.symbol} with current_company_id: #{ct.company_id}"
Ecto.Changeset.change(ticker, %{current_company_id: ct.company_id})
|> Repo.update!
end
end
end)
end
end
SecCikTickerMapper.Seeder.seed!
SecCikTickerMapper.FindAndMatchLatestCompany.run!