Files
2026-07-13 12:32:25 +08:00

1283 lines
37 KiB
PL/PgSQL

-- Downloaded from: https://github.com/iangow/pg_functions/blob/2351aca566c2d08b7cf996cd6467cfd150ce7c58/public.sql
--
-- PostgreSQL database dump
--
-- Dumped from database version 9.4beta1
-- Dumped by pg_dump version 9.4beta1
-- Started on 2014-07-18 09:14:39 EDT
SET statement_timeout = 0;
SET lock_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SET check_function_bodies = false;
SET client_min_messages = warning;
SET search_path = public, pg_catalog;
--
-- TOC entry 1105 (class 1247 OID 16490)
-- Name: fileinfo; Type: TYPE; Schema: public; Owner: igow
--
CREATE TYPE fileinfo AS (
filename text,
filesize bigint,
ctime abstime,
mtime abstime,
atime abstime
);
ALTER TYPE fileinfo OWNER TO igow;
--
-- TOC entry 1108 (class 1247 OID 16493)
-- Name: fog_stats; Type: TYPE; Schema: public; Owner: igow
--
CREATE TYPE fog_stats AS (
fog double precision,
num_words integer,
percent_complex double precision,
num_sentences integer
);
ALTER TYPE fog_stats OWNER TO igow;
--
-- TOC entry 1111 (class 1247 OID 16496)
-- Name: parsed_name; Type: TYPE; Schema: public; Owner: activism
--
CREATE TYPE parsed_name AS (
prefix text,
first_name text,
middle_initial text,
last_name text,
suffix text
);
ALTER TYPE parsed_name OWNER TO activism;
--
-- TOC entry 672 (class 1255 OID 16505)
-- Name: agrep(text, text); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION agrep(x text, y text) RETURNS integer
LANGUAGE plr
AS $$
agrep(x, y)
$$;
ALTER FUNCTION public.agrep(x text, y text) OWNER TO igow;
--
-- TOC entry 673 (class 1255 OID 16506)
-- Name: anyleast(anyarray); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION anyleast(VARIADIC anyarray) RETURNS anyelement
LANGUAGE sql
AS $_$
SELECT sum($1[i])
FROM generate_subscripts($1, 1) g(i)
WHERE $1[i] IS NOT NULL;
$_$;
ALTER FUNCTION public.anyleast(VARIADIC anyarray) OWNER TO igow;
--
-- TOC entry 674 (class 1255 OID 16507)
-- Name: array_diff(anyarray, anyarray); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION array_diff(anyarray, anyarray) RETURNS anyarray
LANGUAGE sql
AS $_$
SELECT array(SELECT x from unnest($1) AS x
WHERE x NOT IN (SELECT * FROM unnest($2)))
$_$;
ALTER FUNCTION public.array_diff(anyarray, anyarray) OWNER TO igow;
--
-- TOC entry 675 (class 1255 OID 16508)
-- Name: array_max(integer[]); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION array_max(an_array integer[]) RETURNS integer
LANGUAGE plpython2u
AS $$
if an_array is None:
return None
return max(an_array)
$$;
ALTER FUNCTION public.array_max(an_array integer[]) OWNER TO igow;
--
-- TOC entry 676 (class 1255 OID 16509)
-- Name: array_min(integer[]); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION array_min(an_array integer[]) RETURNS integer
LANGUAGE plpython2u
AS $$
if an_array is None:
return None
return min(an_array)
$$;
ALTER FUNCTION public.array_min(an_array integer[]) OWNER TO igow;
--
-- TOC entry 677 (class 1255 OID 16510)
-- Name: array_rem(anyarray, anyelement); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION array_rem(anyarray, anyelement) RETURNS anyarray
LANGUAGE sql
AS $_$ SELECT array(SELECT x from unnest($1) AS x where x <> $2)
$_$;
ALTER FUNCTION public.array_rem(anyarray, anyelement) OWNER TO igow;
--
-- TOC entry 678 (class 1255 OID 16511)
-- Name: bomonth(timestamp without time zone); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION bomonth(timestamp without time zone) RETURNS date
LANGUAGE sql IMMUTABLE STRICT
AS $_$
SELECT date_trunc('MONTH', $1)::date
$_$;
ALTER FUNCTION public.bomonth(timestamp without time zone) OWNER TO igow;
--
-- TOC entry 679 (class 1255 OID 16512)
-- Name: calc_evol(anyarray); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION calc_evol(data anyarray) RETURNS double precision
LANGUAGE plr
AS $$
parsed.data <- data
vol <- NA
len <- length(parsed.data)
return(max(data[,2]))
if (len >= 9) {
y <- parsed.data[,1]
x <- parsed.data[,2]
reg.data <- data.frame(y,x)
try ({
vol <- var(resid(lm(y ~ x, data=reg.data, na.action=na.exclude)))
}, silent=TRUE)
}
return(vol)
$$;
ALTER FUNCTION public.calc_evol(data anyarray) OWNER TO igow;
--
-- TOC entry 680 (class 1255 OID 16513)
-- Name: calc_evol(anyelement, anyelement); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION calc_evol(anyelement, anyelement) RETURNS anyarray
LANGUAGE plr WINDOW
AS $$
vol <- NA
if ( length(farg1) >= 9 && length(farg2)==length(farg1)) {
reg.data <- data.frame(y=farg1, x=farg2)
try ({
vol <- var(resid(lm(y ~ x, data=reg.data, na.action=na.exclude)))
}, silent=TRUE)
}
return(farg2)
$$;
ALTER FUNCTION public.calc_evol(anyelement, anyelement) OWNER TO igow;
--
-- TOC entry 681 (class 1255 OID 16514)
-- Name: calc_evol(character, integer); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION calc_evol(gvkey character, fyear integer) RETURNS double precision
LANGUAGE plr
AS $_$
vol <- NA
num.years <- 10L
min.year <- fyear - num.years + 1
sql <- paste("SELECT * FROM (SELECT eps, lag(eps) OVER w AS lag_eps ",
"FROM gtv.stuff WHERE gvkey='", gvkey, "' AND ",
"fyear >= ", min.year," AND fyear <= ", fyear,
" AND eps IS NOT NULL",
" WINDOW w AS (PARTITION BY gvkey ORDER BY fyear)) AS a ",
"WHERE eps IS NOT NULL AND lag_eps IS NOT NULL", sep="")
data <- pg.spi.exec(sql)
try({
if(dim(data)[1] >= 9) {
lm.EPS <- lm(eps ~ lag_eps, data=data, na.action=na.exclude)
vol <- var(lm.EPS$residuals)
}
}, silent=TRUE)
return(vol)
$_$;
ALTER FUNCTION public.calc_evol(gvkey character, fyear integer) OWNER TO igow;
--
-- TOC entry 683 (class 1255 OID 16515)
-- Name: clean_name(text); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION clean_name(name_orig text) RETURNS text
LANGUAGE plr IMMUTABLE STRICT
AS $_$
temp <- name_orig
temp <- gsub("(?i)(THE) $","",temp,perl=TRUE) # Remove the word (THE) near the end
temp <- gsub("(?i)^THE ","",temp,perl=TRUE) # Remove the word THE at the start
temp <- gsub("[-/]"," ",temp,perl=TRUE) # Replace hyphens and slashes with spaces
temp <- gsub("[\\.,]","",temp,perl=TRUE) # Remove periods and commas
temp <- gsub("\\s+\\/.*$","",temp,perl=TRUE) # Remove backslashes preceded by spaces
temp <- gsub("\\s{2,}+"," ",temp,perl=TRUE) # Replace multiple spaces with singles
temp <- toupper(temp) # Convert to upper case
return(temp)
$_$;
ALTER FUNCTION public.clean_name(name_orig text) OWNER TO postgres;
--
-- TOC entry 684 (class 1255 OID 16516)
-- Name: clean_name_sql(text); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION clean_name_sql(text) RETURNS text
LANGUAGE sql IMMUTABLE STRICT
AS $_$
SELECT regexp_replace(temp, E'[-/]',E' ') FROM
(SELECT regexp_replace($1, E'((?i)(THE) $|(?i)^THE)|[\\.,]|\\s+\\/.*$)',E'') AS temp) AS a
-- temp <- gsub("[-/]"," ",temp,perl=TRUE)
$_$;
ALTER FUNCTION public.clean_name_sql(text) OWNER TO postgres;
--
-- TOC entry 685 (class 1255 OID 16517)
-- Name: clean_proxy_names(text); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION clean_proxy_names(names text) RETURNS text
LANGUAGE plperl
AS $_X$
$temp = $_[0];
$temp =~ s/ {2,}/ /g;
$temp =~ s/,?\s+and\s+/\n/gi;
$temp =~ s/\s*\n\s*/;/g;
$temp =~ s/\s*\(*\d+[.)]*\s*//g;
$temp =~ s/,\s*$//;
return $temp;
$_X$;
ALTER FUNCTION public.clean_proxy_names(names text) OWNER TO igow;
--
-- TOC entry 750 (class 1255 OID 16518)
-- Name: clean_tickers(text); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION clean_tickers(ticker text) RETURNS text
LANGUAGE plperl
AS $_X$
# Remove any asterisks
$_[0] =~ s/\*//g;
# Remove trailing .A
$_[0] =~ s/\.A$//g;
return $_[0];
$_X$;
ALTER FUNCTION public.clean_tickers(ticker text) OWNER TO igow;
--
-- TOC entry 686 (class 1255 OID 16519)
-- Name: create_name_table(); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION create_name_table() RETURNS integer
LANGUAGE plr COST 1000000
AS $_$
# Establish a connection to a PostgreSQL database
library(RPostgreSQL)
drv <- dbDriver("PostgreSQL")
pgr <- dbConnect(drv, dbname = "crsp")
library(RPostgreSQL)
# A function to scrub company names of unnecessary details
cleanNames <- function(names) {
temp <- gsub("(?i)(THE) $","",names,perl=TRUE) # Remove the word (THE) near the end
temp <- gsub("(?i)^THE ","",temp,perl=TRUE) # Remove the word THE at the start
temp <- gsub("[-/]"," ",temp,perl=TRUE) # Replace hyphens and slashes with spaces
temp <- gsub("[\\.,]","",temp,perl=TRUE) # Remove periods and commas
temp <- gsub("\\s+\\/.*$","",temp,perl=TRUE) # Remove backslashes preceded by spaces
temp <- gsub("\\s{2,}+"," ",temp,perl=TRUE) # Replace multiple spaces with singles
temp <- toupper(temp) # Convert to upper case
temp
}
# Construct a table of company name-CIK pairs
# This is a surprisingly big set (422,123 on 2011-05-07)
name.ciks <-
dbGetQuery(pgr,"SELECT company_name, cik FROM filings.filings LIMIT 100")
# Clean up names to merge tables...
name.ciks$name_mod <- cleanNames(name.ciks$company_name)
rs <- dbWriteTable(pgr,"cleaned_names",
name.ciks, overwrite=TRUE, row.names=FALSE)
return(0)
$_$;
ALTER FUNCTION public.create_name_table() OWNER TO postgres;
--
-- TOC entry 687 (class 1255 OID 16520)
-- Name: cusip_to_permno(text); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION cusip_to_permno(text) RETURNS integer
LANGUAGE sql IMMUTABLE STRICT
AS $_$
SELECT DISTINCT PERMNO FROM crsp.stocknames WHERE cusip=$1;
$_$;
ALTER FUNCTION public.cusip_to_permno(text) OWNER TO igow;
--
-- TOC entry 688 (class 1255 OID 16521)
-- Name: date_quarter(date); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION date_quarter(date) RETURNS date
LANGUAGE sql IMMUTABLE STRICT
AS $_$
SELECT ((extract(year FROM $1)-1 ||'-12-31')::date +
interval '1 month' * (extract(quarter FROM $1)*3))::date
$_$;
ALTER FUNCTION public.date_quarter(date) OWNER TO igow;
--
-- TOC entry 689 (class 1255 OID 16522)
-- Name: direct_id(text); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION director_id(text) RETURNS integer
LANGUAGE sql
AS $_$
SELECT CASE WHEN $1 != ''
THEN regexp_replace($1, E'^.*\\.(\\d+)$', E'\\1')::integer
ELSE NULL END
$_$;
CREATE FUNCTION eomonth(date) RETURNS date
LANGUAGE sql IMMUTABLE STRICT
AS $_$
SELECT (date_trunc('MONTH', $1) + INTERVAL '1 month - 1 day')::date;
$_$;
CREATE FUNCTION eomonth(timestamp without time zone) RETURNS date
LANGUAGE sql IMMUTABLE STRICT
AS $_$
SELECT (date_trunc('MONTH', $1) + INTERVAL '1 month - 1 day')::date;
$_$;
CREATE FUNCTION equilar_id(text) RETURNS integer
LANGUAGE sql
AS $_$
SELECT regexp_replace($1, E'^(\\d+)\\..*$', E'\\1')::integer
$_$;
ALTER FUNCTION public.equilar_id(text) OWNER TO igow;
CREATE FUNCTION evol(double precision, double precision) RETURNS double precision
LANGUAGE plr WINDOW
AS $_$
vol <- NA
y <- farg1
x <- farg2
if (fnumrows==9) try (vol <- lm(y ~ x)$coefficients[2])
return(vol)
$_$;
CREATE FUNCTION extract_products(raw_list text[], participants text[]) RETURNS text[]
LANGUAGE plpython2u
AS $$
"Function to extract product names from text"
import re
raw_text = ' '.join(raw_list)
# gazetteers is a corpus containing place names
from nltk.corpus import gazetteers
# Find capitalized words that do not follow sentence-ending punctuation
regex = r'(?<![\.\?\!-])\s\b([A-Z][A-Za-z0-9]+)'
matches = list(set(re.findall(regex, raw_text)))
# A list of words that should excluded
exclude = ' '.join(participants).split() + gazetteers.words() + \
['EBITDA', 'EBIT', 'IT', 'Capex', 'CapEx', 'Board', 'IFRS', 'GAAP',
'EPS', 'Group', 'OpEx'] + ['January', 'February', 'March',
'April', 'June',
'July', 'August', 'September', 'October', 'November',
'December'] + ['North', 'East', 'West', 'South'] + \
['Europe', 'European', 'Asia', 'Asian', 'American', 'Africa', 'African'] + \
['Q1', 'Q2', 'Q3', 'Q4']
return [match for match in matches if match not in exclude]
$$;
CREATE FUNCTION extract_suffixes(text) RETURNS text[]
LANGUAGE plperl
AS $_X$
$temp = $_[0];
$suffix_list = '\(ret\.\)|Esq\.|C[PF]A|M\.?P\.?H\.?|M\.?D\.?|[SJ][Rr].?|IV|III?\.?|P[Hh]\.?D\.?';
$suffix_list .= '|M\.D\., Ph\.D\.';
$prefix_list = '(?:Prof\.|Mr\.|Mrs\.|Dr\.|Captain)';
$temp =~ /^-?($prefix_list)?(?:,|\s)?(.*?)(?:\s+|,)?($suffix_list)?,?$/;
$prefix = $1;
$name = $2;
$suffix = $3;
return [$prefix , $name , $suffix];
$$;
CREATE FUNCTION ff_alpha(double precision, double precision, double precision, double precision) RETURNS double precision
LANGUAGE plr WINDOW AS
$_$
alpha <- NA
try (alpha <- lm(farg1 ~ farg2 + farg3 + farg4)$coefficients[1])
return(alpha)
$_$;
CREATE FUNCTION fiscal_year(date) RETURNS integer
LANGUAGE sql IMMUTABLE STRICT
AS $_$
SELECT (extract(year from $1))::integer -
(extract(month from $1)::integer < 6)::integer;
$_$;
CREATE FUNCTION fix_cusip(cusip_orig text) RETURNS text
LANGUAGE plr IMMUTABLE STRICT
AS $$
# Remove spaces from CUSIPs
cusip <- gsub("\\s+","",cusip_orig)
# First fix CUSIPs with the letter "E" in them. These get interpreted by Excel
# as numbers, with "00101E20" being understood as 1.01E22 (or 1.01 * 10^22).
# We need to convert "1.01E22" back to "00101E20".
# 1234567
# This is achieved by removing the "." adjusting the 20 to 22 (adding
# back the number of characters between "." and "E").
if (grepl("[[Ee]\\+",cusip)) {
# Get some parameters to convert the defective CUSIP
point <- regexpr("\\.",cusip,perl=TRUE)[[1]] # Location of ".", 2 in the example
e <- regexpr("[Ee]",cusip,perl=TRUE)[[1]] # Location of "E", 5 in the example
exponent <- substr(cusip,e+2,nchar(cusip)) # Uncorrected exponent
exponent <- as.double(exponent) - (e-point-1) # Corrected exponent
# Combine everything to create a valid CUSIP
cusip.new <- paste(substr(cusip,1,point-1), substr(cusip,point+1,e-1),
"E",exponent,sep="")
} else {
cusip.new <- cusip # Seems the CUSIP is OK
}
# If leading zeros are needed
if (8-nchar(cusip.new)>0) {
# create a string of leading zeros...
leading.zeros <- paste(rep("0",8-nchar(cusip.new)),collapse="")
# ... and add them to the CUSIP
cusip.new <- paste(leading.zeros,cusip.new,sep="")
}
# Return the fixed CUSIP
cusip.new
$$;
CREATE FUNCTION fix_cusip9(cusip_orig text) RETURNS text
LANGUAGE plr IMMUTABLE STRICT
AS $$
# Remove spaces from CUSIPs
cusip <- gsub("\\s+","",cusip_orig)
# First fix CUSIPs with the letter "E" in them. These get interpreted by Excel
# as numbers, with "00101E20" being understood as 1.01E22 (or 1.01 * 10^22).
# We need to convert "1.01E22" back to "00101E20".
# 1234567
# This is achieved by removing the "." adjusting the 20 to 22 (adding
# back the number of characters between "." and "E").
if (grepl("[[Ee]\\+",cusip)) {
# Get some parameters to convert the defective CUSIP
point <- regexpr("\\.",cusip,perl=TRUE)[[1]] # Location of ".", 2 in the example
e <- regexpr("[Ee]",cusip,perl=TRUE)[[1]] # Location of "E", 5 in the example
exponent <- substr(cusip,e+2,nchar(cusip)) # Uncorrected exponent
exponent <- as.double(exponent) - (e-point-1) # Corrected exponent
# Combine everything to create a valid CUSIP
cusip.new <- paste(substr(cusip,1,point-1), substr(cusip,point+1,e-1),
"E",exponent,sep="")
} else {
cusip.new <- cusip # Seems the CUSIP is OK
}
# If leading zeros are needed
if (9-nchar(cusip.new)>0) {
# create a string of leading zeros...
leading.zeros <- paste(rep("0",9-nchar(cusip.new)),collapse="")
# ... and add them to the CUSIP
cusip.new <- paste(leading.zeros,cusip.new,sep="")
}
# Return the fixed CUSIP
cusip.new
$$;
CREATE OR REPLACE FUNCTION fog(text) RETURNS double precision
LANGUAGE plperl AS
$$
# Load Perl modules that calculate fog, etc.
use Lingua::EN::Fathom;
use Lingua::EN::Sentence qw( get_sentences add_acronyms );
my $text = new Lingua::EN::Fathom;
if (defined($_[0])) {
$text->analyse_block($_[0]);
return($text->fog);
}
$$;
ALTER FUNCTION public.fog(text) OWNER TO igow;
--
-- TOC entry 703 (class 1255 OID 16539)
-- Name: fog_data(text); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION fog_data(text) RETURNS fog_stats
LANGUAGE plperlu AS
$$
# Load Perl module that calculates fog, etc.
use Lingua::EN::Fathom;
use Lingua::EN::Sentence qw( get_sentences add_acronyms );
my $text = new Lingua::EN::Fathom;
if (defined($_[0])) {
$text->analyse_block($_[0]);
$fog = $text->fog;
$num_words = $text->num_words;
$percent_complex = $text->percent_complex_words;
$num_sentences = $text->num_sentences;
}
return {fog => $fog, num_words => $num_words, percent_complex => $percent_complex,
num_sentences => $num_sentences};
$;
CREATE FUNCTION intersection(anyarray, anyarray) RETURNS anyarray
LANGUAGE sql
AS $_$
SELECT ARRAY(
SELECT $1[i]
FROM generate_series( array_lower($1, 1), array_upper($1, 1) ) i
WHERE ARRAY[$1[i]] && $2
);
$_$;
CREATE FUNCTION kls_domains(raw_text text[]) RETURNS text[]
LANGUAGE plpython2u
AS $$
import unicodedata, re
from nltk.tokenize import wordpunct_tokenize
word_list = {
'market': ['market', 'marketplace', 'environment', 'segment', 'sector'],
'competition': ['market', 'marketplace', 'environment', 'customer', 'channel', 'value',
'first-mover', 'technology', 'alliance', 'partnership', 'venture',
'regulation', 'litigation'],
'industry_structure': ['industry', 'entrant', 'supplier', 'buyer', 'substitute',
'scale', 'product', 'brand', 'switching', 'capital', 'access', 'cost',
'rivalry', 'capacity', 'concentration', 'exit', 'barrier', 'price', 'profit',
'quality', 'input', 'volume', 'purchase', 'integration',
'power'],
'strategic_intent': ['strategy', 'strategic', 'value', 'sales', 'revenue',
'share', 'profit', 'profitability', 'product', 'service', 'lead',
'leader', 'quality', 'customer', 'buyer', 'growth', 'opportunity',
'risk', 'resource'],
'innovation_and_r_d': ['research and development', 'r&d', 'patent', 'discovery',
'license', 'licensing', 'regulation', 'regulatory', 'trial', 'monitor',
'innovate', 'innovation', 'competence'],
'mode_of_entry': ['entry', 'cost', 'business', 'complementary', 'green-field',
'venture', 'investment', 'capital', 'solution', 'price'],
'business_model': ['model', 'best', 'lowest', 'low', 'highest', 'high',
'supplier', 'distribution'],
'partnerships': ['partner', 'alliance', 'merger', 'acquisition', 'joint',
'venture', 'relationship', 'equity', 'asset'],
'leadership': ['leader', 'leadership', 'record', 'value', 'culture',
'responsibility', 'goal', 'objective'],
'management_quality': ['management', 'quality', 'best', 'proven',
'experience', 'teamwork'],
'governance': ['recruitment', 'development', 'governance', 'corporate',
'board', 'incentive', 'owner', 'ownership', 'compensation'],
'disclosure': ['disclosure', 'transparent', 'transparency', 'information',
'audit', 'auditing', 'oversight', 'assurance', 'regulation', 'mandate',
'mandated'],
'measures': ['up', 'down', 'better', 'worse', 'recover', 'advance',
'advancing', 'progress', 'progressing', 'expand', 'expanding', 'improve',
'improving', 'reduce', 'reducing', 'reduction', 'decline', 'declining',
'retain', 'retention', 'profit', 'profitability', 'feedback', 'scorecard',
'growth', 'growing', 'performance', 'projected', 'projections'],
'customer': ['customer', 'satisfaction', 'feedback', 'trust'],
'brand': ['brand', 'image', 'name', 'trademark', 'recognition', 'stretch',
'quality', 'awareness'],
'media': ['radio', 'television', 'newspaper', 'internet', 'promotion',
'media spend', 'announcements', 'release', 'media budget'],
'advertising': ['advertising', 'ad', 'direct', 'channel', 'advertising', 'spend',
'ad spend', 'advertising allocation', 'budget', 'ad budget'],
'corporate_image': ['corporate image', 'reputation', 'integrity', 'community',
'trust', 'trusted name', 'confidence', 'durability', 'strength', 'character'],
'financial_performance': ['gross', 'net', 'return on investment', 'return on sales',
'return on assets', 'return on equity', 'ROI', 'ROA', 'ROE', 'profit',
'earnings', 'margin', 'capital', 'debt', 'sales', 'EBITDA', 'ratings',
'leverage', 'valuation', 'cost of capital'],
'forecasting': ['forecast', 'forecasting', 'cash flow', 'prospectus', 'quarterly'],
'insider_stock_transactions': ['insider buy', 'insider sell'],
'regulation': ['regulation', 'federal', 'state', 'securities and exchange', 'commission',
'commerce', 'legislation', 'congress', 'law', 'legal', 'hearings',
'enacted', 'pending', 'sec', 'medicare', 'medicaid', 'FDA'],
'special_interest_groups': ['lobby', 'lobbyists', 'special', 'interest', 'expert',
'testimony', 'industry', 'watchdog', 'consumer rights', 'patient rights']
}
lower_text = ' '.join(raw_text).decode('utf8').lower()
domains = [(domain, term) for domain in ['industry_structure', 'competition', 'financial_performance',
'innovation_and_r_d', 'mode_of_entry', 'brand'] # word_list.keys()
for term in word_list[domain] if re.search(term, lower_text)]
return list(set(domains))
$$;
CREATE FUNCTION liwc_counts(the_text text) RETURNS json
LANGUAGE plpythonu
AS $_$
"""Function to return number of matches against a LIWC category in a text"""
if 're' in SD:
re = SD['re']
json = SD['json']
else:
import re, json
SD['re'] = re
SD['json'] = json
if SD.has_key("regex_list"):
regex_list = SD["regex_list"]
categories = SD["categories"]
else:
rv = plpy.execute("SELECT category FROM personality.word_list")
categories = [ (r["category"]) for r in rv]
# Implement Robin's suggestion to convert *s to regular expressions
# outside the loop. And a
plan = plpy.prepare("""
SELECT word_list
FROM personality.word_list
WHERE category = $1""", ["text"])
mod_word_list = {}
for cat in categories:
rows = list(plpy.cursor(plan, [cat]))
word_list = rows[0]['word_list']
mod_word_list[cat] = [re.sub('\*(?:\s*$)?', '[a-z]*', word.lower())
for word in word_list]
# Pre-compile regular expressions.
regex_list = {}
for key in mod_word_list.keys():
regex = '\\b(?:' + '|'.join(mod_word_list[key]) + ')\\b'
regex_list[key] = re.compile(regex)
SD["regex_list"] = regex_list
SD["categories"] = categories
# rest of function
# Construct a counter of the words and return as JSON
text = re.sub(u'\u2019', "'", the_text).lower()
the_dict = {cat: len(re.findall(regex_list[cat], text)) for cat in categories}
return json.dumps(the_dict)
$_$;
CREATE FUNCTION ordered_set(the_list integer[]) RETURNS integer[]
LANGUAGE plpython2u
AS $$
ordered_set = []
for x in the_list:
if x not in ordered_set:
ordered_set.append(x)
return ordered_set
$$;
CREATE FUNCTION ordered_set(the_list text[]) RETURNS text[]
LANGUAGE plpython2u
AS $$
ordered_set = []
for x in the_list:
if x not in ordered_set:
ordered_set.append(x)
return ordered_set
$$;
CREATE FUNCTION plr_array_accum(double precision[], double precision[]) RETURNS double precision[]
LANGUAGE c
AS '$libdir/plr', 'plr_array_accum';
ALTER FUNCTION public.plr_array_accum(double precision[], double precision[]) OWNER TO igow;
CREATE FUNCTION plr_array_accum(text[], text) RETURNS text[]
LANGUAGE c
AS '$libdir/plr', 'plr_array_accum';
ALTER FUNCTION public.plr_array_accum(text[], text) OWNER TO igow;
CREATE FUNCTION plr_array_accum_float(double precision[], double precision[]) RETURNS double precision[]
LANGUAGE c
AS '$libdir/plr', 'plr_array_accum';
ALTER FUNCTION public.plr_array_accum_float(double precision[], double precision[]) OWNER TO igow;
--
-- TOC entry 713 (class 1255 OID 16554)
-- Name: plr_array_accum_float(text[], double precision[]); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION plr_array_accum_float(text[], double precision[]) RETURNS text[]
LANGUAGE c
AS '$libdir/plr', 'plr_array_accum';
ALTER FUNCTION public.plr_array_accum_float(text[], double precision[]) OWNER TO igow;
--
-- TOC entry 714 (class 1255 OID 16555)
-- Name: plr_array_accum_float(text[], text); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION plr_array_accum_float(text[], text) RETURNS text[]
LANGUAGE c
AS '$libdir/plr', 'plr_array_accum';
ALTER FUNCTION public.plr_array_accum_float(text[], text) OWNER TO igow;
--
-- TOC entry 715 (class 1255 OID 16556)
-- Name: pos_tag(text); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION pos_tag(string text) RETURNS text[]
LANGUAGE plpython2u AS
$$
import nltk
return [nltk.pos_tag(nltk.word_tokenize(sentence))
for sentence in nltk.sent_tokenize(string)]
$$;
CREATE FUNCTION prep_gtv(text) RETURNS text
LANGUAGE plr
AS $$
gtv <<- pg.spi.prepare(arg1, c(20, 18));
print("OK")
$$;
ALTER FUNCTION public.prep_gtv(text) OWNER TO igow;
--
-- TOC entry 717 (class 1255 OID 16558)
-- Name: quarters_between(date, date); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION quarters_between(date, date) RETURNS integer
LANGUAGE sql IMMUTABLE STRICT
AS $_$
SELECT quarters_of($1) - quarters_of($2)
$_$;
ALTER FUNCTION public.quarters_between(date, date) OWNER TO igow;
--
-- TOC entry 718 (class 1255 OID 16559)
-- Name: quarters_of(date); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION quarters_of(date) RETURNS integer
LANGUAGE sql IMMUTABLE STRICT
AS $_$
SELECT extract(years FROM $1)::int * 4 + extract(quarter FROM $1)::int
$_$;
ALTER FUNCTION public.quarters_of(date) OWNER TO igow;
--
-- TOC entry 719 (class 1255 OID 16560)
-- Name: r_median(double precision[]); Type: FUNCTION; Schema: public; Owner: postgres
--
CREATE FUNCTION r_median(double precision[]) RETURNS double precision
LANGUAGE plr
AS $$
median(arg1)
$$;
ALTER FUNCTION public.r_median(double precision[]) OWNER TO postgres;
--
-- TOC entry 720 (class 1255 OID 16561)
-- Name: r_median_window(double precision); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION r_median_window(double precision) RETURNS double precision
LANGUAGE plr WINDOW
AS $$
median(farg1)
$$;
ALTER FUNCTION public.r_median_window(double precision) OWNER TO igow;
--
-- TOC entry 721 (class 1255 OID 16562)
-- Name: r_quantile(double precision[], double precision); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION r_quantile(double precision[], double precision) RETURNS double precision
LANGUAGE plr STRICT
AS $$quantile(arg1, arg2, na.rm=TRUE)$$;
ALTER FUNCTION public.r_quantile(double precision[], double precision) OWNER TO igow;
--
-- TOC entry 722 (class 1255 OID 16563)
-- Name: r_quintile_rank(double precision[]); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION r_quintile_rank(data double precision[]) RETURNS double precision[]
LANGUAGE plr
AS $$
as.integer(cut(data,as.vector(quantile(data,probs=seq(0,1,length.out=6),na.rm=TRUE)), include.lowest=TRUE))
$$;
ALTER FUNCTION public.r_quintile_rank(data double precision[]) OWNER TO igow;
--
-- TOC entry 723 (class 1255 OID 16564)
-- Name: r_quintile_rank(numeric); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION r_quintile_rank(data numeric) RETURNS double precision[]
LANGUAGE plr
AS $$
as.integer(cut(data,quantile(data,probs=seq(0,1,length.out=5),na.rm=TRUE)))
$$;
ALTER FUNCTION public.r_quintile_rank(data numeric) OWNER TO igow;
--
-- TOC entry 724 (class 1255 OID 16565)
-- Name: r_regr_slope(double precision, double precision); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION r_regr_slope(double precision, double precision) RETURNS double precision
LANGUAGE plr WINDOW
AS $_$
slope <- NA
y <- farg1
x <- farg2
try (slope <- lm(y ~ x)$coefficients[2])
return(slope)
$_$;
ALTER FUNCTION public.r_regr_slope(double precision, double precision) OWNER TO igow;
--
-- TOC entry 725 (class 1255 OID 16566)
-- Name: r_sum(double precision[]); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION r_sum(x double precision[]) RETURNS double precision
LANGUAGE plr
AS $$
sum(x, na.rm=TRUE)
$$;
ALTER FUNCTION public.r_sum(x double precision[]) OWNER TO igow;
--
-- TOC entry 726 (class 1255 OID 16567)
-- Name: rel_freq(double precision); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION rel_freq(double precision) RETURNS double precision
LANGUAGE plr WINDOW
AS $$
var <- as.vector(farg1)
return((var/sum(var ))[prownum])
$$;
ALTER FUNCTION public.rel_freq(double precision) OWNER TO igow;
--
-- TOC entry 733 (class 1255 OID 16568)
-- Name: remove_trailing_q(text); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION remove_trailing_q(ticker text) RETURNS text
LANGUAGE plperl
AS $_X$
# Remove trailing Qs
$_[0] =~ s/Q$//g;
return $_[0];
$_X$;
ALTER FUNCTION public.remove_trailing_q(ticker text) OWNER TO igow;
--
-- TOC entry 727 (class 1255 OID 16569)
-- Name: row_sum(anyarray); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION row_sum(VARIADIC anyarray) RETURNS double precision
LANGUAGE sql
AS $_$
SELECT r_sum(ARRAY[$1])
$_$;
ALTER FUNCTION public.row_sum(VARIADIC anyarray) OWNER TO igow;
--
-- TOC entry 728 (class 1255 OID 16570)
-- Name: row_sum_alt(double precision[]); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION row_sum_alt(VARIADIC x double precision[]) RETURNS double precision
LANGUAGE plr
AS $$
sum(x, na.rm=TRUE)
$$;
ALTER FUNCTION public.row_sum_alt(VARIADIC x double precision[]) OWNER TO igow;
--
-- TOC entry 732 (class 1255 OID 16571)
-- Name: sent_count(text); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION sent_count(raw text) RETURNS integer
LANGUAGE plpythonu
AS $$
"""Function to count the number of sentences in a passage."""
import nltk, sys
if (sys.version_info.major==2):
text= raw.decode('utf-8')
sent_tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')
sents = sent_tokenizer.tokenize(text)
return len(sents)
$$;
ALTER FUNCTION public.sent_count(raw text) OWNER TO igow;
--
-- TOC entry 729 (class 1255 OID 16572)
-- Name: table_file_info(text, text); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION table_file_info(schemaname text, tablename text) RETURNS SETOF fileinfo
LANGUAGE plpythonu
AS $_$
import datetime, glob, os
db_info = plpy.execute("""
SELECT datname AS database_name,
current_setting('data_directory') || '/base/' || db.oid AS data_directory
FROM pg_database db
WHERE datname= current_database()""")
table_info_plan = plpy.prepare("""
SELECT nspname AS schemaname,
relname AS tablename,
relfilenode AS filename
FROM pg_class c
JOIN pg_namespace ns
ON c.relnamespace=ns.oid
WHERE nspname=$1 AND relname =$2;""", ['text', 'text'])
table_info = plpy.execute(table_info_plan, [schemaname, tablename])
filemask = '%s/%s*' % (db_info[0]['data_directory'], table_info[0]['filename'])
res = []
for filename in glob.glob(filemask):
fstat = os.stat(filename)
res.append((
filename,
fstat.st_size,
datetime.datetime.fromtimestamp(fstat.st_ctime).isoformat(),
datetime.datetime.fromtimestamp(fstat.st_mtime).isoformat(),
datetime.datetime.fromtimestamp(fstat.st_atime).isoformat()
))
return res
$_$;
ALTER FUNCTION public.table_file_info(schemaname text, tablename text) OWNER TO igow;
--
-- TOC entry 730 (class 1255 OID 16573)
-- Name: test_spi_execp(text, text, text); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION test_spi_execp(text, text, text) RETURNS SETOF record
LANGUAGE plr
AS $$
pg.spi.execp(pg.reval(arg1), list(arg2,arg3))
$$;
ALTER FUNCTION public.test_spi_execp(text, text, text) OWNER TO igow;
--
-- TOC entry 731 (class 1255 OID 16574)
-- Name: test_spi_prep(text); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION test_spi_prep(text) RETURNS text
LANGUAGE plr
AS $$
sp <<- pg.spi.prepare(arg1, c(NAMEOID, NAMEOID));
print("OK")
$$;
ALTER FUNCTION public.test_spi_prep(text) OWNER TO igow;
--
-- TOC entry 734 (class 1255 OID 16575)
-- Name: tone_count(text); Type: FUNCTION; Schema: public; Owner: igow
--
CREATE FUNCTION tone_count(the_text text) RETURNS json
LANGUAGE plpythonu
AS $_$
if 're' in SD:
re = SD['re']
json = SD['json']
else:
import re, json
SD['re'] = re
SD['json'] = json
if SD.has_key("regex_list"):
regex_list = SD["regex_list"]
categories = SD["categories"]
else:
rv = plpy.execute("SELECT category FROM bgt.lm_tone")
categories = [ (r["category"]) for r in rv]
# Implement Robin's suggestion to convert *s to regular expressions
# outside the loop. And a
plan = plpy.prepare("""
SELECT word_list
FROM bgt.lm_tone
WHERE category = $1""", ["text"])
mod_word_list = {}
for cat in categories:
rows = list(plpy.cursor(plan, [cat]))
word_list = rows[0]['word_list']
mod_word_list[cat] = [word.lower() for word in word_list]
# Pre-compile regular expressions.
regex_list = {}
for key in mod_word_list.keys():
regex = '\\b(?:' + '|'.join(mod_word_list[key]) + ')\\b'
regex_list[key] = re.compile(regex)
SD["regex_list"] = regex_list
SD["categories"] = categories
# rest of function
"""Function to return number of matches against a LIWC category in a text"""
text = re.sub(u'\u2019', "'", the_text).lower()
the_dict = {category: len(re.findall(regex_list[category], text)) for category in categories}
return json.dumps(the_dict)
$_$;
CREATE FUNCTION var_resid(double precision, double precision) RETURNS double precision
LANGUAGE plr WINDOW
AS $$
var_resid <- NA
try (var_resid <- var(resid(lm(farg1 ~ farg2))))
return(var_resid)
$$;
CREATE FUNCTION winsorize(double precision, double precision) RETURNS double precision
LANGUAGE plr WINDOW
AS $$
library(psych)
return(winsor(as.vector(farg1), arg2)[prownum])
# return(farg1)
$$;
CREATE FUNCTION word_count(raw text) RETURNS integer
LANGUAGE plpythonu
AS $$
"""Function to count the number of words in a passage."""
import nltk, sys
if (sys.version_info.major==2):
text = raw.decode('utf-8')
tokens = nltk.word_tokenize(text)
return len(tokens)
$$;
CREATE FUNCTION word_tokenize_r(raw_text text) RETURNS text[]
LANGUAGE plr
AS $$
require('RWeka')
words <- WordTokenizer(raw_text)
return(words)
$$;
CREATE AGGREGATE array_accum(anyelement) (
SFUNC = array_append,
STYPE = anyarray,
INITCOND = '{}'
);
CREATE AGGREGATE evol_new(anyarray) (
SFUNC = array_cat,
STYPE = anyarray,
INITCOND = '{{NULL,NULL}}',
FINALFUNC = public.calc_evol
);
CREATE AGGREGATE median(double precision) (
SFUNC = public.plr_array_accum,
STYPE = double precision[],
FINALFUNC = r_median
);
ALTER AGGREGATE public.median(double precision) OWNER TO postgres;
--
-- TOC entry 2287 (class 1255 OID 16588)
-- Name: product(double precision); Type: AGGREGATE; Schema: public; Owner: igow
--
CREATE AGGREGATE product(double precision) (
SFUNC = float8mul,
STYPE = double precision
);
ALTER AGGREGATE public.product(double precision) OWNER TO igow;
--
-- TOC entry 2288 (class 1255 OID 16589)
-- Name: quintile_rank(double precision); Type: AGGREGATE; Schema: public; Owner: igow
--
CREATE AGGREGATE quintile_rank(double precision) (
SFUNC = public.plr_array_accum,
STYPE = double precision[],
FINALFUNC = public.r_quintile_rank
);
GRANT USAGE ON SCHEMA public TO crsp_basic;
-- Completed on 2014-07-18 09:14:40 EDT
--
-- PostgreSQL database dump complete
--